Случайно так сложилось, что у довольно крупной компании было множество удаленных офисов, в которых работало немало пользователей. Все офисы были объединены в одну сеть с общим доменом, каждый из которых был определен в Active Directory (далее AD) как организационная единица (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, тогда продолжаем: начинаем рисовать пользователю страницу справочника:
иначе ако ($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, показваме черта
Между другото, ако ви трябва да получите стойността на друг атрибут, помнете (това е важно):
в заявката предаваме името на атрибута с малки букви, иначе няма да проработи.
И вмъкваме получените данни в таблицата:
ехо "<tr>
<td>". $n+=1 ."</td>
<td> ". $UserName ."<br> <div class='smalltext'>". $UserPosition ."</div></td><td>"; \/\/\tПотребителско име и длъжност
\tif ($UserMail !='-') echo "<div class='transition-rotate'><a href="mailto:'$UserMail'">$UserMail </a></div>"; \/\/ ако потребителят има e-mail, създаваме връзка за изпращане на писмо
\тelse echo "-"; \/\/ако няма e-mail - слагаме тире.
\техо "<td> ". $UserIpPhone ." </td>
<td> ". $UserMobile ." </td></tr>";
\}
\}ехо "</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">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>
Ако на някого помогне моят код — ще се радвам, ползвайте!
Също така можете свободно да го редактирате както на вас ви харесва (да подобрявате/влошавате) и да го разпространявате по всякакви методи.
Благодаря за вниманието!
Източник: habr.com
