Création d'un répertoire d'adresses WEB PHP + LDAP

Il se trouve qu’une campagne (relativement) importante comptait de nombreux bureaux distants avec un nombre décent d’utilisateurs. Tous les bureaux sont connectés en un seul réseau avec un domaine commun, chaque bureau a été défini dans Active Directory (ci-après dénommé AD) comme une unité d'organisation (UO), dans laquelle des utilisateurs ont déjà été créés.

Il était nécessaire de donner aux utilisateurs la possibilité d'obtenir rapidement et sans effort les coordonnées de l'employé requis auprès d'AD et de libérer les administrateurs système de la routine d'édition d'un fichier texte qui jouait le rôle de carnet d'adresses.

Il n'y avait pas d'options toutes faites appropriées pour résoudre le problème, j'ai donc dû tout faire de mes propres mains et de ma propre tête.

Commençons par le fait que vous devez d'abord décider quoi utiliser, c'est simple : le répertoire final doit être disponible pour 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. Je considère que le gros avantage de l'utilisation de PHP est sa relative simplicité : tout administrateur système, même un peu perspicace, sera en mesure d'apporter les modifications nécessaires au code, si nécessaire, sans particulièrement se fatiguer.

Alors, commençons. Tout d'abord, définissons les paramètres de connexion au domaine :

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

Le point suivant consiste à déterminer dans quelle UO nous rechercherons les utilisateurs. Nous ferons cela en interceptant les valeurs de $_GET['place']. Par exemple, si l'utilisateur se rend à l'adresse serveur/index.php?place=premier, alors la variable $lieu se verra attribuer une valeur 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";

Variable $doscript est nécessaire pour stocker la valeur - que nous ayons défini ou non l'unité d'organisation dans laquelle nous rechercherons des utilisateurs. 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 vais vous parler de à la toute fin).

Si nous avons défini une OU, alors nous procédons à d'autres actions : nous commençons à dessiner une page d'annuaire pour 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 inclus sous forme de fichier CSS, mais certaines versions d'IE ne veulent pas accepter les styles définis de cette manière, vous devez donc les é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>

Nous en avons fini avec les styles, maintenant nous écrivons le titre de l'onglet et dessinons 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éfinissons des filtres de recherche par AD et obtenons des données sur l'UO :

$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, nous concevons 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 recevons et traitons les données des utilisateurs en boucle, tandis que pour masquer certains comptes (par exemple, les comptes de service), nous saisissons simplement « masquer » dans le champ « salle » dans les détails de l'utilisateur dans AD, ces utilisateurs ne seront pas affiché 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, то отображаем прочерк

À propos, si vous avez besoin d'obtenir la valeur d'un autre attribut, rappelez-vous (c'est important) :
dans la requête, nous transmettons le nom de l'attribut minuscule des lettres, sinon ça ne marchera pas.

Et insérez 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 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 » de l’intérieur est 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, j'en serai heureux, utilisez-le !

Vous pouvez également le modifier librement à votre guise (améliorer/pire) et le diffuser par tous les moyens.

Je vous remercie!

Source: habr.com

Ajouter un commentaire