Эҷоди директорияи суроғаи WEB PHP + LDAP

Чунин шуд, ки маъракаи (нисбатан) калон дорои офисҳои дурдасти зиёде бо шумораи муносиби корбарон буд. Ҳама офисҳо ба як шабака бо домени умумӣ пайваст карда шудаанд, ҳар як офис дар 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'] иҷро мекунем. Масалан, агар истифодабаранда ба суроға равад server/index.php?place=аввал, пас тағирёбанда $ҷой арзиш таъин карда мешавад аввал.

$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 намехоҳанд сабкҳои бо ин тарз муқарраршударо қабул кунанд, аз ин рӯ шумо бояд онҳоро мустақиман ба скрипт нависед):

<style>
	*{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;}
</style>

Мо бо услубҳо анҷом ёфтем, ҳоло мо унвони ҷадвалро менависем ва барои баргаштан ба саҳифаи асосӣ истиноди мувофиқро мекашем:

<title>Adressbook of «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];  			// name of place
$PlaceAddres = $placeinfo[0]["street"][0];		// address of place
$PlaceMail = $placeinfo[0]["description"][0]; 	// mail of place
$PlacePhone = $placeinfo[0]["st"][0]; 		// phone of plase

Минбаъд мо қисми болоии саҳифаро тарҳрезӣ мекунем:

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> Name </td>
	<td width='250' bgcolor = #f0f0e4> E-mail </td>
	<td width='60' bgcolor = #f0f0e4> Phone </td>
	<td width='150' bgcolor = #f0f0e4> Mobile </td></tr>
	<tr><td></td><td> Данные OU </td><td>";
echo "<div class='transition-rotate'><a href=mailto:" . $PlaceMail .">" . $PlaceMail ." </a></div>";
echo "</td><td width='150'> " . $PlacePhone ." </td><td> - </td></tr>";

Баъдан, мо маълумоти корбарро дар як ҳалқа қабул ва коркард мекунем, дар ҳоле ки барои пинҳон кардани баъзе ҳисобҳо (масалан, хидматрасонӣ), мо танҳо дар майдони "ҳуҷра" дар тафсилоти корбар дар 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];			//mail
if (!$UserMail)) $UserMail = "-";                  //если нет данных о ящике в AD, то отображаем прочерк
$UserIpPhone = $info[$i]["ipphone"][0];		//ip phone
	if (!$UserIpPhone) $UserIpPhone = "-";    //если нет данных о ящике в AD, то отображаем прочерк
$UserMobile = $info[$i]["mobile"][0];		//mobile
	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>Unable to connect to LDAP server</h4>"; 
echo '<br><br><br></body></html>';}

Файли "main_table.html" аз дарун як саҳифаи оддии html бо истинодҳост ва чунин менамояд:

<head>
<link rel="shortcut icon" href="ico.png"/>
<meta charset="windows-1251"/>
<title>Adressbook of «YourMegaCompanyName»</title>
</head>
<body style='background-color:#ffffff;'>
<center><a href=index.php><IMG border="none" src="logo.png"/></a></center>
<center><b>Places and offices</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>

Агар рамзи ман ба касе кӯмак кунад, ман хурсанд мешавам, онро истифода баред!

Шумо инчунин метавонед онро бо хоҳиши худ озодона таҳрир кунед (беҳтар/бадтар) ва бо ҳар роҳ паҳн кунед.

Ташаккур барои таваҷҷӯҳатон!

Манбаъ: will.com

Илова Эзоҳ