Notika tā, ka (salīdzinoši) lielai kompānijai bija daudz attālinātu biroju, kuros strādāja ievērojams skaits lietotāju. Visi biroji bija savienoti vienā tīklā ar kopēju domēnu, katrs birojs tika noteikts Active Directory (turpmāk tekstā AD) kā Organizācijas Vienība (OU), kurā jau tika izveidoti lietotāji.
Bija nepieciešams nodrošināt lietotājiem iespēju ātri un bez liekām pūlēm iegūt kontaktinformāciju par nepieciešamo darbinieku no AD, kā arī atbrīvot sistēmas administratorus no rutīnas, kas saistīta ar teksta faila, kas kalpoja kā adresātu grāmata, rediģēšanu.
Nav atrasti gatavi risinājumi uzdotajai problēmai, tāpēc nācās visu darīt ar savām rokām un galvu.
Sāksim ar to, ka vispirms jānosaka, ko izmantot, tas ir vienkārši — galīgais katalogs jāpadara pieejams visiem domēna lietotājiem, izmantojot pārlūkprogrammu. Pirmais, kas nāk prātā, ir PHP kopā ar ldap, tie ir jāizmanto. Lielā priekšrocība, izmantojot PHP, ir tā relatīvā vienkāršība — jebkurš, kas nedaudz saprot, varēs veikt nepieciešamās izmaiņas kodā, ne īpaši piepūloties.
Tātad, sāciet. Vispirms iestatām savienojuma parametrus ar domēnu:
$srv ="SERVER";
$srv_domain ="DOMAIN.COM";
$srv_login ="USERNAME@".$srv_domain;
$srv_password ="PASSWORD";
Nākamais solis ir noteikt, kurā OU mēs meklēsim lietotājus. To darīsim, pārņemot vērtības no $_GET[‘place’]. Piemēram, ja lietotājs pāriet uz adresi first, tad mainīgajam $place tiks piešķirta vērtība 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;
// šeit var pievienot vēl nosacījumus.
default:
$doscript=false;
break;
}
if (!$doscript) include "main_table.html";
Mainīgais $doscript ir nepieciešams, lai saglabātu vērtību — vai mēs esam noteikuši OU, kurā meklēsim lietotājus vai nē. Ja nesanāk atrast nevienu atbilstību, kas minētas "switch-case", tad $doscript=false, galvenā skripta daļa netiks izpildīta un tiks parādīta sākumlapas "main_table.html" (par to pastāstīšu beigās).
Ja mēs esam noteikuši OU, tad turpinām ar nākamajiem soļiem: sākam veidot adresāta katalogu lietotājam:
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/ '>
Iekļaujam stilus, lai nodrošinātu patīkamāku izskatu (jā, tos varēja pievienot kā css failu, taču dažas IE versijas nevēlas atpazīt stilus tādā veidā, tādēļ ir jāraksta tieši skriptā):
*{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;}
/* Nepāra rindas */#table tbody tr:nth-child(odd){background: #fff;}
/* Pāra rindas */#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;}
Stili ir beigušies, tagad rakstām cilnes virsrakstu un izveidojam ērtu atgriešanās saiti uz sākumlapu:
<title>«YourMegaCompanyName» adresu grāmata</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>Uz sākumlapu</p></a>
</td></tr></table>
";
Nosakām meklēšanas filtrus pēc AD un iegūstam datus par OU:
$filter ="(&(objectcategory=user)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))"; // visi lietotāji, izņemot atslēgtos.
$filter2 ="(objectCategory=OrganizationalUnit)"; // informācijas iegūšanai par 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]; // vietas nosaukums
$PlaceAddres = $placeinfo[0]["street"][0]; // vietas adrese
$PlaceMail = $placeinfo[0]["description"][0]; // vietas e-pasts
$PlacePhone = $placeinfo[0]["st"][0]; // vietas tālruņa numurs
Tālāk izveidojam lapas augšējo daļu:
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"> Nosaukums </td>
<td width='250' bgcolor = "#f0f0e4"> E-pasts </td>
<td width='60' bgcolor = "#f0f0e4"> Telefons </td>
<td width='150' bgcolor = "#f0f0e4"> Mobilais </td></tr>
<tr><td></td><td> OU dati </td><td>";
echo "<div class='transition-rotate'><a href="mailto:"" . $placemail .">" . $PlaceMail ." </a></div>";
echo "</td><td width='150'> " . $PlacePhone ." </td><td> - </td></tr>";
Tālāk mēs iegūstam datus par lietotājiem ciklā un apstrādājam tos, turklāt, lai slēptu dažus (piemēram, dienesta) kontus, vienkārši ierakstām „hide“ laukā „istaba“ lietotāja rekvizītos AD, šādi lietotāji netiks rādīti katalogā:
for ($i=0; $i<$info["count"];$i++) {
$UserHide = $info[$i]["physicaldeliveryofficename"][0];
if ($UserHide != 'hide') {
$UserName = $info[$i]["cn"][0]; //lietotāja vārds
$UserPosition = $info[$i]["title"][0]; //amats
$UserMail = $info[$i]["mail"][0]; //e-pasts
if (!$UserMail) $UserMail = "-"; //ja nav datu par kasti AD, tad rādām svītru
$UserIpPhone = $info[$i]["ipphone"][0]; //ip telefons
if (!$UserIpPhone) $UserIpPhone = "-"; //ja nav datu par kasti AD, tad rādām svītru
$UserMobile = $info[$i]["mobile"][0]; //mobilais
if (!$UserMobile) $UserMobile = "-"; //ja nav datu par kasti AD, tad rādām svītru
Starp citu, ja jums būs nepieciešams iegūt cita atribūta vērtību, tad atcerieties (tas ir svarīgi):
pieprasījumā ievadām atribūta vārdu mazajiem burtiem, citādi tas nedarbosies.
Un ievietojam iegūtos datus tabulā:
echo "<tr>
<td>". $n+=1 ."</td>
<td> ". $UserName ."<br> <div class='smalltext'>". $UserPosition ."</div></td><td>"; // Lietotāja vārds un amats
if ($UserMail !='-') echo "<div class='transition-rotate'><a href="mailto:'$UserMail'">$UserMail </a></div>"; // ja lietotājam ir e-pasts, izveidojam saiti uz vēstules sūtīšanu
else echo "-"; // ja nav e-pasta - mēs liekam mīnusu.
echo "<td> ". $UserIpPhone ." </td>
<td> ". $UserMobile ." </td></tr>";
}
}
echo "</table>";
Pēc tam mēs slēdzam ldap savienojumu vai izvadām ziņu par to, ka savienojums ar serveri nav iespējams:
ldap_close($ds);
}
else echo "<h4>Neizdevās pieslēgties LDAP serverim</h4>";
echo '<br><br><br></body></html>';}
Fails «main_table.html» no iekšpuses pārstāv vienkāršu html lapu ar saitēm un izskatās aptuveni šādi:
<head>
<link rel="shortcut icon" href="ico.png"/>
<meta charset="windows-1251"/>
<title>«YourMegaCompanyName» adresu grāmata</title>
</head>
<body style='background-color:#ffffff;'>
<center><a href="index.php"><img border="none" src="logo.png"/></a></center>
<center><b>Vietas un biroji</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>
Ja kādam noderēs mans kods — es būšu priecīgs, izmantojiet to!
Jūs arī varat brīvi to rediģēt, kā jums patīk (uzlabot/slikti izdarīt) un izplatīt jebkādiem veidiem.
Paldies par uzmanību!
Avots: habr.com
