ویب ایڈریس ڈائرکٹری PHP + LDAP بنانا

ایسا ہوا کہ ایک (نسبتاً) بڑی مہم میں بہت سے دور دراز دفاتر تھے جن میں صارفین کی ایک معقول تعداد تھی۔ تمام دفاتر ایک مشترکہ ڈومین کے ساتھ ایک نیٹ ورک سے جڑے ہوئے ہیں، ہر دفتر کو ایکٹو ڈائرکٹری (اس کے بعد AD کہا جائے گا) میں ایک تنظیمی یونٹ (OU) کے طور پر بیان کیا گیا تھا، جس میں صارفین پہلے ہی بنائے گئے تھے۔

یہ ضروری تھا کہ صارفین کو فوری اور آسانی کے ساتھ AD سے مطلوبہ ملازم کی رابطہ کی معلومات حاصل کرنے کا موقع فراہم کیا جائے، اور سسٹم ایڈمنسٹریٹرز کو ٹیکسٹ فائل میں ایڈریس بک کا کردار ادا کرنے کے معمولات سے آزاد کیا جائے۔

مسئلہ کو حل کرنے کے لئے کوئی تیار شدہ مناسب اختیارات نہیں تھے، لہذا مجھے اپنے ہاتھوں اور سر سے سب کچھ کرنا پڑا.

آئیے اس حقیقت کے ساتھ شروع کرتے ہیں کہ پہلے آپ کو یہ فیصلہ کرنے کی ضرورت ہے کہ کیا استعمال کرنا ہے، یہ آسان ہے - حتمی ڈائریکٹری براؤزر کے ذریعے ڈومین کے تمام صارفین کے لیے دستیاب ہونی چاہیے۔ پہلی چیز جو ذہن میں آتی ہے وہ ہے ldap کے ساتھ مل کر پی ایچ پی، اور ہم انہیں استعمال کریں گے۔ میں پی ایچ پی کو استعمال کرنے کا بڑا فائدہ اس کی نسبتاً سادگی کو سمجھتا ہوں - کوئی بھی سسٹم ایڈمنسٹریٹر جس کی تھوڑی سی سمجھ بھی ہو، کوڈ میں ضروری تبدیلیاں کرنے کے قابل ہو جائے گا، اگر ضروری ہو تو، خاص طور پر دباؤ کے بغیر۔

تو، چلو شروع کرتے ہیں. پہلے، آئیے ڈومین سے منسلک ہونے کے لیے پیرامیٹرز سیٹ کریں:

$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

نیا تبصرہ شامل کریں