Creeu un directori d'adreces WEB PHP + LDAP

Va passar que una campanya (relativament) gran tenia moltes oficines remotes amb un nombre decent d'usuaris. Totes les oficines estan connectades en una xarxa amb un domini comú, cada oficina es va definir a Active Directory (d'ara endavant AD) com a Unitat d'organització (OU), en la qual ja estaven creats usuaris.

Calia donar als usuaris l'oportunitat d'obtenir de manera ràpida i senzilla la informació de contacte de l'empleat requerit d'AD i alliberar els administradors del sistema de la rutina d'editar un fitxer de text que feia el paper d'una llibreta d'adreces.

No hi havia opcions adequades per resoldre el problema, així que vaig haver de fer-ho tot amb les meves pròpies mans i el meu cap.

Comencem pel fet que primer cal decidir què utilitzar, és senzill: el directori final hauria d'estar disponible per a tots els usuaris del domini mitjançant un navegador. El primer que em ve al cap és PHP juntament amb ldap, i els farem servir. Considero que el gran avantatge d'utilitzar PHP és la seva relativa simplicitat: qualsevol administrador del sistema amb una mica de comprensió podrà fer els canvis necessaris al codi, si cal, sense esforçar-se especialment.

Així doncs, comencem. Primer, establim els paràmetres per connectar-nos al domini:

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

El següent punt és determinar en quina OU cercarem usuaris. Ho farem interceptant valors de $_GET['place']. Per exemple, si l'usuari va a l'adreça server/index.php?place=1, després la variable $lloc se li assignarà el valor 1.

$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 es necessita per emmagatzemar el valor, tant si hem definit l'OU en què cercarem usuaris com si no. Si no hi ha coincidències a la llista "switch-case", aleshores $doscript=false, la part principal de l'script no s'executarà i es mostrarà la pàgina d'inici "main_table.html" (us en parlaré al final).

Si hem definit una OU, procedim a més accions: comencem a dibuixar una pàgina de directori per a l'usuari:

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

Incloem estils per a una aparença més agradable (sí, es podrien incloure com a fitxer CSS, però algunes versions d'IE no volen acceptar estils establerts d'aquesta manera, de manera que els heu d'escriure directament a l'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>

Hem acabat amb els estils, ara escrivim el títol de la pestanya i dibuixem un enllaç convenient per tornar a la pàgina 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 filtres de cerca per AD i obtenim dades sobre 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

A continuació dissenyem la part superior de la pàgina:

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

A continuació, rebem i processem les dades d'usuari en un bucle, mentre que per ocultar alguns comptes (per exemple, de servei), simplement introduïm "amagar" al camp "habitació" als detalls de l'usuari a AD, aquests usuaris no seran es mostra al directori:

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 cert, si necessiteu obtenir el valor d'un altre atribut, recordeu (això és important):
a la sol·licitud passem el nom de l'atribut minúscula lletres, en cas contrari no funcionarà.

I inseriu les dades rebudes a la taula:

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

A continuació, tanquem la connexió ldap, o mostrem un missatge sobre la impossibilitat de connectar-nos al servidor:

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

El fitxer "main_table.html" des de l'interior és una pàgina HTML senzilla amb enllaços, i sembla una cosa així:

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

Si el meu codi ajuda a algú, estaré encantat, utilitzeu-lo!

També podeu editar-lo lliurement com vulgueu (millorar/empitjorar) i distribuir-lo per qualsevol mitjà.

Gràcies!

Font: www.habr.com

Afegeix comentari