Belə oldu ki, (nisbətən) böyük bir şirkətin bir çox uzaq ofisi var idi, burada xeyli sayda istifadəçi yerləşirdi. Bütün ofislər bir domen altında bir şəbəkəyə qoşulmuşdu, hər bir ofis Active Directory (daha sonra AD) daxilində Təşkilat Vahidi (OU) kimi müəyyən edilmişdi, burada da artıq istifadəçilər yaradılmışdı.
İstifadəçilərə AD-dən lazım olan əməkdaşın əlaqə məlumatlarını sürətlə və asanlıqla əldə etməyə imkan vermək, sistem administratorlarını isə ünvan kitabı rolunu oynayan mətn faylını redaktə etməkii gündəlik işdən azad etmək tələb olunurdu.
Təyin olunmuş vəzifənin həlli üçün hazır variantlar tapılmadı, buna görə də hər şeyi öz əllərimizlə və başımızla etməyə məcbur olduq.
Başlayaraq, əvvəlcə nəyin istifadə ediləcəyini müəyyənləşdirməliyik, bu sadədir — yekun kataloq bütün domen istifadəçilərinə brauzer vasitəsilə əlçatan olmalıdır. İlk əvvəl ağlıma gələn PHP ilə ldap birləşməsidir, biz də onu istifadə edəcəyik. PHP-nin istifadəsinin böyük üstünlüyü onun nisbətən sadəliyə malik olmasıdır — hər hansı bir azca başa düşən sistem administratoru kodda, lazım olduqda, müvafiq dəyişiklikləri etməkdə çətinlik çəkməyəcək.
Beləliklə, başlayırıq. Əvvəlcə domenə qoşulma parametrlərini müəyyən edək:
$srv ="SERVER";
$srv_domain ="DOMAIN.COM";
$srv_login ="USERNAME@".$srv_domain;
$srv_password ="PASSWORD";
Növbəti addım, hansı OU-da istifadəçiləri axtaracağımızı müəyyənləşdirməkdir. Bunu $_GET[‘place’] dəyərlərini tutaraq edəcəyik. Məsələn, əgər istifadəçi aşağıdakı ünvanla keçid edirsə: first, o zaman dəyişkən $place dəyərinə aşağıdakı kimi təyin olunacaq: 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;
// buraya əlavə şərtlər əlavə oluna bilər.
default:
$doscript=false;
break;
}
if (!$doscript) include "main_table.html";
Dəyişən $doscript istifadəçiləri axtaracağımız OU-nu müəyyən edib-etmədiyimizi saxlamaq üçün lazımdır. Əgər «switch-case»də qeyd olunan uyğunluqlar tapılmasa, $doscript=false olar, əsas skript hissəsi icra edilməyəcək və "main_table.html" başlanğıc səhifəsi göstəriləcək (ona sonunda qısa məlumat verəcəyəm).
Əgər biz OU-u müəyyən etsək, onda irəliləyirik: istifadəçiyə kataloq səhifəsini tərtib etməyə başlayırıq:
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/ '>
Daha gözəl xarici görünüş üçün stil əlavə edirik (bəli, bunları css faylı kimi qoşmaq olardı, lakin bəzi IE versiyaları bu cür təyin olunmuş üslubları qəbul etmir, buna görə də stil mütləq skriptdə yazılmalıdır):
*{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;}
Stiləri bitirdik, indi tab başlığını yazırıq və ana səhifəyə rahat bir geri dönmə linki çəkirik:
<title>«YourMegaCompanyName»-ın Ünvanlar Kitabı</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>Əsas səhifə</p></a>
</td></tr></table>
";
AD üzrə axtarış filtrini müəyyənləşdiririk və OU haqqında məlumat alırıq:
$filter ="(&(objectcategory=user)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))"; // bütün istifadəçilər, deaktiv edilmişlərdən başqa.
$filter2 ="(objectCategory=OrganizationalUnit)"; // OU haqqında məlumat almaq üçün
$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]; // yerin adı
$PlaceAddres = $placeinfo[0]["street"][0]; // yerin ünvanı
$PlaceMail = $placeinfo[0]["description"][0]; // yerin e-poçtu
$PlacePhone = $placeinfo[0]["st"][0]; // yerin telefonu
Sonra səhifənin üst hissəsini düzəldirik:
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"> Ad </td>
<td width='250' bgcolor = "#f0f0e4"> E-mail </td>
<td width='60' bgcolor = "#f0f0e4"> Telefon </td>
<td width='150' bgcolor = "#f0f0e4"> Mobil </td></tr>
<tr><td></td><td> OU Məlumatları </td><td>";
echo "<div class='transition-rotate'><a href="mailto:"" . $placemail .">" . $PlaceMail ." </a></div>";
echo "</td><td width='150'> " . $PlacePhone ." </td><td> - </td></tr>";
Sonra loopda istifadəçi məlumatlarını alır və emal edirik, bununla yanaşı, bəzi (məsələn, xidmət) hesabları gizlətmək üçün AD-dakı istifadəçi xassələrində "hide" yazırıq, bu cür istifadəçilər kataloqda görünməyəcək:
for ($i=0; $i<$info["count"];$i++) {
$UserHide = $info[$i]["physicaldeliveryofficename"][0];
if ($UserHide != 'hide') {
$UserName = $info[$i]["cn"][0]; // İstifadəçi adı
$UserPosition = $info[$i]["title"][0]; // Vəzifə
$UserMail = $info[$i]["mail"][0]; // mail
if (!$UserMail) $UserMail = "-"; // Əgər AD-da poçt məlumatı yoxdursa, sadəcə mənasını göstəriyik.
$UserIpPhone = $info[$i]["ipphone"][0]; // ip telefon
if (!$UserIpPhone) $UserIpPhone = "-"; // Əgər AD-da poçt məlumatı yoxdursa, sadəcə mənasını göstəriyik.
$UserMobile = $info[$i]["mobile"][0]; // mobil
if (!$UserMobile) $UserMobile = "-"; // Əgər AD-da poçt məlumatı yoxdursa, sadəcə mənasını göstəriyik.
Bilməlisiniz ki, başqa bir atributun dəyərini əldə etmək lazım olduğu zaman:
sorğuda atributun adını kiçik hərflərlə, əks halda işləmir.
Və əldə olunan məlumatları cədvələ daxil edirik:
echo "<tr>
<td>". $n+=1 ."</td>
<td> ". $UserName ."<br> <div class='smalltext'>". $UserPosition ."</div></td><td>"; // İstifadəçi adı və vəzifə
if ($UserMail !='-') echo "<div class='transition-rotate'><a href="mailto:'$UserMail'">$UserMail </a></div>"; // əgər istifadəçinin e-maili varsa, məktub göndərmək üçün link yaradılır
else echo "-"; // əgər e-mail yoxdursa - tire qoyuruq.
echo "<td> ". $UserIpPhone ." </td>
<td> ". $UserMobile ." </td></tr>";
}
}
echo "</table>";
Daha sonra ldap bağlantısını kapatıyoruz ya da sunucuya bağlanmanın mümkün olmadığını belirten bir mesaj veriyoruz:
ldap_close($ds);
}
else echo "<h4>LDAP server ilə əlaqə qura bilmir</h4>";
echo '<br><br><br></body></html>';}
«main_table.html» dosyası, içinde bağlantılar bulunan basit bir HTML sayfasıdır ve yaklaşık olarak şöyle görünmektedir:
<head>
<link rel="shortcut icon" href="ico.png"/>
<meta charset="windows-1251"/>
<title>«YourMegaCompanyName»-ın Ünvanlar Kitabı</title>
</head>
<body style='background-color:#ffffff;'>
<center><a href="index.php"><img border="none" src="logo.png"/></a></center>
<center><b>Mekanlar və ofislər</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>
Eğer kodum birilerine yardımcı olursa — memnun olurum, kullanın!
Ayrıca onu istediğiniz gibi özgürce düzenleyebilir (geliştirebilir/bozabilirsiniz) ve her türlü yöntemle dağıtabilirsiniz.
Diqqətiniz üçün təşəkkür edirəm!
Mənbə: habr.com
