ایجاد دایرکتوری آدرس وب 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>";

در مرحله بعد، ما داده های کاربر را در یک حلقه دریافت و پردازش می کنیم، در حالی که برای مخفی کردن برخی از حساب های کاربری (مثلاً سرویس)، به سادگی در قسمت "room" در جزئیات کاربر در 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

اضافه کردن نظر