Een WEB-adresmap aanmaken PHP + LDAP

Het gebeurde zo dat een (relatief) grote campagne veel externe kantoren kende met een behoorlijk aantal gebruikers. Alle kantoren zijn verbonden in één netwerk met een gemeenschappelijk domein, elk kantoor werd in Active Directory (hierna AD genoemd) gedefinieerd als een Organization Unit (OU), waarin al gebruikers waren aangemaakt.

Het was noodzakelijk om gebruikers de mogelijkheid te geven om snel en moeiteloos de contactgegevens van de gewenste medewerker van AD te verkrijgen, en om systeembeheerders te bevrijden van de routine van het bewerken van een tekstbestand dat de rol van een adresboek speelde.

Er waren geen kant-en-klare geschikte opties om het probleem op te lossen, dus ik moest alles met mijn eigen handen en hoofd doen.

Laten we beginnen met het feit dat u eerst moet beslissen wat u wilt gebruiken. Het is eenvoudig: de uiteindelijke map moet via een browser beschikbaar zijn voor alle gebruikers van het domein. Het eerste dat in je opkomt is PHP in combinatie met ldap, en we zullen ze gebruiken. Ik beschouw het grote voordeel van het gebruik van PHP als de relatieve eenvoud ervan: elke systeembeheerder met zelfs maar een beetje begrip zal, indien nodig, de nodige wijzigingen in de code kunnen aanbrengen, zonder bijzonder veel inspanning.

Dus laten we beginnen. Laten we eerst de parameters instellen voor verbinding met het domein:

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

Het volgende punt is om te bepalen in welke OU we naar gebruikers gaan zoeken. Dit doen we door waarden uit $_GET['place'] te onderscheppen. Bijvoorbeeld als de gebruiker naar het adres gaat server/index.php?place=eersteen vervolgens de variabele $ plaats krijgt een waarde toegekend eerste.

$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 is nodig om de waarde op te slaan - ongeacht of we de OU hebben gedefinieerd waarin we naar gebruikers zullen zoeken of niet. Als er geen overeenkomsten zijn vermeld in de “switch-case”, dan zal $doscript=false, het hoofdgedeelte van het script niet worden uitgevoerd en zal de startpagina “main_table.html” worden weergegeven (ik zal u hierover vertellen het helemaal op het einde).

Als we een OE hebben gedefinieerd, gaan we verder met verdere acties: we beginnen een directorypagina voor de gebruiker te tekenen:

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/ '>

We nemen stijlen op voor een aangenamer uiterlijk (ja, ze kunnen worden opgenomen als een CSS-bestand, maar sommige versies van IE willen geen stijlen accepteren die op deze manier zijn ingesteld, dus je moet ze rechtstreeks in het script schrijven):

<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>

We zijn klaar met de stijlen, nu schrijven we de titel van het tabblad en tekenen we een handige link om terug te keren naar de hoofdpagina:

<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>
";

We definiëren zoekfilters op AD en verkrijgen gegevens over de OE:

$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

Vervolgens ontwerpen we de bovenkant van de pagina:

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>";

Vervolgens ontvangen en verwerken we gebruikersgegevens in een lus, terwijl we, om sommige (bijvoorbeeld service-)accounts te verbergen, eenvoudigweg "verbergen" invoeren in het veld "kamer" in de gebruikersgegevens in AD. Dergelijke gebruikers zullen niet weergegeven in de map:

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, то отображаем прочерк

Trouwens, als je de waarde van een ander attribuut nodig hebt, onthoud dan (dit is belangrijk):
in het verzoek geven we de attribuutnaam door kleine letters brieven, anders werkt het niet.

En plaats de ontvangen gegevens in de tabel:

    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>";

Vervolgens sluiten we de LDAP-verbinding of geven we een bericht weer over de onmogelijkheid om verbinding te maken met de server:

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

Het bestand “main_table.html” is van binnenuit een eenvoudige HTML-pagina met links en ziet er ongeveer zo uit:

<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>

Als mijn code iemand helpt, zal ik blij zijn, gebruik hem!

Je kunt het ook vrijelijk bewerken zoals je wilt (verbeteren/slechter) en het op welke manier dan ook distribueren.

Dank je wel!

Bron: www.habr.com

Voeg een reactie