Crearea unui director de adrese WEB PHP + LDAP

S-a întâmplat ca o campanie (relativ) mare să aibă multe birouri la distanță cu un număr decent de utilizatori. Toate birourile sunt conectate într-o singură rețea cu un domeniu comun, fiecare birou a fost definit în Active Directory (denumit în continuare AD) ca o Unitate de Organizare (OU), în care utilizatorii au fost deja creați.

Era necesar să se ofere utilizatorilor posibilitatea de a obține rapid și fără efort informațiile de contact ale angajatului solicitat de la AD și eliberarea administratorilor de sistem de rutina de editare a unui fișier text care a jucat rolul unei agende de adrese.

Nu existau opțiuni adecvate gata făcute pentru rezolvarea problemei, așa că a trebuit să fac totul cu propriile mâini și cu capul meu.

Să începem cu faptul că mai întâi trebuie să decideți ce să utilizați, este simplu - directorul final ar trebui să fie disponibil pentru toți utilizatorii domeniului printr-un browser. Primul lucru care ne vine în minte este PHP împreună cu ldap și le vom folosi. Consider că marele avantaj al utilizării PHP este relativa simplitate - orice administrator de sistem, chiar și puțin înțelegător, va putea face modificările necesare codului, dacă este necesar, fără a se încorda în mod deosebit.

Deci, să începem. Mai întâi, să setăm parametrii pentru conectarea la domeniu:

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

Următorul punct este să stabilim în ce OU vom căuta utilizatori. Vom face acest lucru prin interceptarea valorilor din $_GET['place']. De exemplu, dacă utilizatorul merge la adresă server/index.php?place=primul, apoi variabila $loc i se va atribui valoarea primul.

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

variabil $doscript este necesar pentru a stoca valoarea - indiferent dacă am definit OU în care vom căuta utilizatori sau nu. Dacă nu există potriviri listate în „switch-case”, atunci $doscript=false, partea principală a scriptului nu va fi executată și va fi afișată pagina de pornire „main_table.html” (vă voi spune despre e la sfârșit).

Dacă am definit o OU, atunci trecem la acțiuni ulterioare: începem să desenăm o pagină de director pentru utilizator:

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

Includem stiluri pentru un aspect mai plăcut (da, ele ar putea fi incluse ca fișier css, dar unele versiuni de IE nu doresc să accepte stiluri setate în acest fel, așa că trebuie să le scrieți direct în 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>

Am terminat cu stilurile, acum scriem titlul filei și desenăm un link convenabil pentru a reveni la pagina principală:

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

Definim filtre de căutare după AD și obținem date despre 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

În continuare proiectăm partea de sus a paginii:

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

În continuare, primim și procesăm datele utilizatorului într-o buclă, în timp ce pentru a ascunde unele conturi (de exemplu, servicii), introducem pur și simplu „ascunde” în câmpul „camera” în detaliile utilizatorului din AD, astfel de utilizatori nu vor fi afișat în director:

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

Apropo, dacă trebuie să obțineți valoarea unui alt atribut, amintiți-vă (acest lucru este important):
în cerere trecem numele atributului litere mici scrisori, altfel nu va merge.

Și introduceți datele primite în 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>";

Apoi, închidem conexiunea ldap sau afișăm un mesaj despre imposibilitatea conectării la server:

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

Fișierul „main_table.html” din interior este o pagină html simplă cu link-uri și arată cam așa:

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

Dacă codul meu ajută pe cineva, mă voi bucura, folosește-l!

De asemenea, îl puteți edita liber după cum doriți (îmbunătățiți/înrăutăți) și îl puteți distribui prin orice mijloace.

Vă mulțumim pentru atenție!

Sursa: www.habr.com

Adauga un comentariu