Het is zo gebeurd dat een (relatief) groot bedrijf veel externe kantoren had, waarin een behoorlijke hoeveelheid gebruikers zat. Alle kantoren zijn verbonden in ƩƩn netwerk met een gemeenschappelijk domein, en elk kantoor was in Active Directory (hierna AD) gedefinieerd als een Organization Unit (OU), waarin de gebruikers al waren aangemaakt.
Het was nodig om gebruikers de mogelijkheid te geven om snel en zonder veel moeite de contactgegevens van de benodigde medewerker uit AD te verkrijgen, en systeembeheerders te ontlasten van de routine van het bewerken van een tekstbestand dat fungeerde als adressenboek.
Er waren geen kant-en-klare oplossingen voor het opgestelde probleem te vinden, dus moesten we alles zelf doen met onze handen en ons hoofd.
Laten we beginnen met het bepalen van wat we zullen gebruiken; dit is eenvoudig ā de uiteindelijke handleiding moet voor alle gebruikers van het domein toegankelijk zijn via een browser. Het eerste dat in me opkomt is PHP in combinatie met LDAP, dat gaan we gebruiken. Een groot voordeel van het gebruik van PHP vind ik de relatieve eenvoud ā elke systeembeheerder die een beetje begrijpt, kan indien nodig de juiste aanpassingen in de code aanbrengen zonder al te veel moeite.
Dus laten we beginnen. Laten we eerst de verbindingsparameters voor het domein instellen:
$srv = "SERVER";
$srv_domain = "DOMAIN.COM";
$srv_login = "USERNAME@".$srv_domain;
$srv_password = "PASSWORD";
Het volgende punt is om te bepalen in welke OU we gebruikers gaan zoeken. Dit doen we door de waarden uit $_GET[āplaceā] te onderscheppen. Bijvoorbeeld, als een gebruiker naar het adres gaat first, dan zal de variabele $place de waarde krijgen 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;
// hier kunnen meer voorwaarden worden toegevoegd.
default:
$doscript = false;
break;
}
if (!$doscript) include "main_table.html";
Variabele $doscript is nodig om de waarde op te slaan ā of we de OU hebben bepaald waarin we gebruikers gaan zoeken of niet. Als er geen overeenkomsten zijn gevonden in de "switch-case", dan is $doscript = false, en zal het hoofdscript niet worden uitgevoerd, maar zal de startpagina "main_table.html" worden weergegeven (waarover ik aan het eind zal vertellen).
Als we de OU hebben bepaald, dan gaan we verder met de acties: we beginnen met het opstellen van de gebruikerspagina van de handleiding:
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/ '>
We schakelen stijlen in voor een aangenamer uiterlijk (ja, ze hadden als css-bestand kunnen worden aangesloten, maar sommige versies van IE willen stijlen die op deze manier zijn gedefinieerd niet accepteren, daarom moeten we ze direct in het script schrijven):
*{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;}
/* Oneven rijen */#table tbody tr:nth-child(odd){background: #fff;}
/* Even rijen */ #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;}
We zijn klaar met de stijlen, nu schrijven we de titel van het tabblad en maken een handige teruglink naar de startpagina:
<title>Adresboek van «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>Naar de hoofdpagina</p></a>
</td></tr></table>
";
We definiƫren de zoekfilters op AD en krijgen gegevens over OU:
$filter ="(&(objectcategory=user)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))"; //alle gebruikers, behalve uitgeschakelde.
$filter2 ="(objectCategory=OrganizationalUnit)"; // voor het verkrijgen van informatie over 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]; // naam van de plaats
$PlaceAddres = $placeinfo[0]["street"][0]; // adres van de plaats
$PlaceMail = $placeinfo[0]["description"][0]; // mail van de plaats
$PlacePhone = $placeinfo[0]["st"][0]; // telefoon van de plaats
Vervolgens stylen we het bovenste gedeelte van de pagina:
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"> Naam </td>
<td width='250' bgcolor = "#f0f0e4"> E-mail </td>
<td width='60' bgcolor = "#f0f0e4"> Telefoon </td>
<td width='150' bgcolor = "#f0f0e4"> Mobiel </td></tr>
<tr><td></td><td> Gegevens 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>";
Daarna krijgen we in een lus en verwerken we de gegevens van de gebruikers. Om sommige (bijvoorbeeld administratieve) accounts te verbergen, hoeven we alleen maar "hide" in het veld "kamer" in de gebruikersattribuut in AD in te voeren. Dergelijke gebruikers worden niet weergegeven in de catalogus:
for ($i=0; $i<$info["count"];$i++) {
$UserHide = $info[$i]["physicaldeliveryofficename"][0];
if ($UserHide != 'hide') {
$UserName = $info[$i]["cn"][0]; //Naam gebruiker
$UserPosition = $info[$i]["title"][0]; //Functie
$UserMail = $info[$i]["mail"][0]; //mail
if (!$UserMail)) $UserMail = "-"; //als er geen gegevens zijn over de mailbox in AD, tonen we een streepje
$UserIpPhone = $info[$i]["ipphone"][0]; //ip telefoon
if (!$UserIpPhone) $UserIpPhone = "-"; //als er geen gegevens zijn over de mailbox in AD, tonen we een streepje
$UserMobile = $info[$i]["mobile"][0]; //mobiel
if (!$UserMobile) $UserMobile = "-"; //als er geen gegevens zijn over de mailbox in AD, tonen we een streepje
Trouwens, als u de waarde van een ander attribuut nodig heeft, onthoud dan (dit is belangrijk):
geven we de naam van het attribuut door in de aanvraag kleine letters letters, anders werkt het niet.
En we voegen de verkregen gegevens toe aan de tabel:
echo "<tr>
<td>". $n+=1 ."</td>
<td> ". $UserName ."<br> <div class='smalltext'>". $UserPosition ."</div></td><td>"; // Gebruikersnaam en positie
if ($UserMail !='-') echo "<div class='transition-rotate'><a href="mailto:'$UserMail'">$UserMail </a></div>"; // als de gebruiker een e-mail heeft, maak een link om een e-mail te sturen
else echo "-"; // als er geen e-mail is, geven we een streepje.
echo "<td> ". $UserIpPhone ." </td>
<td> ". $UserMobile ." </td></tr>";
}
}
echo "</table>";
Daarna sluiten we de verbinding via ldap, of geven we een melding dat het verbinden met de server niet mogelijk is:
ldap_close($ds);
}
anders echo "<h4>Kon niet verbinding maken met de LDAP-server</h4>";
echo '<br><br><br></body></html>';}
Het bestand "main_table.html" is in feite een simpele HTML-pagina met links, en ziet er ongeveer zo uit:
<head>
<link rel="shortcut icon" href="ico.png"/>
<meta charset="windows-1251"/>
<title>Adresboek van «YourMegaCompanyName»</title>
</head>
<body style='background-color:#ffffff;'>
<center><a href="index.php"><img border="none" src="logo.png"/></a></center>
<center><b>Plaatsen en kantoren</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>
Als iemand iets heeft aan mijn code ā ik ben blij, gebruik het gerust!
U kunt het ook vrijelijk bewerken zoals u wilt (verbeteren/slechter maken) en verspreiden op welke manier dan ook.
Bedankt voor uw aandacht!
Bron: habr.com
