E WEB Adressverzeechnes erstellen PHP + LDAP

Et ass geschitt, datt eng (relativ) grouss Campagne vill Fernbüroen mat enger uerdentlecher Unzuel u Benotzer hat. All Büroe sinn an engem Netz mat engem gemeinsame Domain verbonnen, all Büro gouf am Active Directory (nodréiglech AD bezeechent) als Organisatiounsunitéit (OU) definéiert, an där d'Benotzer scho geschaf goufen.

Et war néideg fir de Benotzer d'Méiglechkeet ze ginn fir séier an ouni Ustrengung d'Kontaktinformatioun vum erfuerderlechen Employé vun AD ze kréien, a gratis Systemadministratoren aus der Routine vun der Redaktioun vun enger Textdatei, déi d'Roll vun engem Adressbuch gespillt huet.

Et waren keng prett-gemaach gëeegent Optiounen fir de Problem ze léisen, also ech alles mat mengem eegenen Hänn a Kapp ze maachen.

Loosst eis mat der Tatsaach ufänken datt Dir als éischt musst entscheeden wat Dir benotzt, et ass einfach - de leschte Verzeechnes soll fir all Benotzer vun der Domain iwwer e Browser verfügbar sinn. Déi éischt Saach déi am Kapp kënnt ass PHP a Verbindung mat ldap, a mir wäerte se benotzen. Ech betruechten de grousse Virdeel fir PHP ze benotzen fir seng relativ Einfachheet ze sinn - all Systemadministrator mat souguer e bësse Verständnis wäert fäeg sinn déi néideg Ännerunge vum Code ze maachen, wann néideg, ouni besonnesch ustrengend.

Also, loosst eis ufänken. Als éischt, loosst eis d'Parameter setzen fir mat dem Domain ze verbannen:

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

Den nächste Punkt ass ze bestëmmen a wéi enger OU mir no Benotzer sichen. Mir wäerten dat maachen andeems Dir Wäerter vun $ _GET ['Plaz'] ofgefaangen. Zum Beispill, wann de Benotzer op d'Adress geet server/index.php?place=éischten, dann d'Variabel $ Plaz wäert de Wäert zougewisen ginn éischten.

$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 $Doskript ass néideg fir de Wäert ze späicheren - egal ob mir d'OU definéiert hunn an där mir no Benotzer sichen oder net. Wann et keng Mätscher am "Switch-Case" opgezielt sinn, dann $doscript=falsch, den Haaptdeel vum Skript gëtt net ausgefouert, an d'Startsäit "main_table.html" gëtt ugewisen (ech soen Iech iwwer et um Enn).

Wa mir eng OU definéiert hunn, da gi mir weider op weider Aktiounen: mir fänken un eng Verzeechnes Säit fir de Benotzer ze zéien:

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

Mir enthalen Stiler fir e méi agreabelt Erscheinungsbild (jo, si kéinten als CSS-Datei abegraff ginn, awer e puer Versioune vun IE wëllen net Stiler op dës Manéier akzeptéieren, also musst Dir se direkt an de Skript schreiwen):

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

Mir si fäerdeg mat de Stiler, elo schreiwen mir den Titel vun der Tab an zéien e praktesche Link fir op d'Haaptsäit zréckzekommen:

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

Mir definéieren Sichfilter no AD a kréien Daten iwwer d'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

Als nächst designe mir den Top vun der Säit:

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

Als nächst kréie mir d'Benotzerdaten an enger Loop a veraarbecht, wärend fir e puer (zum Beispill Service) Konten ze verstoppen, gi mir einfach "verstoppen" am Feld "Raum" an de Benotzerdetailer an AD, sou Benotzer ginn net am Verzeechnes ugewisen:

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

Iwwregens, wann Dir de Wäert vun engem aneren Attribut muss kréien, da erënnert Iech un (dëst ass wichteg):
an der Ufro passéiere mir den Attributnumm kleng Schrëft Bréiwer, soss geet et net.

A füügt déi kritt Donnéeën an d'Tabell un:

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

Als nächst maache mir d'LDap Verbindung zou, oder weisen e Message iwwer d'Onméiglechkeet fir mam Server ze verbannen:

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

D'Datei "main_table.html" vu bannen ass eng einfach HTML Säit mat Linken, a gesäit sou eppes aus:

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

Wann mäi Code iergendeen hëlleft, wäert ech frou sinn, benotzt et!

Dir kënnt et och fräi änneren wéi Dir wëllt (verbesseren/schlëmmeren) an op all Manéier verdeelen.

Merci fir Är Opmierksamkeet!

Source: will.com

Setzt e Commentaire