Nous créons le répertoire d'adresses WEB de PHP + LDAP

Il se trouve que la campagne (relativement) importante comptait de nombreux bureaux distants avec un nombre décent d'utilisateurs. Tous les bureaux sont connectés au même réseau avec un domaine commun, chaque bureau a été défini dans Active Directory (ci-après dénommé AD) en tant qu'unité d'organisation (OU), dans laquelle les utilisateurs étaient déjà établis.

Il était nécessaire de donner aux utilisateurs la possibilité d'obtenir rapidement et sans trop d'efforts les coordonnées de l'employé nécessaire d'AD et des administrateurs système de s'affranchir de la routine de modification d'un fichier texte qui jouait le rôle d'un carnet d'adresses.


Il n'y avait pas d'options appropriées prêtes à l'emploi pour résoudre la tâche, j'ai donc dû tout faire de mes propres mains et tête.

Pour commencer, vous devez d'abord décider quoi utiliser, c'est simple - le guide final doit être accessible à tous les utilisateurs du domaine via un navigateur. La première chose qui me vient à l'esprit est PHP en conjonction avec ldap, et nous les utiliserons. Le plus grand avantage de l'utilisation de PHP, je considère sa relative simplicité, est que toute personne ayant une petite compréhension de l'administrateur système peut apporter les modifications nécessaires au code, si nécessaire, sans forcer particulièrement.

Commençons donc. Tout d'abord, définissons les paramètres de connexion du domaine:

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

Le point suivant consiste à déterminer dans quelle unité d'organisation nous rechercherons des utilisateurs. Nous le ferons en interceptant les valeurs de $ _GET ['place']. Par exemple, si l'utilisateur accède à server / index.php? Place = first , alors la variable $ place se verra attribuer la valeur en premier .

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

La variable $ doscript est nécessaire pour stocker la valeur - que nous ayons déterminé l'unité d'organisation dans laquelle nous rechercherons les utilisateurs ou non. S'il n'y a aucune correspondance répertoriée dans le "switch-case", alors $ doscript = false, la partie principale du script ne sera pas exécutée et la page de démarrage "main_table.html" sera affichée (je vous en parlerai à la toute fin).

Si nous avons défini l'unité d'organisation, nous procédons à d'autres actions: nous commençons à dessiner la page de manuel de l'utilisateur:

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

Nous incluons des styles pour une apparence plus agréable (oui, ils pourraient être connectés en tant que fichier css, cependant, certaines versions d'IE ne veulent pas percevoir les styles définis de cette manière, vous devez donc écrire directement dans le script):

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

Les styles sont terminés, écrivez maintenant le titre de l'onglet et tracez un lien pratique pour revenir à la page principale:

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

Nous déterminons les filtres de recherche par AD et obtenons des données sur l'unité d'organisation:

$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

Ensuite, dessinez le haut de la page:

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

Ensuite, nous obtenons et traitons les données utilisateur en boucle, et afin de masquer certains comptes (par exemple, de service), nous spécifions simplement «masquer» dans le champ «room» dans les détails de l'utilisateur dans AD, ces utilisateurs ne seront pas affichés dans le répertoire:

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,   

Soit dit en passant, si vous avez besoin pour obtenir la valeur d'un autre attribut, rappelez - vous (ce qui est important):
dans la demande , nous transmettre le nom d'attribut dans inférieur cas , sinon cela ne fonctionnera pas.

Et nous collons les données reçues dans le tableau:

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

Ensuite, nous fermons la connexion via ldap, ou affichons un message sur l'impossibilité de se connecter au serveur:

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

Le fichier "main_table.html" représente en interne une simple page html avec des liens, et ressemble à ceci:

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

Si mon code aide quelqu'un - je serai heureux de l'utiliser!

Vous pouvez également le modifier librement comme vous le souhaitez (améliorer / dégrader) et le distribuer par n'importe quelle méthode.

Merci pour l'attention!

All Articles