Opprette en WEB-adressekatalog PHP + LDAP

Det hadde seg slik at en (relativt) stor kampanje hadde mange eksterne kontorer med et anstendig antall brukere. Alle kontorer er koblet til ett nettverk med et felles domene, hvert kontor ble definert i Active Directory (heretter kalt AD) som en organisasjonsenhet (OU), der brukere allerede var opprettet.

Det var nødvendig å gi brukerne muligheten til raskt og enkelt å få kontaktinformasjonen til den nødvendige ansatte fra AD, og ​​frigjøre systemadministratorer fra rutinen med å redigere en tekstfil som spilte rollen som en adressebok.

Det var ingen ferdige passende alternativer for å løse problemet, så jeg måtte gjøre alt med mine egne hender og hode.

La oss starte med det faktum at først må du bestemme deg for hva du skal bruke, det er enkelt - den endelige katalogen skal være tilgjengelig for alle brukere av domenet via en nettleser. Det første du tenker på er PHP i forbindelse med ldap, og vi vil bruke dem. Jeg anser at den store fordelen med å bruke PHP er dens relative enkelhet - enhver systemadministrator med selv en liten forståelse vil være i stand til å gjøre de nødvendige endringene i koden, om nødvendig, uten særlig belastning.

Så la oss begynne. Først, la oss angi parameterne for å koble til domenet:

$srv ="SERVER";
$srv_domain ="DOMAIN.COM";
$srv_login ="USERNAME@".$srv_domain; 
$srv_password ="PASSWORD";

Neste punkt er å bestemme i hvilken OU vi skal søke etter brukere. Vi vil gjøre dette ved å avskjære verdier fra $_GET['sted']. For eksempel hvis brukeren går til adressen server/index.php?place=først, deretter variabelen $sted vil bli tildelt en verdi først.

$place = (@$_GET['place']);
$doscript=true;
switch($place){ 
case "first" :
	$dn ="OU=ou1,OU=DOMAIN,dc=DOMAIN,dc=COM";			
	break;
case "second":
	$dn ="OU=ou2,OU=DOMAIN,dc=DOMAIN,dc=COM";			
	break;
	//здесь можно добавить ещё условий.
default:
	$doscript=false; 
	break;
}
if (!$doscript) include "main_table.html";

variabel $doscript er nødvendig for å lagre verdien - enten vi har definert OUen der vi skal søke etter brukere eller ikke. Hvis det ikke er noen treff oppført i "switch-case", så $doscript=false, vil hoveddelen av skriptet ikke bli utført, og startsiden "main_table.html" vil vises (jeg skal fortelle deg om det helt til slutt).

Hvis vi har definert en OU, går vi videre til ytterligere handlinger: vi begynner å tegne en katalogside for brukeren:

else if ($doscript) {
{echo "
<!DOCTYPE html> 
<html xmlns='http://www.w3.org/1999/xhtml'>
<head>
<link rel='shortcut icon' href='ico.png'>
<meta charset='windows-1251/ '>

Vi inkluderer stiler for et mer behagelig utseende (ja, de kan inkluderes som en css-fil, men noen versjoner av IE ønsker ikke å godta stiler satt på denne måten, så du må skrive dem direkte inn i skriptet):

<style>
	*{text-align: center; font-family:tahoma; font-size:14px;}
	a{text-decoration: none; color: #000;}
	a:hover{text-decoration: underline; color: #0059FF;}
	#bold{text-decoration: none; font-weight: 600;font-size:20px;}
	#table,tr,td{border-style:solid;border-width:1px;	border-collapse:collapse;padding:5px; height:22px;border-color:#7d7d7d;}
	/* Нечетные строки */#table tbody tr:nth-child(odd){background: #fff;}
	/* Четные строки */   #table tbody tr:nth-child(even){background: #F7F7F7;}	
	#noborder{border-width: 0 px; border-style: none;}	
	#sp30px{text-indent: 30px;text-align: justify;}
	#smallsize{font-family:tahoma; text-indent: 5px; text-align:left; font-size:12px;}
	#top {background: #ffffff;
		text-align: center;
		left:0;
		top:0px;
		table-layout: fixed;
		border-style:solid;
		border-width:0px;
		border-collapse:collapse;
		padding:0px;
		height:22px;
		border: 0px;
		z-index: 99999;
		display:block;
		width:80px;
		opacity: 0.6;
		filter: alpha(Opacity=60);
		height:100%;
		position:fixed;}
	#top:hover{background: #afafaf;opacity: 100;filter: alpha(Opacity=100);text-decoration: none;color: #000000;}
	.smalltext{padding-top: 1px;
		padding-bottom: 1px;
		text-align: bottom;
		font-family:tahoma;
		color: #a0a0a0;
		line-height: 7px;
		font-size: 10px;}
	.smalltext:hover{color: #0000ff;}		
	.transition-rotate {position: relative;
		z-index: 2;
		margin: 0 auto;
		padding: 5px;
		text-align: center;
		max-width: 500px;
		cursor: pointer;
		transition: 0.1s linear;}
	.transition-rotate:hover {-webkit-transform: rotate(-2deg);	transform: rotate(-2deg);}
	#lineheight{
		text-align: left;
		line-height: 1px;
		text-decoration: none;
		font-weight: 600;
		font-size:20px;}
</style>

Vi er ferdige med stilene, nå skriver vi tittelen på fanen og tegner en praktisk lenke for å gå tilbake til hovedsiden:

<title>Adressbook of «YourMegaCompanyName»</title>	
</head>
<body style='background-color:#ffffff;'>";
}
echo "
<table id='top'><tr><td id='top'>
<a href='index.php?place=main' id='top' >
<br><br><br>
<img src='back_to_main.png' alt='' border='0' width='75' height='60'/>
<p>На главную</p></a>
</td></tr></table>
";

Vi definerer søkefiltre etter AD og får data om OU:

$filter ="(&(objectcategory=user)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))"; //все пользователи, кроме отключенных.
$filter2 ="(objectCategory=OrganizationalUnit)"; // для получения информации о OU
$ds=ldap_connect($srv);   
if ($ds) { 
    $r=ldap_bind($ds,$srv_login,$srv_password);;     
	ldap_set_option($ds,LDAP_OPT_REFERRALS, 0);
	ldap_set_option($ds,LDAP_OPT_PROTOCOL_VERSION,3);
	$sr=ldap_search($ds,$dn ,$filter );   
    ldap_sort($ds,$sr, "givenname");
    $info = ldap_get_entries($ds, $sr); 
    $sr2=ldap_search($ds,$dn ,$filter2 );   
    $placeinfo = ldap_get_entries($ds, $sr2); 
$PlaceName = $placeinfo[0]["l"][0];  			// name of place
$PlaceAddres = $placeinfo[0]["street"][0];		// address of place
$PlaceMail = $placeinfo[0]["description"][0]; 	// mail of place
$PlacePhone = $placeinfo[0]["st"][0]; 		// phone of plase

Deretter designer vi toppen av siden:

echo"<table align='center' height = '80'>
	<td id='noborder' ><div id='lineheight'>". $PlaceName ."</div></td></tr>
	<tr><td id='noborder' >". $PlaceAddres ."</td></tr>
    </table>
<table align='center' id='table'>
	<tr><td width='35' bgcolor = #f0f0e4>  № </td>
	<td width='300' bgcolor = #f0f0e4> Name </td>
	<td width='250' bgcolor = #f0f0e4> E-mail </td>
	<td width='60' bgcolor = #f0f0e4> Phone </td>
	<td width='150' bgcolor = #f0f0e4> Mobile </td></tr>
	<tr><td></td><td> Данные OU </td><td>";
echo "<div class='transition-rotate'><a href=mailto:" . $PlaceMail .">" . $PlaceMail ." </a></div>";
echo "</td><td width='150'> " . $PlacePhone ." </td><td> - </td></tr>";

Deretter mottar og behandler vi brukerdata i en løkke, mens for å skjule noen (for eksempel tjeneste) kontoer, skriver vi ganske enkelt "skjul" i "rom"-feltet i brukerdetaljene i AD, slike brukere vil ikke bli vist i katalogen:

for ($i=0; $i<$info["count"];$i++) { 
$UserHide = $info[$i]["physicaldeliveryofficename"][0];
if ($UserHide != 'hide') {
$UserName = $info[$i]["cn"][0];                //Имя пользователя
$UserPosition = $info[$i]["title"][0]; 		// Должность
$UserMail = $info[$i]["mail"][0];			//mail
if (!$UserMail)) $UserMail = "-";                  //если нет данных о ящике в AD, то отображаем прочерк
$UserIpPhone = $info[$i]["ipphone"][0];		//ip phone
	if (!$UserIpPhone) $UserIpPhone = "-";    //если нет данных о ящике в AD, то отображаем прочерк
$UserMobile = $info[$i]["mobile"][0];		//mobile
	if (!$UserMobile) $UserMobile = "-";     //если нет данных о ящике в AD, то отображаем прочерк

Forresten, hvis du trenger å få verdien av et annet attributt, så husk (dette er viktig):
i forespørselen sender vi attributtnavnet små bokstaver bokstaver, ellers vil det ikke fungere.

Og sett inn de mottatte dataene i tabellen:

    echo "<tr>
	<td>". $n+=1 ."</td>
	<td> ". $UserName ."<br> <div class='smalltext'>". $UserPosition ."</div></td><td>"; //	Имя пользователя и должность 
	if ($UserMail !='-') echo "<div class='transition-rotate'><a href=mailto:'$UserMail'>$UserMail  </a></div>";    // если у пользователя есть e-mail создаём ссылку на отправку письма
	else echo "-"; //если нет e-mail - ставим прочерк.
 	echo "<td> ". $UserIpPhone ." </td>
 	<td> ". $UserMobile ." </td></tr>";
	}
}
echo "</table>";

Deretter lukker vi ldap-tilkoblingen, eller viser en melding om umuligheten av å koble til serveren:

ldap_close($ds); 
} 
else echo "<h4>Unable to connect to LDAP server</h4>"; 
echo '<br><br><br></body></html>';}

Filen "main_table.html" fra innsiden er en enkel html-side med lenker, og ser omtrent slik ut:

<head>
<link rel="shortcut icon" href="ico.png"/>
<meta charset="windows-1251"/>
<title>Adressbook of «YourMegaCompanyName»</title>
</head>
<body style='background-color:#ffffff;'>
<center><a href=index.php><IMG border="none" src="logo.png"/></a></center>
<center><b>Places and offices</b></center>
<br>
<table border="0" width="450" bgcolor="#dddddd" align="center" valign="middle" CELLSPACING="0">

<tr id="space"><td></td></tr>
<tr><td align="left" id="abz"><a href="index.php?place=ou1">OU1</a></td></tr>
<tr id="space"><td></td></tr>
<tr><td align="left" id="abz"><a href="index.php?place=ou2">OU2</a></td></tr>

</table></body></html>

Hvis koden min hjelper noen, vil jeg være glad, bruk den!

Du kan også fritt redigere det som du ønsker (forbedre/verre) og distribuere det på alle måter.

Takk for din oppmerksomhet!

Kilde: www.habr.com

Legg til en kommentar