Wir erstellen das WEB-Adressverzeichnis von PHP + LDAP

So kam es, dass die (relativ) große Kampagne viele Remote-Büros mit einer anständigen Anzahl von Benutzern hatte. Alle Büros sind mit einer gemeinsamen Domäne mit demselben Netzwerk verbunden. Jedes Büro wurde in Active Directory (im Folgenden als AD bezeichnet) als Organisationseinheit (Organization Unit, OU) definiert, in der Benutzer bereits eingerichtet waren.

Es war notwendig, den Benutzern die Möglichkeit zu geben, schnell und ohne großen Aufwand die Kontaktdaten des erforderlichen Mitarbeiters von AD zu erhalten, und den Systemadministratoren die Möglichkeit zu geben, eine Textdatei, die die Rolle eines Adressbuchs spielte, nicht mehr zu bearbeiten.


Es gab keine vorgefertigten geeigneten Optionen zur Lösung der Aufgabe, daher musste ich alles mit meinen eigenen Händen und meinem eigenen Kopf tun.

Zunächst müssen Sie entscheiden, was Sie verwenden möchten. Es ist ganz einfach: Die endgültige Anleitung sollte allen Benutzern der Domain über einen Browser zugänglich sein. Das erste, was mir in den Sinn kommt, ist PHP in Verbindung mit ldap, und wir werden sie verwenden. Der größte Vorteil der Verwendung von PHP besteht meiner Meinung nach darin, dass jeder, der ein wenig Verständnis für den Systemadministrator hat, bei Bedarf die erforderlichen Änderungen am Code vornehmen kann, ohne sich besonders anstrengen zu müssen.

Also fangen wir an. Lassen Sie uns zunächst die Domänenverbindungsparameter festlegen:

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

Der nächste Punkt ist zu bestimmen, in welcher Organisationseinheit wir nach Benutzern suchen werden. Wir werden dies tun, indem wir die Werte von $ _GET ['place'] abfangen. Zum Beispiel geht , wenn der Benutzer auf Server / index.php? Platz = erster , dann das $ Ort Variable wird der Wert zugewiesen wird zuerst .

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

Die Variable $ doscript wird benötigt, um den Wert zu speichern - unabhängig davon, ob wir die Organisationseinheit festgelegt haben, in der nach Benutzern gesucht wird oder nicht. Wenn im "Switch-Fall" keine Übereinstimmungen aufgeführt sind, wird $ doscript = false, der Hauptteil des Skripts nicht ausgeführt und die Startseite "main_table.html" wird angezeigt (ich werde Sie ganz am Ende darüber informieren).

Wenn wir OU definiert haben, fahren wir mit weiteren Aktionen fort: Wir beginnen mit dem Zeichnen der Benutzerhandbuchseite:

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

Wir fügen Stile für ein angenehmeres Erscheinungsbild hinzu (ja, sie können als CSS-Datei verbunden werden. Einige Versionen des IE möchten die auf diese Weise festgelegten Stile jedoch nicht wahrnehmen, sodass Sie direkt in das Skript schreiben müssen.)

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

Die Stile sind beendet. Schreiben Sie nun den Titel der Registerkarte und zeichnen Sie einen praktischen Link, um zur Hauptseite zurückzukehren:

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

Wir bestimmen die Suchfilter nach AD und erhalten Daten über die Organisationseinheit:

$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

Zeichnen Sie als Nächstes den oberen Rand der Seite:

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

Als Nächstes erhalten und verarbeiten wir Benutzerdaten in einem Zyklus. Um einige (z. B. Dienst-) Konten auszublenden, schreiben wir einfach "Ausblenden" in das Feld "Raum" in den Benutzerdetails in AD. Diese Benutzer werden nicht im Verzeichnis angezeigt:

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,   

By the way, wenn Sie den Wert eines anderen Attributs erhalten müssen, denken Sie daran (das ist wichtig):
in der Anfrage übergeben wir den Attributnamen in unteren Fall , sonst wird es nicht funktionieren.

Und wir fügen die empfangenen Daten in die Tabelle ein:

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

Als Nächstes schließen wir die Verbindung über ldap oder zeigen eine Meldung über die Unmöglichkeit der Verbindung zum Server an:

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

Die Datei "main_table.html" stellt intern eine einfache HTML-Seite mit Links dar und sieht ungefähr so ​​aus:

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

Wenn mein Code jemandem hilft, werde ich ihn gerne verwenden!

Sie können es auch beliebig bearbeiten (verbessern / verschlechtern) und mit beliebigen Methoden verteilen.

Vielen Dank für Ihre Aufmerksamkeit!

All Articles