Aconteceu que uma (relativamente) grande empresa tinha muitos escritórios remotos, onde havia um número considerável de usuários. Todos os escritórios estão conectados em uma rede com um domínio comum, cada escritório foi definido no Active Directory (daqui em diante AD) como Unidade Organizacional (OU), onde os usuários já foram criados.
Era necessário permitir que os usuários obtivessem rapidamente e sem muito esforço os dados de contato do funcionário necessário a partir do AD, e liberar os administradores de sistema da rotina de editar um arquivo de texto que servia como catálogo de endereços.
Não foram encontrados opções adequadas para resolver a tarefa proposta, então tivemos que fazer tudo com nossas próprias mãos e cabeças.
Começaremos determinando o que utilizar. Isso é simples: o diretório final deve estar acessível a todos os usuários do domínio através do navegador. A primeira coisa que me vem à mente é PHP em conjunto com ldap, e vamos usá-los. Um grande ponto a favor do uso de PHP é sua relativa simplicidade — qualquer administrador de sistema que entenda um pouco poderá fazer, se necessário, as alterações necessárias no código, sem muito esforço.
Então, vamos começar. Primeiro, vamos definir os parâmetros de conexão ao domínio:
$srv ="SERVER";
$srv_domain ="DOMAIN.COM";
$srv_login ="USERNAME@".$srv_domain;
$srv_password ="PASSWORD";
Como próximo passo, precisamos determinar em qual OU iremos buscar os usuários. Faremos isso capturando os valores de $_GET[‘place’]. Por exemplo, se o usuário acessar o endereço first, então a variável $place receberá o valor 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;
// aqui você pode adicionar mais condições.
default:
$doscript=false;
break;
}
if (!$doscript) include "main_table.html";
Variável $doscript é necessário para armazenar o valor — se definimos ou não a OU em que iremos buscar os usuários. Se não houver coincidências nas condições listadas no 'switch-case', então $doscript=false, a parte principal do script não será executada e a página inicial 'main_table.html' será exibida (sobre isso falarei no final).
Se definimos a OU, então passamos para as próximas etapas: começamos a criar a página do diretório para o 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/ '>
Ativamos os estilos para uma aparência mais agradável (sim, eles poderiam ser conectados como um arquivo css, mas algumas versões do IE não aceitam estilos definidos dessa forma, então precisamos escrevê-los diretamente no 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;}
#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;}
Os estilos estão prontos, agora vamos escrever o título da aba e criar um link prático para voltar à página inicial:
<title>Agenda da «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>Voltar à página inicial</p></a>
</td></tr></table>
";
Definimos os filtros de busca por AD e obtemos dados sobre OU:
$filter ="(&(objectcategory=user)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))"; //todos os usuários, exceto os desativados.
$filter2 ="(objectCategory=OrganizationalUnit)"; //para obter informações sobre 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 do lugar
$PlaceAddres = $placeinfo[0]["street"][0]; // endereço do lugar
$PlaceMail = $placeinfo[0]["description"][0]; // e-mail do lugar
$PlacePhone = $placeinfo[0]["st"][0]; // telefone do lugar
Em seguida, organizamos 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"> Nome </td>
<td width='250' bgcolor = "#f0f0e4"> E-mail </td>
<td width='60' bgcolor = "#f0f0e4"> Telefone </td>
<td width='150' bgcolor = "#f0f0e4"> Mobile </td></tr>
<tr><td></td><td> Dados da 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 em um loop e processamos os dados dos usuários; para ocultar algumas contas (por exemplo, contas de serviço), basta escrever "hide" no campo "quarto" nas propriedades do usuário no AD, esses usuários não aparecerão no diretório:
for ($i=0; $i<$info["count"];$i++) {
$UserHide = $info[$i]["physicaldeliveryofficename"][0];
if ($UserHide != 'hide') {
$UserName = $info[$i]["cn"][0]; //Nome do usuário
$UserPosition = $info[$i]["title"][0]; // Cargo
$UserMail = $info[$i]["mail"][0]; //email
if (!$UserMail)) $UserMail = "-"; //se não houver dados de caixa no AD, exibe um hífen
$UserIpPhone = $info[$i]["ipphone"][0]; //telefone ip
if (!$UserIpPhone) $UserIpPhone = "-"; //se não houver dados de caixa no AD, exibe um hífen
$UserMobile = $info[$i]["mobile"][0]; //celular
if (!$UserMobile) $UserMobile = "-"; //se não houver dados de caixa no AD, exibe um hífen
A propósito, se você precisar obter o valor de outro atributo, lembre-se (isso é importante):
na consulta passamos o nome do atributo letras minúsculas letras, caso contrário não funcionará.
E inserimos os dados obtidos na tabela:
echo "<tr>
<td>". $n+=1 ."</td>
<td> ". $UserName ."<br> <div class='smalltext'>". $UserPosition ."</div></td><td>"; // Nome de usuário e cargo
if ($UserMail !='-') echo "<div class='transition-rotate'><a href="mailto:'$UserMail'">$UserMail </a></div>"; // se o usuário tiver e-mail, criamos um link para enviar um e-mail
else echo "-"; // se não houver e-mail - mostramos um traço.
echo "<td> ". $UserIpPhone ." </td>
<td> ". $UserMobile ." </td></tr>";
}
}
echo "</table>";
Em seguida, fechamos a conexão LDAP ou exibimos uma mensagem informando que não foi possível se conectar ao servidor:
ldap_close($ds);
}
else echo "<h4>Foi impossível conectar ao servidor LDAP</h4>";
echo '<br><br><br></body></html>';}
O arquivo "main_table.html" é basicamente uma página HTML simples com links e se parece mais ou menos assim:
<head>
<link rel="shortcut icon" href="ico.png"/>
<meta charset="windows-1251"/>
<title>Agenda da «YourMegaCompanyName»</title>
</head>
<body style='background-color:#ffffff;'>
<center><a href="index.php"><img border="none" src="logo.png"/></a></center>
<center><b>Locais e escritórios</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 alguém se beneficiar do meu código, ficarei feliz, sintam-se à vontade para utilizá-lo!
Você também pode editá-lo livremente como desejar (melhorar/piorar) e distribuí-lo por qualquer meio.
Obrigado pela atenção!
Fonte: habr.com
