การสร้างไดเรกทอรีที่อยู่เว็บ 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'] เช่น หากผู้ใช้ไปยังที่อยู่นั้น เซิร์ฟเวอร์/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";

ตัวแปร $เอกสาร จำเป็นต้องจัดเก็บค่า - ไม่ว่าเราจะกำหนด 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>

หากรหัสของฉันช่วยใครได้ ฉันยินดีใช้มัน!

คุณยังสามารถแก้ไขได้อย่างอิสระตามที่คุณต้องการ (ปรับปรุง/แย่ลง) และแจกจ่ายด้วยวิธีใดก็ได้

ขอบคุณ!

ที่มา: will.com

เพิ่มความคิดเห็น