Kami membuat direktori alamat WEB dari PHP + LDAP

Kebetulan kampanye (relatif) besar memiliki banyak kantor jarak jauh dengan jumlah pengguna yang layak. Semua kantor terhubung ke jaringan yang sama dengan domain yang sama, masing-masing kantor didefinisikan dalam Active Directory (selanjutnya disebut AD) sebagai Unit Organisasi (OU), di mana pengguna sudah didirikan.

Itu perlu untuk memberikan pengguna kesempatan untuk dengan cepat dan tanpa banyak usaha mendapatkan detail kontak karyawan yang diperlukan dari AD, dan administrator sistem untuk membebaskan dari rutinitas mengedit file teks yang memainkan peran buku alamat.


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

Untuk memulainya, pertama Anda harus memutuskan apa yang akan digunakan, itu sederhana - panduan akhir harus dapat diakses oleh semua pengguna domain melalui browser. Hal pertama yang terlintas dalam pikiran adalah PHP dalam hubungannya dengan ldap, dan kita akan menggunakannya. Keuntungan terbesar menggunakan PHP, saya anggap kesederhanaan relatifnya, adalah bahwa siapa pun dengan sedikit pemahaman tentang administrator sistem dapat membuat perubahan yang diperlukan pada kode, jika perlu, tanpa terlalu memaksakan.

Jadi, mari kita mulai. Pertama, mari kita tentukan parameter koneksi domain:

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

Poin selanjutnya adalah menentukan OU mana yang akan kita cari pengguna. Kami akan melakukan ini dengan memotong nilai dari $ _GET ['place']. Sebagai contoh, jika pengguna pergi ke server / index.php? Place = pertama , maka variabel $ place akan diberi nilai terlebih dahulu .

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

The variabel $ doscript yang diperlukan untuk menyimpan nilai - apakah kita telah menentukan OU di mana kita akan mencari pengguna atau tidak. Jika tidak ada kecocokan yang terdaftar di "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 akhir).

Jika kami mendefinisikan OU, maka kami melanjutkan dengan tindakan lebih lanjut: kami mulai menggambar halaman manual 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, mereka dapat dihubungkan sebagai file css, namun, beberapa versi IE tidak ingin melihat gaya yang ditetapkan dengan cara ini, jadi Anda harus menulis langsung ke 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>

Gaya sudah selesai, sekarang tulis judul tab dan buat tautan 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 menentukan filter pencarian oleh 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, gambar 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 mendapatkan dan memproses data pengguna dalam satu lingkaran, dan untuk menyembunyikan beberapa (misalnya, layanan) akun, kami cukup menentukan "sembunyikan" di bidang "ruang" di detail pengguna dalam AD, pengguna tersebut tidak akan ditampilkan 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,   

Ngomong-ngomong, jika Anda perlu mendapatkan nilai atribut lain, ingat (ini penting):
dalam permintaan kami memberikan nama atribut dalam huruf kecil , jika tidak maka tidak akan berfungsi.

Dan kami menempelkan data yang diterima ke 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, kami menutup koneksi melalui ldap, atau menampilkan pesan tentang ketidakmungkinan menghubungkan 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" secara internal mewakili halaman html sederhana dengan tautan, 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 seseorang - saya akan senang menggunakannya!

Anda juga dapat mengeditnya secara bebas sesuai keinginan (memperbaiki / menurunkan) dan mendistribusikannya dengan metode apa pun.

Terimakasih atas perhatiannya!

All Articles