Crià un cartulare di indirizzu WEB PHP + LDAP

Hè accadutu chì una campagna (relativamente) grande hà avutu assai uffizii remoti cù un numeru decentu di utilizatori. Tutti l'uffizii sò cunnessi in una reta cù un duminiu cumuni, ogni uffiziu hè statu definitu in Active Directory (in seguitu chjamatu AD) cum'è Unità d'urganizazione (OU), in quale l'utilizatori eranu digià creati.

Era necessariu di dà l'utilizatori l'uppurtunità di ottene rapidamente è senza sforzu l'infurmazioni di cuntattu di l'impiigatu necessariu da l'AD, è l'amministratori di sistema gratuiti da a rutina di edità un schedariu di testu chì hà ghjucatu u rolu di un libru di indirizzu.

Ùn ci era micca l'opzioni adattati pronti per risolve u prublema, cusì aghju avutu à fà tuttu cù e mo mani è a testa.

Cuminciamu cù u fattu chì prima avete bisognu di decide ciò chì aduprà, hè simplice - u repertoriu finali deve esse dispunibule per tutti l'utilizatori di u duminiu via un navigatore. A prima cosa chì vene in mente hè PHP in cunghjunzione cù ldap, è l'avemu aduprà. Pensu chì u grande vantaghju di utilizà PHP hè a so simplicità relativa - ogni amministratore di u sistema cù ancu un pocu di cunniscenza serà capace di fà i cambiamenti necessarii à u codice, se ne necessariu, senza particularmente straining.

Allora, cuminciamu. Prima, stabiliscemu i paràmetri per cunnette à u duminiu:

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

U prossimu puntu hè di determinà in quale OU avemu da circà l'utilizatori. Facemu questu interceptendu i valori da $_GET ['place']. Per esempiu, se l'utilizatore va à l'indirizzu server/index.php?place=primu, poi a variabile $ locu serà attribuitu un valore primu.

$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 hè necessariu per almacenà u valore - se avemu definitu l'OU in quale avemu da circà l'utilizatori o micca. Se ùn ci sò micca partiti listati in u "switch-case", allora $doscript = false, a parte principale di u script ùn serà micca eseguita, è a pagina iniziale "main_table.html" serà visualizata (vi dicu. hè à a fine).

Se avemu definitu una OU, allora procedemu à più azzioni: cuminciamu à disegnà una pagina di repertoriu per l'utilizatore:

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

Includemu stili per un aspettu più piacevule (sì, puderianu esse inclusi cum'è un schedariu css, ma alcune versioni di IE ùn volenu micca accettà stili stabiliti in questu modu, cusì avete da scriveli direttamente in u 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>

Avemu finitu cù i stili, avà scrivemu u titulu di a tabulazione è tracciate un ligame convenientu per vultà à a pagina 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>
";

Definimu i filtri di ricerca per AD è uttene dati nantu à l'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

Dopu cuncepemu a cima di a 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>";

In seguitu, ricevemu è prucessa i dati di l'utilizatori in un ciclu, mentre chì per ammuccià alcuni (per esempiu, serviziu) cunti, simpricimenti entremu "hide" in u campu "stanza" in i dettagli di l'utilizatori in AD, tali utilizatori ùn saranu micca. affissatu in u cartulare:

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

Per via, se avete bisognu di ottene u valore di un altru attributu, allora ricordate (questu hè impurtante):
in a dumanda passemu u nome di l'attributu minuscule lettere, altrimenti ùn funziona micca.

È inserisci i dati ricevuti in a tavula:

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

In seguitu, chjudemu a cunnessione ldap, o mostra un missaghju nantu à l'impossibilità di cunnette à u servitore:

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

U schedariu "main_table.html" da l'internu hè una pagina html simplice cù ligami, è pare cusì:

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

Se u mo codice aiuta à qualchissia, seraghju cuntentu, aduprate!

Pudete ancu edità liberamente cum'è vulete (migliurà / peghju) è distribuisce da ogni modu.

Ti ringraziu per a vostra attenzione!

Source: www.habr.com

Add a comment