Tạo thư mục địa chỉ WEB PHP + LDAP

Tình cờ là một chiến dịch (tương đối) lớn có nhiều văn phòng ở xa với số lượng người dùng khá. Tất cả các văn phòng được kết nối vào một mạng với một miền chung, mỗi văn phòng được xác định trong Active Directory (sau đây gọi là AD) là một Đơn vị tổ chức (OU), trong đó người dùng đã được tạo.

Cần phải cung cấp cho người dùng cơ hội lấy thông tin liên hệ của nhân viên được yêu cầu từ AD một cách nhanh chóng và dễ dàng, đồng thời giải phóng quản trị viên hệ thống khỏi thói quen chỉnh sửa tệp văn bản đóng vai trò sổ địa chỉ.

Không có sẵn các phương án phù hợp để giải quyết vấn đề nên tôi phải tự tay làm mọi việc bằng chính đôi tay và cái đầu của mình.

Hãy bắt đầu với thực tế là trước tiên bạn cần quyết định nên sử dụng cái gì, thật đơn giản - thư mục cuối cùng phải có sẵn cho tất cả người dùng miền thông qua trình duyệt. Điều đầu tiên bạn nghĩ đến là PHP kết hợp với ldap và chúng ta sẽ sử dụng chúng. Tôi coi lợi thế lớn của việc sử dụng PHP là tính đơn giản tương đối của nó - bất kỳ quản trị viên hệ thống nào dù chỉ có một chút hiểu biết cũng có thể thực hiện các thay đổi cần thiết đối với mã, nếu cần, mà không đặc biệt căng thẳng.

Vì vậy, hãy bắt đầu. Đầu tiên chúng ta thiết lập các thông số để kết nối với miền:

$srv ="SERVER";
$srv_domain ="DOMAIN.COM";
$srv_login ="USERNAME@".$srv_domain; 
$srv_password ="PASSWORD";

Điểm tiếp theo là xác định OU nào chúng tôi sẽ tìm kiếm người dùng. Chúng tôi sẽ thực hiện việc này bằng cách chặn các giá trị từ $_GET['place']. Ví dụ: nếu người dùng truy cập địa chỉ máy chủ/index.php?place=Thành phố điện khí hóa phía tây dãy núi Rocky đầu tiên, thì biến $địa điểm sẽ được gán một giá trị Thành phố điện khí hóa phía tây dãy núi Rocky đầu tiên.

$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";

Biến $doscript là cần thiết để lưu trữ giá trị - cho dù chúng tôi đã xác định OU mà chúng tôi sẽ tìm kiếm người dùng trong đó hay chưa. Nếu không có kết quả trùng khớp nào được liệt kê trong “switch-case”, thì $doscript=false, phần chính của tập lệnh sẽ không được thực thi và trang bắt đầu “main_table.html” sẽ được hiển thị (Tôi sẽ cho bạn biết về nó ở cuối).

Nếu chúng tôi đã xác định OU, thì chúng tôi sẽ tiến hành các hành động tiếp theo: chúng tôi bắt đầu vẽ trang thư mục cho người dùng:

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/ '>

Chúng tôi bao gồm các kiểu để có giao diện dễ chịu hơn (vâng, chúng có thể được đưa vào dưới dạng tệp css, nhưng một số phiên bản IE không muốn chấp nhận các kiểu được đặt theo cách này, vì vậy bạn phải viết chúng trực tiếp vào tập lệnh):

<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>

Chúng ta đã hoàn thành các kiểu, bây giờ chúng ta viết tiêu đề của tab và vẽ một liên kết thuận tiện để quay lại trang chính:

<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>
";

Chúng tôi xác định bộ lọc tìm kiếm theo AD và lấy dữ liệu về 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

Tiếp theo chúng ta thiết kế phần đầu trang:

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>";

Tiếp theo, chúng tôi nhận và xử lý dữ liệu người dùng theo vòng lặp, trong khi để ẩn một số tài khoản (ví dụ: dịch vụ), chúng tôi chỉ cần nhập “ẩn” vào trường “phòng” trong chi tiết người dùng trong AD, những người dùng đó sẽ không bị hiển thị trong thư mục:

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, то отображаем прочерк

Nhân tiện, nếu bạn cần lấy giá trị của thuộc tính khác, thì hãy nhớ (điều này rất quan trọng):
trong yêu cầu chúng tôi chuyển tên thuộc tính chữ thường bức thư, nếu không nó sẽ không hoạt động.

Và chèn dữ liệu nhận được vào bảng:

    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>";

Tiếp theo, chúng tôi đóng kết nối ldap hoặc hiển thị thông báo về việc không thể kết nối với máy chủ:

ldap_close($ds); 
} 
else echo "<h4>Unable to connect to LDAP server</h4>"; 
echo '<br><br><br></body></html>';}

Tệp “main_table.html” nhìn từ bên trong là một trang html đơn giản có các liên kết và trông giống như thế này:

<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>

Nếu mã của tôi giúp được ai đó, tôi sẽ rất vui, hãy sử dụng nó!

Bạn cũng có thể tự do chỉnh sửa nó theo ý muốn (cải thiện/xấu đi) và phân phối nó bằng mọi cách.

Cảm ơn bạn!

Nguồn: www.habr.com

Thêm một lời nhận xét