Creiamo un elenco degli indirizzi WEB PHP + LDAP

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

Era necessario dare agli utenti la possibilità di ottenere rapidamente e senza troppi sforzi i dati di contatto del dipendente richiesto da AD, liberando così gli amministratori di sistema dalla routine di modifica di un file di testo che fungeva da rubrica.

Non sono stati trovati risultati pronti e adatti per risolvere il compito assegnato, quindi è stato necessario fare tutto da soli.

Iniziamo col dire che prima di tutto è necessario decidere cosa utilizzare, ed è semplice: l'elenco finale deve essere accessibile a tutti gli utenti del dominio tramite un browser. La prima cosa che viene in mente è PHP insieme a LDAP, e questi saranno utilizzati. Un grande vantaggio dell'utilizzo di PHP è la sua relativa semplicità: qualsiasi amministratore di sistema che abbia un minimo di comprensione potrà apportare, se necessario, le modifiche necessarie al codice senza troppi sforzi.

Iniziamo. Prima di tutto, impostiamo i parametri di connessione al dominio:

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

Il passaggio successivo è determinare in quale OU cercheremo gli utenti. Lo faremo acquisendo i valori da $_GET[‘place’]. Ad esempio, se l'utente passa all'indirizzo server/index.php?place=first, allora 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 altre condizioni.
default:
	$doscript=false; 
	break;
}
if (!$doscript) include "main_table.html";

Variabile $doscript è necessario per memorizzare il valore - abbiamo determinato l'OU in cui cercheremo gli utenti oppure no. Se non ci sono state 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, possiamo procedere con le ulteriori azioni: iniziamo a tracciare la pagina dell'elenco 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 riconoscono gli 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 creiamo un comodo link di ritorno alla homepage:

<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 home</p></a>
</td></tr></table>
";

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

$filter ="(&(objectcategory=user)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))"; // tutti gli utenti, tranne quelli disattivati.
$filter2 ="(objectCategory=OrganizationalUnit)"; // per ottenere informazioni sugli 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

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

Successivamente otteniamo in ciclo e trattiamo i dati degli utenti, per nascondere alcuni (ad esempio, account di sistema), basta scrivere «hide» nel campo «camera» nei dettagli dell'utente in AD; tali utenti non verranno visualizzati nel direttorio:

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, ricordate (è importante):
nel request passiamo il nome dell'attributo in minuscolo lettere, altrimenti non funzionerà.

E incolliamo i dati ottenuti nella tabella:

    echo "<tr>
	<td>". $n+=1 ."</td>
	<td> ". $UserName ."<br> <div class='smalltext'>". $UserPosition ."</div></td><td>"; // Nome utente e posizione
	if ($UserMail !='-') echo "<div class='transition-rotate'><a href="mailto:'$UserMail'">$UserMail  </a></div>";    // se l'utente ha un'email creiamo un link per inviare una mail
	else echo "-"; // se non c'è un'email - mettiamo un trattino.
 	echo "<td> ". $UserIpPhone ." </td>
 	<td> ". $UserMobile ." </td></tr>";
	}
}
echo "</table>";

Successivamente chiudiamo la connessione LDAP, oppure mostriamo un messaggio di impossibilità di collegamento 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» si presenta all'interno come una semplice pagina HTML con dei link, 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 può aiutare qualcuno — ne sarò felice, usatelo!

Potete anche modificarlo liberamente come preferite (migliorare/peggiorare) 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