Membuat direktori alamat WEB PHP + LDAP

Kebetulan kampanye (yang relatif) besar memiliki banyak kantor terpencil dengan jumlah pengguna yang lumayan. Semua kantor terhubung ke dalam satu jaringan dengan domain yang sama, setiap kantor didefinisikan di Direktori Aktif (selanjutnya disebut AD) sebagai Unit Organisasi (OU), di mana pengguna telah dibuat.

Hal ini diperlukan untuk memberikan pengguna kesempatan untuk dengan cepat dan mudah mendapatkan informasi kontak karyawan yang diperlukan dari AD, dan membebaskan administrator sistem dari rutinitas mengedit file teks yang berperan sebagai buku alamat.

Tidak ada opsi siap pakai yang cocok untuk menyelesaikan masalah, jadi saya harus melakukan semuanya dengan tangan dan kepala saya sendiri.

Mari kita mulai dengan fakta bahwa pertama-tama Anda perlu memutuskan apa yang akan digunakan, sederhana - direktori akhir harus tersedia untuk semua pengguna domain melalui browser. Hal pertama yang terlintas dalam pikiran adalah PHP bersama dengan ldap, dan kami akan menggunakannya. Saya menganggap keuntungan besar menggunakan PHP adalah kesederhanaannya yang relatif - administrator sistem mana pun yang memiliki sedikit pemahaman akan dapat membuat perubahan yang diperlukan pada kode, jika perlu, tanpa terlalu memaksakan diri.

Jadi, mari kita mulai. Pertama, mari kita atur parameter untuk menghubungkan ke domain:

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

Poin selanjutnya adalah menentukan di OU mana kita akan mencari pengguna. Kami akan melakukan ini dengan mencegat nilai dari $_GET['place']. Misalnya, jika pengguna pergi ke alamat tersebut server/index.php?tempat=pertama, maka variabel $tempat akan diberi 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";

Variabel $doskrip diperlukan untuk menyimpan nilai - apakah kita telah menentukan OU tempat kita akan mencari pengguna atau belum. Jika tidak ada kecocokan yang tercantum dalam "switch-case", maka $doscript=false, bagian utama skrip tidak akan dieksekusi, dan halaman awal "main_table.html" akan ditampilkan (saya akan memberi tahu Anda tentang itu di bagian paling akhir).

Jika kita telah mendefinisikan OU, maka kita melanjutkan ke tindakan lebih lanjut: kita mulai menggambar 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 tampilan yang lebih menyenangkan (ya, gaya tersebut dapat dimasukkan sebagai file css, tetapi beberapa versi IE tidak mau menerima gaya yang diatur dengan cara ini, jadi Anda harus menuliskannya langsung 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>

Kita sudah selesai dengan gayanya, sekarang kita menulis judul tab dan menggambar link yang nyaman 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 mendefinisikan filter pencarian berdasarkan 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

Selanjutnya kita mendesain bagian 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>";

Selanjutnya, kami menerima dan memproses data pengguna dalam satu lingkaran, sedangkan untuk menyembunyikan beberapa akun (misalnya, layanan), kami cukup memasukkan "sembunyikan" di bidang "ruangan" di detail pengguna di AD, pengguna tersebut tidak akan ditampilkan di 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, то отображаем прочерк

Omong-omong, jika Anda perlu mendapatkan nilai atribut lain, ingatlah (ini penting):
dalam permintaan kami meneruskan nama atribut huruf kecil dalam surat, jika tidak maka tidak akan berhasil.

Dan masukkan data yang diterima ke dalam tabel:

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

Selanjutnya, kita menutup koneksi ldap, atau menampilkan pesan tentang ketidakmungkinan terhubung ke server:

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

File “main_table.html” dari dalam adalah halaman html sederhana dengan link, dan terlihat 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 kode saya membantu siapa pun, saya akan senang, gunakanlah!

Anda juga dapat dengan bebas mengeditnya sesuai keinginan (memperbaiki/memburuk) dan mendistribusikannya dengan cara apa pun.

Terima kasih!

Sumber: www.habr.com

Tambah komentar