Criamos o diretório de endereços WEB do PHP + LDAP

Aconteceu que a campanha (relativamente) grande tinha muitos escritórios remotos com um número decente de usuários. Todos os escritórios estão conectados à mesma rede com um domínio comum; cada escritório foi definido no Active Directory (doravante denominado AD) como Unidade de Organização (OU), na qual os usuários já estavam estabelecidos.

Era necessário dar aos usuários a oportunidade de obter rapidamente e sem muito esforço os detalhes de contato do funcionário necessário do AD e os administradores de sistema para se libertarem da rotina de editar um arquivo de texto que desempenhava o papel de um catálogo de endereços.


Não havia opções adequadas prontas para resolver a tarefa, então eu tive que fazer tudo com minhas próprias mãos e cabeça.

Para começar, primeiro você precisa decidir o que usar, é simples - o guia final deve estar acessível a todos os usuários do domínio por meio de um navegador. A primeira coisa que vem à mente é o PHP em conjunto com o ldap, e nós os usaremos. A maior vantagem do uso do PHP, considero sua relativa simplicidade, é que qualquer pessoa com um pouco de compreensão do administrador do sistema pode fazer as alterações necessárias no código, se necessário, sem forçar muito.

Então, vamos começar. Primeiro, vamos definir os parâmetros de conexão do domínio:

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

O próximo ponto é determinar em qual OU procuraremos usuários. Faremos isso interceptando os valores de $ _GET ['place']. Por exemplo, se o usuário navegar para server / index.php? Place = first , a variável $ place receberá o valor primeiro .

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

A variável $ doscript é necessária para armazenar o valor - independentemente de termos determinado a UO na qual procuraremos usuários ou não. Se não houver correspondências listadas no "caso de opção", então $ doscript = false, a parte principal do script não será executada e a página inicial "main_table.html" será exibida (eu falarei sobre isso no final).

Se definimos OU, prosseguimos com outras ações: começamos a desenhar a página de manual do usuário:

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

Incluímos estilos para uma aparência mais agradável (sim, eles podem ser conectados como um arquivo css; no entanto, algumas versões do IE não desejam perceber os estilos definidos dessa maneira, portanto, você deve escrever diretamente no 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>

Os estilos terminaram, agora escreveremos o título da guia e traçaremos um link conveniente para retornar à 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 os filtros de pesquisa pelo AD e obtemos dados sobre a 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

Em seguida, desenhe a parte superior da 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>";

Em seguida, obtemos e processamos os dados do usuário em um loop e, para ocultar algumas contas (por exemplo, serviço), simplesmente especificamos "hide" no campo "room" nos detalhes do usuário no AD, esses usuários não serão exibidos no diretório:

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 propósito, se você precisar obter o valor de outro atributo, lembre-se (isso é importante):
na solicitação, passamos o nome do atributo em letras minúsculas , caso contrário, não funcionará.

E colamos os dados recebidos na tabela:

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

Em seguida, fechamos a conexão via ldap ou exibimos uma mensagem sobre a impossibilidade de conectar-se ao servidor:

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

O arquivo "main_table.html" representa internamente uma página html simples com links e se parece com isso:

<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 meu código ajudar alguém - ficarei feliz em usá-lo!

Você também pode editá-lo livremente como desejar (melhorar / degradar) e distribuí-lo por qualquer método.

Obrigado pela atenção!

All Articles