Mencipta direktori alamat WEB PHP + LDAP

Kebetulan kempen (agak) besar mempunyai banyak pejabat terpencil dengan bilangan pengguna yang baik. Semua pejabat disambungkan ke dalam satu rangkaian dengan domain biasa, setiap pejabat ditakrifkan dalam Active Directory (selepas ini dirujuk sebagai AD) sebagai Unit Organisasi (OU), di mana pengguna telah pun dicipta.

Ia adalah perlu untuk memberi pengguna peluang untuk mendapatkan maklumat hubungan pekerja yang diperlukan dengan cepat dan mudah daripada AD, dan membebaskan pentadbir sistem daripada rutin mengedit fail teks yang memainkan peranan sebagai buku alamat.

Tidak ada pilihan yang sesuai untuk menyelesaikan masalah, jadi saya terpaksa melakukan segala-galanya dengan tangan dan kepala saya sendiri.

Mari kita mulakan dengan fakta bahawa pertama sekali anda perlu memutuskan apa yang hendak digunakan, ianya mudah - direktori terakhir harus tersedia kepada semua pengguna domain melalui penyemak imbas. Perkara pertama yang terlintas di fikiran ialah PHP bersama-sama dengan ldap, dan kami akan menggunakannya. Saya menganggap kelebihan besar menggunakan PHP sebagai kesederhanaan relatifnya - mana-mana pentadbir sistem yang mempunyai sedikit pemahaman akan dapat membuat perubahan yang diperlukan pada kod, jika perlu, tanpa membebankan.

Jadi, mari kita mulakan. Mula-mula, mari kita tetapkan parameter untuk menyambung ke domain:

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

Perkara seterusnya adalah untuk menentukan di mana OU kami akan mencari pengguna. Kami akan melakukan ini dengan memintas nilai daripada $_GET['tempat']. Sebagai contoh, jika pengguna pergi ke alamat server/index.php?place=pertama, maka pemboleh ubah $tempat akan diberikan nilai pertama.

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

Pembolehubah $doskrip diperlukan untuk menyimpan nilai - sama ada kami telah menentukan OU di mana kami akan mencari pengguna atau tidak. Jika tiada padanan yang disenaraikan dalam "switch-case", maka $doscript=false, bahagian utama skrip tidak akan dilaksanakan dan halaman mula "main_table.html" akan dipaparkan (saya akan memberitahu anda tentang ia pada penghujungnya).

Jika kami telah menentukan OU, maka kami meneruskan ke tindakan selanjutnya: kami mula melukis halaman direktori untuk pengguna:

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

Kami menyertakan gaya untuk penampilan yang lebih menyenangkan (ya, ia boleh disertakan sebagai fail css, tetapi beberapa versi IE tidak mahu menerima gaya yang ditetapkan dengan cara ini, jadi anda perlu menulisnya terus ke dalam skrip):

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

Kami selesai dengan gaya, kini kami menulis tajuk tab dan melukis pautan yang mudah untuk kembali ke halaman utama:

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

Kami mentakrifkan penapis carian mengikut AD dan mendapatkan data tentang 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

Seterusnya kami mereka bentuk bahagian atas halaman:

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

Seterusnya, kami menerima dan memproses data pengguna dalam satu gelung, manakala untuk menyembunyikan beberapa akaun (contohnya, perkhidmatan), kami hanya memasukkan "sembunyikan" dalam medan "bilik" dalam butiran pengguna dalam AD, pengguna tersebut tidak akan dipaparkan dalam direktori:

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

Dengan cara ini, jika anda perlu mendapatkan nilai atribut lain, maka ingat (ini penting):
dalam permintaan kita lulus nama atribut huruf kecil surat, jika tidak, ia tidak akan berfungsi.

Dan masukkan data yang diterima ke dalam jadual:

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

Seterusnya, kami menutup sambungan ldap, atau memaparkan mesej tentang kemustahilan menyambung ke pelayan:

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

Fail "main_table.html" dari dalam ialah halaman html ringkas dengan pautan, dan kelihatan seperti ini:

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

Jika kod saya membantu sesiapa sahaja, saya akan gembira, gunakannya!

Anda juga boleh mengeditnya secara bebas mengikut kehendak anda (memperbaiki/memburukkan lagi) dan mengedarkannya dengan apa cara sekalipun.

Thank you!

Sumber: www.habr.com

Tambah komen