Creamos el directorio de direcciones WEB de PHP + LDAP

Dio la casualidad de que la campaña (relativamente) grande tenía muchas oficinas remotas con un número decente de usuarios. Todas las oficinas están conectadas a la misma red con un dominio común, cada oficina se definió en Active Directory (en adelante, AD) como Unidad de Organización (OU), en la que los usuarios ya estaban establecidos.

Era necesario dar a los usuarios la oportunidad de obtener rápidamente y sin mucho esfuerzo la información de contacto del empleado necesario de AD, y de que los administradores del sistema se liberaran de la rutina de editar un archivo de texto que desempeñaba el papel de una libreta de direcciones.


No había opciones adecuadas ya preparadas para resolver la tarea, así que tuve que hacer todo con mis propias manos y cabeza.

Para empezar, primero debe decidir qué usar, es simple: la guía final debe estar accesible para todos los usuarios del dominio a través de un navegador. Lo primero que viene a la mente es PHP junto con ldap, y los utilizaremos. La mayor ventaja de usar PHP, considero su relativa simplicidad, es que cualquier persona con un poco de comprensión del administrador del sistema puede hacer los cambios necesarios en el código, si es necesario, sin un esfuerzo particular.

Vamos a empezar. Primero, configuremos los parámetros de conexión de dominio:

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

El siguiente punto es determinar en qué unidad organizativa buscaremos usuarios. Haremos esto interceptando los valores de $ _GET ['place']. Por ejemplo, si el usuario va a server / index.php? Place = first , entonces a la variable $ place se le asignará primero el valor .

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

La variable $ doscript es necesaria para almacenar el valor, ya sea que hayamos determinado la unidad organizativa en la que buscaremos usuarios o no. Si no hay coincidencias enumeradas en el "caso de cambio", entonces $ doscript = false, la parte principal del script no se ejecutará y se mostrará la página de inicio "main_table.html" (te lo contaré al final).

Si definimos OU, entonces procedemos con otras acciones: comenzamos a dibujar la página del manual del usuario:

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

Incluimos estilos para una apariencia más agradable (sí, podrían conectarse como un archivo css, sin embargo, algunas versiones de IE no quieren percibir los estilos establecidos de esta manera, por lo que debe escribir directamente en el 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>

Los estilos han terminado, ahora escriba el título de la pestaña y dibuje un enlace conveniente para volver 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>
";

Determinamos los filtros de búsqueda por AD y obtenemos datos sobre la unidad organizativa:

$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

Luego, dibuja la parte 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ón, obtenemos y procesamos los datos del usuario en un bucle, y para ocultar algunas cuentas (por ejemplo, de servicio), simplemente especificamos "ocultar" en el campo "sala" en los detalles del usuario en AD, tales usuarios no se mostrarán en el directorio:

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,   

Por cierto, si usted necesita para obtener el valor de otro atributo, a continuación, recordar (esto es importante):
en la solicitud que pase el nombre de atributo en menor caso , de lo contrario no funcionará.

Y pegamos los datos recibidos en la tabla:

    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ón, cerramos la conexión a través de ldap, o mostramos un mensaje sobre la imposibilidad de conectarse al servidor:

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

El archivo "main_table.html" representa internamente una página html simple con enlaces, y se parece a esto:

<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 mi código ayuda a alguien, ¡estaré encantado de usarlo!

También puede editarlo libremente como lo desee (mejorar / degradar) y distribuirlo por cualquier método.

¡Gracias por la atención!

All Articles