قم بإنشاء دليل عناوين 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";

النقطة التالية هي تحديد الوحدة التنظيمية التي سنبحث فيها عن المستخدمين. سنفعل ذلك عن طريق اعتراض القيم من $_GET['place']. على سبيل المثال، إذا ذهب المستخدم إلى العنوان الخادم/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 هناك حاجة لتخزين القيمة - سواء قمنا بتحديد الوحدة التنظيمية التي سنبحث فيها عن المستخدمين أم لا. إذا لم تكن هناك أي تطابقات مدرجة في "حالة التبديل"، ثم $doscript=false، فلن يتم تنفيذ الجزء الرئيسي من البرنامج النصي، وسيتم عرض صفحة البداية "main_table.html" (سأخبرك بذلك ذلك في النهاية).

إذا قمنا بتعريف الوحدة التنظيمية، فإننا ننتقل إلى المزيد من الإجراءات: نبدأ في رسم صفحة دليل للمستخدم:

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 ونحصل على بيانات حول الوحدة التنظيمية:

$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

إضافة تعليق