Creiamo un elenco directory WEB PHP + LDAP

È successo che una grande azienda avesse molti uffici remoti, nei quali si trovavano un numero considerevole di utenti. Tutti gli uffici sono connessi in una rete con un dominio comune, e ogni ufficio è stato definito in Active Directory (di seguito AD) come Unità Organizzativa (OU), dove sono già stati creati gli utenti.

Era necessario consentire agli utenti di ottenere rapidamente e senza sforzo i contatti di un dipendente necessario dall'AD, e liberare gli amministratori di sistema dalla routine di modifica di un file di testo che fungeva da rubrica.

Non sono state trovate soluzioni pronte e adeguate per affrontare il compito, quindi è stato necessario fare tutto da soli.

Iniziamo con il fatto che per cominciare dobbiamo decidere cosa utilizzare; è semplice: la guida finale deve essere accessibile a tutti gli utenti del dominio tramite browser. La prima cosa che viene in mente è PHP in combinazione con ldap, quindi utilizzeremo questi due. Un grande vantaggio dell'uso di PHP è la sua relativa semplicità: ogni amministratore di sistema che abbia una minima comprensione potrà, se necessario, apportare le dovute modifiche al codice senza troppe complicazioni.

Quindi, cominciamo. Innanzitutto, impostiamo i parametri di connessione al dominio:

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

Il passo successivo è determinare in quale OU cercheremo gli utenti. Lo faremo estraendo i valori da $_GET['place']. Per esempio, se l'utente accede all'indirizzo server/index.php?place=first, alla variabile $place verrà assegnato il valore first.

$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;
	//qui puoi aggiungere ulteriori condizioni.
default:
	$doscript=false; 
	break;
}
if (!$doscript) include "main_table.html";

Variabile $doscript è necessaria per memorizzare il valore – abbiamo definito se stiamo cercando un'OU per gli utenti o meno. Se non ci sono corrispondenze elencate nel «switch-case», allora $doscript=false, la parte principale dello script non verrà eseguita e verrà visualizzata la pagina iniziale «main_table.html» (di cui parlerò alla fine).

Se abbiamo definito l'OU, allora procediamo con le azioni successive: iniziamo a creare la pagina della rubrica per l'utente:

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

Attiviamo gli stili per un aspetto più gradevole (sì, avremmo potuto collegarli come file css, ma alcune versioni di IE non accettano stili definiti in questo modo, quindi dobbiamo scriverli direttamente nello script):

*{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;}
	/* Nelle righe dispari */#table tbody tr:nth-child(odd){background: #fff;}
	/* Nelle righe pari */   #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;}

Finito con gli stili, ora scriviamo il titolo della scheda e disegniamo un comodo link per tornare alla pagina principale:

<title>Rubrica di «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>Torna alla homepage</p></a>
</td></tr></table>
";

Definiamo i filtri di ricerca per AD e otteniamo i dati sull'OU:

$filter ="(&(objectcategory=user)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))"; //tutti gli utenti, eccetto quelli disabilitati.
$filter2 ="(objectCategory=OrganizationalUnit)"; // per ottenere informazioni sull'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];  			// nome del luogo
$PlaceAddres = $placeinfo[0]["street"][0];		// indirizzo del luogo
$PlaceMail = $placeinfo[0]["description"][0]; 	// email del luogo
$PlacePhone = $placeinfo[0]["st"][0]; 		// telefono del luogo

Proseguiamo con la parte superiore della 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"> Telefono </td>
	<td width='150' bgcolor = "#f0f0e4"> Mobile </td></tr>
	<tr><td></td><td> Dati 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>";

Ora otteniamo in ciclo e trattiamo i dati degli utenti; per nascondere alcuni (ad esempio, gli account di servizio), basta scrivere «hide» nel campo «stanza» nei dettagli dell'utente in AD, tali utenti non appariranno nell'elenco:

for ($i=0; $i<$info["count"]; $i++) { 
$UserHide = $info[$i]["physicaldeliveryofficename"][0];
if ($UserHide != 'hide') {
$UserName = $info[$i]["cn"][0];                //Nome utente
$UserPosition = $info[$i]["title"][0]; 		//Posizione
$UserMail = $info[$i]["mail"][0];			//mail
if (!$UserMail)) $UserMail = "-";                  //se non ci sono dati sulla casella in AD, mostriamo un trattino
$UserIpPhone = $info[$i]["ipphone"][0];		//telefono IP
	if (!$UserIpPhone) $UserIpPhone = "-";    //se non ci sono dati sulla casella in AD, mostriamo un trattino
$UserMobile = $info[$i]["mobile"][0];		//mobile
	if (!$UserMobile) $UserMobile = "-";     //se non ci sono dati sulla casella in AD, mostriamo un trattino

A proposito, se avete bisogno di ottenere il valore di un altro attributo, tenete a mente (è importante):
nel comando passiamo il nome dell'attributo in lettere minuscole, altrimenti non funzionerà.

E inseriamo i dati ottenuti nella tabella:

    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>";    
	else echo "-"; 
 	echo "<td> ". $UserIpPhone ." </td>
 	<td> ". $UserMobile ." </td></tr>";
	}
}
echo "</table>";

Dopo chiudiamo la connessione ldap, o mostriamo un messaggio riguardante l'impossibilità di collegarsi al server:

ldap_close($ds); 
} 
else echo "<h4>Impossibile connettersi al server LDAP</h4>"; 
echo '<br><br><br></body></html>';}

Il file «main_table.html» è fondamentalmente una semplice pagina html con collegamenti, e appare più o meno così:

<head>
<link rel="shortcut icon" href="ico.png"/>
<meta charset="windows-1251"/>
<title>Rubrica di «YourMegaCompanyName»</title>
</head>
<body style='background-color:#ffffff;'>
<center><a href="index.php"><img border="none" src="logo.png"/></a></center>
<center><b>Luoghi e uffici</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 il mio codice sarà utile a qualcuno — ne sarò felice, usatelo!

Potete anche modificarlo liberamente come volete (migliorarlo/deteriorarlo) e diffonderlo in qualsiasi modo.

Grazie per l'attenzione!

Fonte: habr.com

Acquista hosting affidabile per siti web con protezione DDoS, server VPS VDS 🔥 Acquista hosting affidabile per siti web con protezione DDoS, server VPS VDS | ProHoster