WEB adresi dizini oluşturma PHP + LDAP

Öyle oldu ki (nispeten) büyük bir kampanyanın makul sayıda kullanıcıya sahip çok sayıda uzak ofisi vardı. Tüm ofisler ortak bir etki alanına sahip tek bir ağa bağlanır; her ofis, Active Directory'de (bundan sonra AD olarak anılacaktır), kullanıcıların önceden oluşturulduğu bir Organizasyon Birimi (OU) olarak tanımlanmıştır.

Kullanıcılara, gerekli çalışanın iletişim bilgilerini AD'den hızlı ve zahmetsizce alma fırsatı vermek ve sistem yöneticilerini, adres defteri rolü oynayan bir metin dosyasını düzenleme rutininden kurtarmak gerekiyordu.

Sorunu çözmek için hazır uygun seçenekler yoktu, bu yüzden her şeyi kendi ellerimle ve kafamla yapmak zorunda kaldım.

Öncelikle ne kullanacağınıza karar vermeniz gerektiği gerçeğiyle başlayalım, bu çok basit - son dizin, bir tarayıcı aracılığıyla alan adının tüm kullanıcılarına açık olmalıdır. Aklımıza ilk gelen PHP'nin ldap ile birlikte kullanılmasıdır ve biz bunları kullanacağız. PHP kullanmanın en büyük avantajının göreceli basitliği olduğunu düşünüyorum; biraz bilgi sahibi olan herhangi bir sistem yöneticisi, gerekirse, özellikle zorlanmadan kodda gerekli değişiklikleri yapabilecektir.

Öyleyse başlayalım. Öncelikle alan adına bağlanmak için parametreleri ayarlayalım:

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

Bir sonraki nokta, kullanıcıları hangi OU'da arayacağımızı belirlemektir. Bunu $_GET['place']'den değerleri yakalayarak yapacağız. Örneğin, kullanıcı adrese giderse sunucu/index.php?place=ilk, ardından değişken $yer değer atanacak ilk.

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

değişken $doscript Kullanıcıları arayacağımız kuruluş birimini tanımlamış olsak da olmasak da, değeri depolamak için gereklidir. "Switch-case"de listelenen eşleşme yoksa $doscript=false, betiğin ana kısmı yürütülmeyecek ve "main_table.html" başlangıç ​​sayfası görüntülenecektir (size bundan bahsedeceğim) en sonunda).

Bir kuruluş birimi tanımlamışsak, daha sonraki işlemlere geçeriz: kullanıcı için bir dizin sayfası çizmeye başlarız:

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

Daha hoş bir görünüm için stiller ekliyoruz (evet, bunlar bir css dosyası olarak eklenebilir, ancak IE'nin bazı sürümleri bu şekilde ayarlanan stilleri kabul etmek istemez, bu nedenle bunları doğrudan komut dosyasına yazmanız gerekir):

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

Stillerle işimiz bitti, şimdi sekmenin başlığını yazıyoruz ve ana sayfaya dönmek için uygun bir bağlantı çiziyoruz:

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

Arama filtrelerini AD'ye göre tanımlarız ve kuruluş birimiyle ilgili verileri alırız:

$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

Daha sonra sayfanın üst kısmını tasarlıyoruz:

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

Daha sonra, kullanıcı verilerini bir döngü içinde alıp işleriz, bazı (örneğin, hizmet) hesapları gizlemek için, AD'deki kullanıcı ayrıntılarındaki "oda" alanına "gizle" yazmamız yeterlidir, bu tür kullanıcılar dizinde görüntülenir:

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

Bu arada, başka bir özelliğin değerini almanız gerekiyorsa şunu unutmayın (bu önemlidir):
istekte özellik adını iletiyoruz küçük harf harfler, aksi takdirde işe yaramaz.

Ve alınan verileri tabloya ekleyin:

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

Daha sonra ldap bağlantısını kapatıyoruz veya sunucuya bağlanmanın imkansızlığı hakkında bir mesaj görüntülüyoruz:

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

“Main_table.html” dosyası içeriden bakıldığında bağlantıları olan basit bir html sayfasıdır ve şuna benzer:

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

Eğer kodum birine yardımcı olursa, memnuniyetle kullanırım!

Ayrıca dilediğiniz gibi özgürce düzenleyebilir (iyileştirebilir/kötüleştirebilir) ve dilediğiniz şekilde dağıtabilirsiniz.

Teşekkürler!

Kaynak: habr.com

Yorum ekle