S-a întâmplat ca o campanie (relativ) mare să aibă multe birouri îndepărtate, în care se aflau un număr considerabil de utilizatori. Toate birourile sunt conectate într-o singură rețea cu un domeniu comun, fiecare birou fiind definit în Active Directory (denumit în continuare AD) ca Unități Organizatorice (OU), în care deja erau creați utilizatorii.
Era necesar să oferim utilizatorilor posibilitatea de a obține rapid și fără eforturi mari datele de contact ale angajatului dorit din AD, iar administratorii de sistem trebuiau să fie eliberați de rutina editării unui fișier text, care servea drept carte de adrese.
Nu au fost găsite opțiuni adecvate pentru a rezolva problema, așa că a fost necesar să facem totul cu mâinile și mintea proprie.
Să începem prin a decide ce să folosim, este simplu — directorul final ar trebui să fie accesibil tuturor utilizatorilor din domeniu prin intermediul unui browser. Primul lucru care îmi vine în minte este PHP în combinație cu ldap, acestea vor fi utilizate. Un mare avantaj al utilizării PHP este simplitatea sa relativă — orice administrator de sistem, chiar și unul care înțelege puțin, va putea face modificările necesare în cod, fără prea mari dificultăți.
Așadar, să începem. Mai întâi, să definim parametrii de conectare la domeniu:
$srv ="SERVER";
$srv_domain ="DOMAIN.COM";
$srv_login ="USERNAME@".$srv_domain;
$srv_password ="PASSWORD";
Următorul pas este să determinăm în care OU vom căuta utilizatorii. Vom face acest lucru interceptând valorile din $_GET[‘place’]. De exemplu, dacă utilizatorul accesează adresa first, atunci variabilei $place i va fi atribuită valoarea 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;
// aici pot fi adăugate încă condiții.
default:
$doscript=false;
break;
}
if (!$doscript) include "main_table.html";
Variabilă $doscript este necesară pentru a păstra valoarea — am definit dacă am găsit OU-ul în care vom căuta utilizatorii sau nu. Dacă nu s-au găsit potriviri în „switch-case”, atunci $doscript=false, partea principală a scriptului nu se va executa, iar pagina de start „main_table.html” va fi afișată (despre aceasta voi vorbi la final).
Dacă am definit OU-ul, atunci trecem la următorii pași: începem să desenăm pagina directorului pentru utilizator:
altceva dacă ($doscript) {
{echo "
<!DOCTYPE html>
<html xmlns='http://www.w3.org/1999/xhtml'>
<head>
<link rel='shortcut icon' href='ico.png'>
<meta charset='windows-1251/ '>
Activăm stilurile pentru un aspect mai plăcut (da, ar fi putut fi conectate ca fișier CSS, dar unele versiuni IE nu acceptă stilurile definite astfel, așa că trebuie să le scriem direct în 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;}
Am terminat cu stilurile, acum scriem titlul tabului și desenăm un link convenabil de întoarcere la pagina principală:
<title>Caiet de adrese al «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>Acasă</p></a>
</td></tr></table>
";
Definim filtrele de căutare după AD și obținem date despre OU:
$filter ="(&(objectcategory=user)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))"; //toți utilizatorii, cu excepția celor dezactivați.
$filter2 ="(objectCategory=OrganizationalUnit)"; // pentru a obține informații despre 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]; // numele locului
$PlaceAddres = $placeinfo[0]["street"][0]; // adresa locului
$PlaceMail = $placeinfo[0]["description"][0]; // mailul locului
$PlacePhone = $placeinfo[0]["st"][0]; // telefonul locului
Apoi ne ocupăm de partea superioară a paginii:
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"> Telefon </td>
<td width='150' bgcolor = "#f0f0e4"> Mobile </td></tr>
<tr><td></td><td> Informații 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>";
Apoi obținem în ciclu și procesăm datele utilizatorilor, având grijă ca anumite (de exemplu, conturi de serviciu) să fie ascunse, pur și simplu specificând „hide” în câmpul „comroom” în atributele utilizatorului din AD, astfel utilizatorii respectivi nu vor apărea în director:
for ($i=0; $i<$info["count"];$i++) {
$UserHide = $info[$i]["physicaldeliveryofficename"][0];
if ($UserHide != 'hide') {
$UserName = $info[$i]["cn"][0]; //Numele utilizatorului
$UserPosition = $info[$i]["title"][0]; //Funcția
$UserMail = $info[$i]["mail"][0]; //mail
if (!$UserMail)) $UserMail = "-"; //dacă nu sunt date despre cutia poștală în AD, afișăm o liniuță
$UserIpPhone = $info[$i]["ipphone"][0]; //telefon ip
if (!$UserIpPhone) $UserIpPhone = "-"; //dacă nu sunt date despre cutia poștală în AD, afișăm o liniuță
$UserMobile = $info[$i]["mobile"][0]; //mobil
if (!$UserMobile) $UserMobile = "-"; //dacă nu sunt date despre cutia poștală în AD, afișăm o liniuță
Apropo, dacă aveți nevoie să obțineți valoarea unui alt atribut, să nu uitați (este important):
în cerere trecem numele atributului cu litere mici a, altfel nu va funcționa.
Și inserăm datele obținute în tabel:
echo "<tr>
<td>". $n+=1 ."</td>
<td> ". $UserName ."<br> <div class='smalltext'>". $UserPosition ."</div></td><td>"; \/\/ Nume de utilizator și poziție
if ($UserMail !='-') echo "<div class='transition-rotate'><a href="mailto:'$UserMail'">$UserMail </a></div>"; \/\/ dacă utilizatorul are e-mail creăm un link pentru trimiterea unui mesaj
else echo "-"; \/\/ dacă nu are e-mail - punem un cratimă.
echo "<td> ". $UserIpPhone ." </td>
<td> ". $UserMobile ." </td></tr>";
}
}
echo "</table>";
Apoi închidem conexiunea LDAP, sau afișăm un mesaj că nu putem conecta la server:
ldap_close($ds);
}
else echo "<h4>Nu se poate conecta la serverul LDAP</h4>";
echo '<br><br><br></body></html>';}
Fișierul „main_table.html” din interior reprezintă o pagină html simplă cu linkuri și arată cam așa:
<head>
<link rel="shortcut icon" href="ico.png"/>
<meta charset="windows-1251"/>
<title>Caiet de adrese al «YourMegaCompanyName»</title>
</head>
<body style='background-color:#ffffff;'>
<center><a href="index.php"><img border="none" src="logo.png"/></a></center>
<center><b>Locații și birouri</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>
Dacă cuiva îi va folosi codul meu — voi fi fericit, folosiți-l!
De asemenea, puteți să-l editați liber în modul dorit (îmbunătățiți/îmbunătățiți) și să-l distribuiți în orice mod.
Vă mulțumesc pentru atenție!
Sursa: habr.com
