Crea una directory di indirizzi WEB PHP + LDAP

È successo che una campagna (relativamente) ampia avesse molti uffici remoti con un discreto numero di utenti. Tutti gli uffici sono collegati in un'unica rete con un dominio comune, ogni ufficio è stato definito in Active Directory (di seguito denominato AD) come un'unità organizzativa (OU), in cui sono già stati creati gli utenti.

Era necessario offrire agli utenti l'opportunità di ottenere rapidamente e senza sforzo le informazioni di contatto del dipendente richiesto da AD e liberare gli amministratori di sistema dalla routine di modifica di un file di testo che svolgeva il ruolo di rubrica.

Non c'erano opzioni adatte già pronte per risolvere il problema, quindi ho dovuto fare tutto con le mie mani e la mia testa.

Partiamo dal fatto che prima devi decidere cosa usare, è semplice: la directory finale dovrebbe essere disponibile a tutti gli utenti del dominio tramite un browser. La prima cosa che mi viene in mente è PHP insieme a ldap e li useremo. Considero il grande vantaggio dell'utilizzo di PHP la sua relativa semplicità: qualsiasi amministratore di sistema con anche un po' di conoscenza sarà in grado di apportare le modifiche necessarie al codice, se necessario, senza affaticarsi particolarmente.

Quindi, cominciamo. Per prima cosa impostiamo i parametri per la connessione al dominio:

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

Il punto successivo è determinare in quale UO cercheremo gli utenti. Lo faremo intercettando i valori da $_GET['place']. Ad esempio, se l'utente va all'indirizzo server/index.php?place=prima di tutto, quindi la variabile $posto verrà assegnato il valore prima di tutto.

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

Переменная $doscript è necessario per memorizzare il valore, indipendentemente dal fatto che abbiamo definito l'unità organizzativa in cui cercheremo gli utenti o meno. Se non ci sono corrispondenze elencate nello "switch-case", allora $doscript=false, la parte principale dello script non verrà eseguita e verrà visualizzata la pagina iniziale "main_table.html" (ti parlerò di proprio alla fine).

Se abbiamo definito un'unità organizzativa, procediamo con ulteriori azioni: iniziamo a disegnare una pagina di directory 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/ '>

Includiamo stili per un aspetto più gradevole (sì, potrebbero essere inclusi come file css, ma alcune versioni di IE non vogliono accettare stili impostati in questo modo, quindi devi scriverli direttamente nello 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>

Abbiamo finito con gli stili, ora scriviamo il titolo della scheda e disegniamo un comodo link per tornare alla 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>
";

Definiamo i filtri di ricerca per AD e otteniamo dati sull'unità organizzativa:

$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

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

Successivamente, riceviamo ed elaboriamo i dati dell'utente in un ciclo, mentre per nascondere alcuni account (ad esempio, di servizio), inseriamo semplicemente "nascondi" nel campo "stanza" nei dettagli dell'utente in AD, tali utenti non saranno visualizzato nella directory:

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

A proposito, se hai bisogno di ottenere il valore di un altro attributo, ricorda (questo è importante):
nella richiesta passiamo il nome dell'attributo minuscolo in lettere, altrimenti non funzionerà.

E inserisci i dati ricevuti 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>";    // если у пользователя есть e-mail создаём ссылку на отправку письма
	else echo "-"; //если нет e-mail - ставим прочерк.
 	echo "<td> ". $UserIpPhone ." </td>
 	<td> ". $UserMobile ." </td></tr>";
	}
}
echo "</table>";

Successivamente, chiudiamo la connessione ldap o visualizziamo un messaggio sull'impossibilità di connettersi al server:

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

Il file "main_table.html" dall'interno è una semplice pagina html con collegamenti e assomiglia a questo:

<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 il mio codice aiuta qualcuno, sarò felice di usarlo!

Puoi anche modificarlo liberamente come desideri (migliorarlo/peggiorarlo) e distribuirlo con qualsiasi mezzo.

Grazie!

Fonte: habr.com

Aggiungi un commento