Det visade sig att ett (relativt) stort företag hade mÄnga avlÀgsna kontor dÀr en ansenlig mÀngd anvÀndare fanns. Alla kontor Àr anslutna till ett och samma nÀtverk med en gemensam domÀn, och varje kontor definierades i Active Directory (hÀrefter AD) som en Organisationsenhet (OU), dÀr anvÀndare redan skapades.
Det var nödvÀndigt att ge anvÀndarna möjlighet att snabbt och enkelt fÄ kontaktuppgifter till den nödvÀndiga medarbetaren frÄn AD, samtidigt som systemadministratörerna befriades frÄn den rutinmÀssiga redigeringen av en textfil som fungerade som en adressbok.
Det fanns inga fÀrdiga lÀmpliga alternativ för att lösa den stÀllda uppgiften, sÄ vi var tvungna att göra allt sjÀlva med vÄra egna hÀnder och tankar.
LÄt oss börja med att vi först behöver bestÀmma oss för vad vi ska anvÀnda, vilket Àr enkelt - den slutgiltiga katalogen ska vara tillgÀnglig för alla domÀnens anvÀndare via webblÀsaren. Det första som kommer i Ätanke Àr PHP i kombination med LDAP, och det kommer vi att anvÀnda. En stor fördel med att anvÀnda PHP Àr dess relativa enkelhet - vem som helst som har en grundlÀggande förstÄelse för systemadministration kan vid behov göra de nödvÀndiga Àndringarna i koden utan att det krÀvs sÀrskilt mycket anstrÀngning.
SÄ, vi sÀtter igÄng. Först definierar vi anslutningsparametrarna till domÀnen:
$srv ="SERVER";
$srv_domain ="DOMAIN.COM";
$srv_login ="USERNAME@".$srv_domain;
$srv_password ="PASSWORD";
NĂ€sta steg Ă€r att bestĂ€mma i vilken OU vi ska söka efter anvĂ€ndare. Detta görs genom att fĂ„nga vĂ€rdet frĂ„n $_GET[âplaceâ]. Till exempel, om anvĂ€ndaren gĂ„r till adressen first, sĂ„ kommer variabeln $place att fĂ„ vĂ€rdet 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;
// hÀr kan fler villkor lÀggas till.
default:
$doscript=false;
break;
}
if (!$doscript) include "main_table.html";
Variabel $doscript Àr nödvÀndig för att lagra vÀrdet - om vi har definierat vilken OU vi ska söka efter anvÀndare eller inte. Om inga trÀffar hittas i "switch-case", sÄ blir $doscript=false, vilket innebÀr att huvuddelen av skriptet inte kommer att köras, utan start sidan "main_table.html" kommer att visas (mer om den i slutet).
Om vi har definierat OU, sÄ gÄr vi vidare med nÀsta steg: vi börjar skapa en anvÀndarsida för katalogen:
annars om ($doscript) {
{echo "
<!DOCTYPE html>
<html xmlns='http://www.w3.org/1999/xhtml'>
<head>
<link rel='shortcut icon' href='ico.png'>
<meta charset='windows-1251/ '>
Vi aktiverar stilar för ett trevligare utseende (ja, de kunde ha kopplats som en css-fil, men vissa versioner av IE vill inte tolka stilar pÄ det sÀttet, sÄ vi mÄste skriva dem direkt i skriptet):
*{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;}
Stilarna Àr klara, nu skriver vi flikens titel och skapar en anvÀndbar lÀnk tillbaka till startsidan:
<title>Adressbok för «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>Till startsidan</p></a>
</td></tr></table>
";
Vi definierar sökfilter för AD och fÄr data om OU:
$filter ="(&(objectcategory=user)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))"; // alla anvÀndare, förutom inaktiverade.
$filter2 ="(objectCategory=OrganizationalUnit)"; // för att hÀmta information om 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]; // namn pÄ plats
$PlaceAddres = $placeinfo[0]["street"][0]; // adress pÄ plats
$PlaceMail = $placeinfo[0]["description"][0]; // mailadress för platsen
$PlacePhone = $placeinfo[0]["st"][0]; // telefonnummer för platsen
DÀrefter formaterar vi den övre delen av sidan:
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"> Nr </td>
<td width='300' bgcolor = "#f0f0e4"> Namn </td>
<td width='250' bgcolor = "#f0f0e4"> E-post </td>
<td width='60' bgcolor = "#f0f0e4"> Telefon </td>
<td width='150' bgcolor = "#f0f0e4"> Mobile </td></tr>
<tr><td></td><td> OU-data </td><td>";
echo "<div class='transition-rotate'><a href="mailto:"" . $placemail .">" . $PlaceMail ." </a></div>";
echo "</td><td width='150'> " . $PlacePhone ." </td><td> - </td></tr>";
Sedan hÀmtar vi anvÀndardata i en loop och bearbetar dem, genom att för att dölja vissa (som t.ex. tjÀnstekonton), helt enkelt ange «hide» i fÀltet «rum» i anvÀndarens attribut i AD, kommer dessa anvÀndare inte att visas i förteckningen:
for ($i=0; $i<$info["count"];$i++) {
$UserHide = $info[$i]["physicaldeliveryofficename"][0];
if ($UserHide != 'hide') {
$UserName = $info[$i]["cn"][0]; //AnvÀndarnamn
$UserPosition = $info[$i]["title"][0]; // Position
$UserMail = $info[$i]["mail"][0]; //mail
if (!$UserMail)) $UserMail = "-"; //om det inte finns nÄgon information om lÄdan i AD, visa ett streck
$UserIpPhone = $info[$i]["ipphone"][0]; //ip telefon
if (!$UserIpPhone) $UserIpPhone = "-"; //om det inte finns nÄgon information om lÄdan i AD, visa ett streck
$UserMobile = $info[$i]["mobile"][0]; //mobil
if (!$UserMobile) $UserMobile = "-"; //om det inte finns nÄgon information om lÄdan i AD, visa ett streck
Förresten, om du behöver hÀmta vÀrdet av en annan attribut, kom ihÄg (det Àr viktigt):
vi skickar namnet pÄ attributet i förfrÄgan med smÄ bokstÀver, annars fungerar det inte.
Och vi sÀtter in de erhÄllna data i tabellen:
echo "<tr>
<td>". $n+=1 ."</td>
<td> ". $UserName ."<br> <div class='smalltext'>". $UserPosition ."</div></td><td>"; // Användarnamn och position
if ($UserMail !='-') echo "<div class='transition-rotate'><a href="mailto:'$UserMail'">$UserMail </a></div>"; // om användaren har en e-postadress skapar vi en länk för att skicka ett meddelande
else echo "-"; // om det inte finns en e-postadress - sätter en bindestrek.
echo "<td> ". $UserIpPhone ." </td>
<td> ". $UserMobile ." </td></tr>";
}
}
echo "</table>";
DÀrefter stÀnger vi anslutningen via ldap, eller visar ett meddelande om att anslutningen till servern inte kunde upprÀttas:
ldap_close($ds);
}
else echo "<h4>Kunde inte ansluta till LDAP-servern</h4>";
echo '<br><br><br></body></html>';}
Filen «main_table.html» representerar i sig en enkel html-sida med lÀnkar och ser ungefÀr ut sÄ hÀr:
<head>
<link rel="shortcut icon" href="ico.png"/>
<meta charset="windows-1251"/>
<title>Adressbok för «YourMegaCompanyName»</title>
</head>
<body style='background-color:#ffffff;'>
<center><a href="index.php"><img border="none" src="logo.png"/></a></center>
<center><b>Platser och kontor</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>
Om nÄgon kan dra nytta av min kod - jag Àr glad, anvÀnd den fritt!
Du kan ocksÄ redigera den fritt som du vill (förbÀttra/försÀmra) och sprida den pÄ valfritt sÀtt.
Tack för uppmÀrksamheten!
KĂ€lla: habr.com
