Случи́ло се така, че една (относително) голяма компания имаше много отдалечени офиси, в които работеха значителен брой потребители. Всички офиси бяха свързани в една мрежа с общ домейн, а всеки офис беше определен в Active Directory (по-нататък AD) като Organization Unit (OU), в който вече бяха създадени потребители.
Необходимо беше да се предостави на потребителите възможността бързо и без особени усилия да получават контактните данни на необходимия служител от AD, а системните администратори да бъдат освободени от рутинната задача да редактират текстов файл, който играеше роля на адресна книга.
Не намерихме готови подходящи варианти за решаване на поставената задача, затова се наложи да направим всичко сами.
Нека започнем с това, че в началото трябва да определим какво ще използваме: това е просто — финалният справочник трябва да бъде достъпен за всички потребители в домейна чрез браузъра. Първото, което ми идва наум, е PHP в комбинация с ldap; именно тях ще използваме. Голямо предимство на PHP смятам, че е относителната му простота — всеки системен администратор, който макар малко разбира, може да направи нужните корекции в кода, без да се напряга особено.
И така, нека започнем. Първо, нека зададем параметрите за свързване с домейна:
$srv = "SERVER";
$srv_domain = "DOMAIN.COM";
$srv_login = "USERNAME@".$srv_domain;
$srv_password = "PASSWORD";
Следващата стъпка е да определим в кой OU ще търсим потребители. Ще направим това, като прихванем стойностите от $_GET[‘place’]. Например, ако потребителят премине по адрес first, тогава на променливата $place ще бъде присвоено значението 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;
//тук може да добавите още условия.
default:
$doscript=false;
break;
}
if (!$doscript) include "main_table.html";
Променлива $doscript е необходима, за да съхрани стойността — определили ли сме OU, в който ще търсим потребители или не. Ако не се намерят съвпадения, изброени в „switch-case“, то $doscript=false, основната част от скрипта няма да се изпълни и ще бъде изведена стартовата страница „main_table.html“ (за нея ще говоря в края).
Ако обаче сме определили OU, тогава пристъпваме към следващите действия: започваме да изготвяме страницата на справочника за потребителя:
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/ '>
Включваме стиловете за по-приятен външен вид (да, можехме да ги свържем като css файл, но някои версии на IE не приемат стиловете, зададени по този начин, затова трябва да ги пишем директно в скрипта):
*{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;}
Стилистиката е завършена, сега пишем заглавието на таба и рисуваме удобна връзка за връщане към началната страница:
<title>Адресна книга на «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>На главната страница</p></a>
</td></tr></table>
";
Определяме търсещите филтри за AD и получаваме данни за OU:
$filter ="(&(objectcategory=user)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))"; //всички потребители, освен деактивираните.
$filter2 ="(objectCategory=OrganizationalUnit)"; // за получаване на информация за 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]; // име на мястото
$PlaceAddres = $placeinfo[0]["street"][0]; // адрес на мястото
$PlaceMail = $placeinfo[0]["description"][0]; // имейл на мястото
$PlacePhone = $placeinfo[0]["st"][0]; // телефон на мястото
Следва оформяме горната част на страницата:
ехо"<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"> Е-поща </td>
<td width='60' bgcolor = "#f0f0e4"> Телефон </td>
<td width='150' bgcolor = "#f0f0e4"> Mobile </td></tr>
<tr><td></td><td> Данни OU </td><td>";
ехо "<div class='transition-rotate'><a href="mailto:"" . $placemail .">" . $PlaceMail ." </a></div>";
ехо "</td><td width='150'> " . $PlacePhone ." </td><td> - </td></tr>";
След това получаваме в цикъл и обработваме данни на потребителите, като за да скрием някои (например служебни) акаунти, просто вписваме «hide» в полето «стая» в атрибутите на потребителя в AD, такива потребители няма да се показват в справочника:
for ($i=0; $i<$info["count"];$i++) {
$UserHide = $info[$i]["physicaldeliveryofficename"][0];
if ($UserHide != 'hide') {
$UserName = $info[$i]["cn"][0]; //Име на потребителя
$UserPosition = $info[$i]["title"][0]; //Длъжност
$UserMail = $info[$i]["mail"][0]; //поща
if (!$UserMail)) $UserMail = "-"; //ако няма данни за пощенската кутия в AD, показваме тире
$UserIpPhone = $info[$i]["ipphone"][0]; //ip телефон
if (!$UserIpPhone) $UserIpPhone = "-"; //ако няма данни за пощенската кутия в AD, показваме тире
$UserMobile = $info[$i]["mobile"][0]; //мобилен
if (!$UserMobile) $UserMobile = "-"; //ако няма данни за пощенската кутия в AD, показваме тире
Между другото, ако ви е нужно да получите стойността на друг атрибут, запомнете (така е важно):
в заявката предаваме името на атрибута малки букви, иначе няма да работи.
И вмъкваме получените данни в таблицата:
echo "<tr>
<td>". $n+=1 ."</td>
<td> ". $UserName ."<br> <div class='smalltext'>". $UserPosition ."</div></td><td>"; // Потребителско име и позиция
if ($UserMail !='-') echo "<div class='transition-rotate'><a href="mailto:'$UserMail'">$UserMail </a></div>"; // ако потребителят има e-mail, създаваме връзка за изпращане на писмо
else echo "-"; // ако няма e-mail, поставяме тире.
echo "<td> ". $UserIpPhone ." </td>
<td> ". $UserMobile ." </td></tr>";
}
}
echo "</table>";
След това затваряме връзката по ldap или показваме съобщение за невъзможност за свързване с сървъра:
ldap_close($ds);
}
else echo "<h4>Неуспешно свързване с LDAP сървъра</h4>";
echo '<br><br><br></body></html>';}
Файлът «main_table.html» отвътре представлява проста html страница с линкове и изглежда приблизително така:
<head>
<link rel="shortcut icon" href="ico.png"/>
<meta charset="windows-1251"/>
<title>Адресна книга на «YourMegaCompanyName»</title>
</head>
<body style='background-color:#ffffff;'>
<center><a href="index.php"><img border="none" src="logo.png"/></a></center>
<center><b>Места и офиси</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">ОУ1</a></td></tr>
<tr id="space"><td></td></tr>
<tr><td align="left" id="abz"><a href="index.php?place=ou2">ОУ2</a></td></tr>
</table></body></html>
Ако на някого помогне моят код — ще бъда радостен, ползвайте!
Също така можете свободно да го редактирате по ваше желание (да подобрите/влошите) и да го разпространявате по всякакви начини.
Благодаря за вниманието!
Източник: habr.com
