PHP + LDAP WEB хаягийн лавлах үүсгэх

(Харьцангуй) том кампанит ажил нь хангалттай тооны хэрэглэгчидтэй олон алслагдсан оффисуудтай болсон. Бүх оффисууд нийтлэг домэйн бүхий нэг сүлжээнд холбогдсон бөгөөд оффис бүрийг Active Directory (цаашид AD гэх) дээр хэрэглэгчид аль хэдийн үүсгэсэн Байгууллагын нэгж (OU) гэж тодорхойлсон.

Хэрэглэгчдэд шаардлагатай ажилтны холбоо барих мэдээллийг AD-аас хурдан бөгөөд хялбархан олж авах боломжийг олгох, системийн администраторуудыг хаягийн дэвтэрийн үүрэг гүйцэтгэдэг текст файлыг засварлах горимоос чөлөөлөх шаардлагатай байв.

Асуудлыг шийдвэрлэхэд тохиромжтой бэлэн сонголтууд байхгүй байсан тул би бүх зүйлийг өөрийн гараар, толгойгоор хийх хэрэгтэй болсон.

Эхлээд та юу ашиглахаа шийдэх хэрэгтэй гэдгийг эхэлцгээе, энэ нь энгийн зүйл - эцсийн лавлах нь домэйны бүх хэрэглэгчдэд хөтөчөөр дамжуулан ашиглах боломжтой байх ёстой. Хамгийн түрүүнд санаанд орж байгаа зүйл бол LDAP-тай PHP бөгөөд бид тэдгээрийг ашиглах болно. 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>

Хэрэв миний код хэн нэгэнд тус болвол би баяртай байх болно, үүнийг ашигла!

Мөн та хүссэнээрээ чөлөөтэй засварлаж (сайжруулах/мууруулах) ямар ч аргаар хамаагүй тарааж болно.

Таны анхаарлын төвд баярлалаа!

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх