PHP + LDAP WEB helbide-direktorio bat sortzea

Gertatu zen kanpaina (nahiko) handi batek urruneko bulego ugari zituela erabiltzaile dezenterekin. Bulego guztiak domeinu komun batekin sare batera konektatuta daude, bulego bakoitza Active Directoryn (aurrerantzean AD deitzen dena) Antolaketa Unitate (OU) gisa definitu zen, eta bertan erabiltzaileak jada sortu ziren.

Beharrezkoa zen erabiltzaileei AD-ren behar den langilearen kontaktu-informazioa azkar eta erraz lortzeko aukera ematea, eta sistema-administratzaileei helbide-liburuaren papera betetzen zuen testu-fitxategi bat editatzeko errutinatik libre.

Ez zegoen arazoa konpontzeko prest dauden aukera egokirik, beraz, dena nire esku eta buruekin egin behar nuen.

Has gaitezen lehenik eta behin zer erabili erabaki behar duzula, erraza da: azken direktorioa domeinuko erabiltzaile guztientzat erabilgarri egon beharko luke arakatzaile baten bidez. Burura datorkigun lehen gauza PHP da ldap-ekin batera, eta erabiliko ditugu. PHP erabiltzearen abantaila handia bere sinpletasun erlatiboa dela uste dut: ulermen txikia duen edozein sistema-administratzailek kodean beharrezko aldaketak egin ahal izango ditu, behar izanez gero, bereziki estutu gabe.

Beraz, has gaitezen. Lehenik eta behin, ezarri ditzagun domeinura konektatzeko parametroak:

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

Hurrengo puntua erabiltzaileak zein OUtan bilatuko ditugun zehaztea da. Hau $_GET ['lekua']-tik balioak atzemanez egingo dugu. Adibidez, erabiltzailea helbidera joaten bada server/index.php?place=lehen, gero aldagaia $lekua balioa esleituko zaio lehen.

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

Aldakorra $doskripzioa balioa gordetzeko behar da - erabiltzaileak bilatuko ditugun OU definitu dugun ala ez. "Switch-case" atalean bat-etortzerik ez badago, $doscript=false, script-aren zati nagusia ez da exekutatuko, eta hasierako orria "main_table.html" bistaratuko da (esango dizut amaieran).

OU bat definitu badugu, ekintza gehiagorekin jarraituko dugu: erabiltzailearen direktorioa orri bat marrazten hasiko gara:

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

Itxura atseginagoa izateko estiloak sartzen ditugu (bai, css fitxategi gisa sar litezke, baina IEren bertsio batzuek ez dute horrela ezarritako estiloak onartu nahi, beraz, zuzenean idatzi behar dituzu scriptean):

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

Estiloekin amaitu dugu, orain fitxaren izenburua idatzi eta orrialde nagusira itzultzeko esteka eroso bat marraztuko dugu:

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

Bilaketa-iragazkiak ADren arabera definitzen ditugu eta OU-ri buruzko datuak lortzen ditugu:

$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

Ondoren, orriaren goiko aldea diseinatzen dugu:

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

Ondoren, erabiltzailearen datuak begizta batean jasotzen eta prozesatzen ditugu, eta, aldiz, (adibidez, zerbitzu) kontu batzuk ezkutatzeko, "ezkutatu" besterik ez dugu sartu AD-ko erabiltzailearen xehetasunetan "gela" eremuan, erabiltzaile horiek ez dira izango. direktorioan bistaratzen da:

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

Bide batez, beste atributu baten balioa lortu behar baduzu, gogoratu (garrantzitsua da):
eskaeran atributuaren izena pasatzen dugu minuskula gutunak, bestela ez du funtzionatuko.

Eta sartu jasotako datuak taulan:

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

Ondoren, ldap konexioa itxiko dugu, edo zerbitzariarekin konektatzeko ezintasunari buruzko mezu bat bistaratuko dugu:

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

Barrutik dagoen "main_table.html" fitxategia estekak dituen html orri soil bat da, eta honelako itxura du:

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

Nire kodeak inori laguntzen badio, pozik egongo naiz, erabili!

Era berean, nahi duzun moduan libreki edita dezakezu (hobetu/okerrago) eta edozein bidetan banatu.

Eskerrik asko zure arreta!

Iturria: www.habr.com

Gehitu iruzkin berria