WEB címtár létrehozása PHP + LDAP

Történt ugyanis, hogy egy (viszonylag) nagy kampánynak sok távoli irodája volt megfelelő számú felhasználóval. Minden iroda egyetlen hálózatba kapcsolódik egy közös tartományban, minden irodát az Active Directoryban (továbbiakban AD) szervezeti egységként (OU) definiáltak, amelyben már létrehozták a felhasználókat.

Lehetőséget kellett adni a felhasználóknak arra, hogy gyorsan és könnyedén megszerezhessék a keresett alkalmazott elérhetőségeit az AD-től, a rendszergazdákat pedig a címjegyzék szerepét betöltő szöveges fájl szerkesztésének rutinja alól.

Nem voltak kész megfelelő lehetőségek a probléma megoldására, így mindent saját kezemmel és fejjel kellett csinálnom.

Kezdjük azzal a ténnyel, hogy először el kell döntenie, hogy mit használjon, ez egyszerű - a végső könyvtárnak a domain minden felhasználója számára elérhetőnek kell lennie egy böngészőn keresztül. Az első dolog, ami eszünkbe jut, az a PHP az ldap-pal együtt, és ezeket fogjuk használni. A PHP használatának nagy előnyének a viszonylagos egyszerűségét tartom - minden, csak egy kicsit is értő rendszergazda, szükség esetén különösebb megerőltetés nélkül el tudja végezni a szükséges változtatásokat a kódon.

Szóval, kezdjük. Először állítsuk be a tartományhoz való csatlakozás paramétereit:

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

A következő pont annak meghatározása, hogy melyik szervezeti egységben fogunk felhasználókat keresni. Ezt úgy fogjuk megtenni, hogy elfogjuk a $_GET['place'] értékeit. Például, ha a felhasználó a címre megy szerver/index.php?place=első, majd a változó $hely érték lesz hozzárendelve első.

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

Változó $doscript szükséges az érték tárolásához - függetlenül attól, hogy meghatároztuk-e azt az OU-t, amelyben felhasználókat fogunk keresni, vagy sem. Ha nincs egyezés a „switch-case” listában, akkor $doscript=false, a szkript fő része nem fut le, és megjelenik a „main_table.html” kezdőlap (elmondom a legvégén).

Ha definiáltunk egy szervezeti egységet, akkor folytatjuk a további műveleteket: elkezdünk egy címtároldalt rajzolni a felhasználó számára:

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

A kellemesebb megjelenés érdekében stílusokat adunk hozzá (igen, css fájlként is szerepelhetnek, de az IE egyes verziói nem akarják elfogadni az így beállított stílusokat, ezért közvetlenül a szkriptbe kell írni):

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

Elkészültünk a stílusokkal, most írjuk a lap címét, és rajzolunk egy kényelmes hivatkozást a főoldalra való visszatéréshez:

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

AD alapján határozzuk meg a keresési szűrőket, és adatokat kapunk a szervezeti egységről:

$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

Ezután megtervezzük az oldal tetejét:

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

Ezután egy hurokban fogadjuk és dolgozzuk fel a felhasználói adatokat, míg egyes (például szolgáltatási) fiókok elrejtéséhez egyszerűen beírjuk a „hide” kifejezést a „szoba” mezőbe az AD felhasználói adatainál, az ilyen felhasználók nem lesznek a könyvtárban jelenik meg:

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

Mellesleg, ha meg kell szereznie egy másik attribútum értékét, akkor ne feledje (ez fontos):
a kérésben átadjuk az attribútum nevét kisbetűvel leveleket, különben nem fog működni.

És helyezze be a kapott adatokat a táblázatba:

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

Ezután bezárjuk az ldap kapcsolatot, vagy megjelenítünk egy üzenetet a szerverhez való csatlakozás lehetetlenségéről:

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

A „main_table.html” fájl belülről egy egyszerű html oldal hivatkozásokkal, és valahogy így néz ki:

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

Ha valakinek segít a kódom, annak örülök, használja!

Tetszés szerint szabadon szerkesztheti (javíthatja/rosszabbíthatja), és bármilyen módon terjesztheti.

Спасибо за внимание!

Forrás: will.com

Hozzászólás