ويب ايڊريس ڊاريڪٽري ٺاهڻ PHP + LDAP

اهو ائين ٿيو آهي ته هڪ (نسبتا) وڏي مهم ۾ ڪيترن ئي ريموٽ آفيسون هيون جن ۾ صارفين جي هڪ مهذب تعداد هئي. سڀئي آفيسون ھڪڙي نيٽ ورڪ ۾ ھڪڙي عام ڊومين سان ڳنڍيل آھن، ھر ھڪڙي آفيس کي فعال ڊاريڪٽري ۾ بيان ڪيو ويو آھي (ھتي 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/ '>

اسان وڌيڪ خوشگوار ظهور لاءِ اسلوب شامل ڪريون ٿا (ها، اهي هڪ سي ايس ايس فائل طور شامل ڪري سگهجن ٿيون، پر 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>

جيڪڏهن منهنجو ڪوڊ ڪنهن جي مدد ڪري، مان خوش ٿيندس، ان کي استعمال ڪريو!

توھان پڻ آزاديءَ سان ان کي تبديل ڪري سگھو ٿا جيئن توھان چاھيو (بهتر/بدتر) ۽ ان کي ڪنھن به طريقي سان ورهائي سگھو ٿا.

Спасибо за внимание!

جو ذريعو: www.habr.com

تبصرو شامل ڪريو