Ustvarjamo WEB naslovni imenik PHP + LDAP

Zgodilo se je, da je (relativno) velika kampanja imela veliko oddaljenih pisarn, v katerih se je nahajalo kar nekaj uporabnikov. Vse pisarne so povezane v eno omrežje z skupno domeno, vsaka pisarna pa je bila določena v Active Directory (v nadaljevanju AD) kot Organizacijska enota (OU), v kateri so že bili ustvarjeni uporabniki.

Potrebno je bilo uporabnikom omogočiti hitro in brez posebnih težav pridobivanje kontaktnih podatkov potrebnega zaposlenega iz AD, ob tem pa razbremeniti sistemske administratorje ruti urejanja besedilne datoteke, ki je igrala vlogo imenika.

Ustreznih rešitev za postavljeni problem ni bilo, zato smo morali vse narediti sami in s svojo glavo.

Najprej se moramo odločiti, kaj bomo uporabili, kar je preprosto — končni imenik mora biti dostopen vsem uporabnikom domene prek brskalnika. Prvo, kar pride na misel, je PHP v kombinaciji z ldap, to bomo uporabili. Velika prednost uporabe PHP je njegova sorazmerna preprostost — vsak sistemski administrator, ki ima vsaj malo znanja, lahko po potrebi vnese potrebne popravke v kodo, ne da bi se preveč trudil.

Torej, začnimo. Najprej definirajmo parametre za povezavo z domeno:

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

Naslednji korak je določiti, v katerem OU bomo iskali uporabnike. To bomo naredili tako, da bomo zajeli vrednosti iz $_GET[‘place’]. Na primer, če uporabnik odpre naslov server/index.php?place=first, potem bo spremenljivki $place pridobljena vrednost first.

$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;
	// tukaj lahko dodate še druge pogoje.
default:
	$doscript=false; 
	break;
}
if (!$doscript) include "main_table.html";

Promenljiva $doscript je potrebna za shranjevanje vrednosti — ali smo določili OU, v katerem bomo iskali uporabnike ali ne. Če ni bilo najdenih ujemanj, navedenih v „switch-case“, potem $doscript=false, glavni del skripta se ne bo izvedel, temveč bo prikazana začetna stran „main_table.html“ (o njej bom govoril na koncu).

Če smo določili OU, potem nadaljujemo z naslednjimi koraki: začnemo oblikovati stran imenika za uporabnika:

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

Vključujemo sloge za bolj prijeten videz (da, lahko bi jih povezali kot css-datoteko, vendar določene različice IE ne želijo obravnavati slogov na ta način, zato jih moramo zapisati neposredno v skript):

*{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;}
	
	/* Lihe vrstice */#table tbody tr:nth-child(odd){background: #fff;}
	/* Sodne vrstice */   #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;}

Zdaj, ko smo končali s slogi, zapisujemo naslov zavihka in izrišemo udobno povezavo za vračilo na glavno stran:

<title>Adresar podjetja «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>Domov</p></a>
</td></tr></table>
";

Določamo iskalne filtre po AD in pridobivamo podatke o OU:

$filter ="(&(objectcategory=user)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))"; // vsi uporabniki, razen izključenih.
$filter2 ="(objectCategory=OrganizationalUnit)"; // za pridobitev informacij o 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];  			// ime kraja
$PlaceAddres = $placeinfo[0]["street"][0];		// naslov kraja
$PlaceMail = $placeinfo[0]["description"][0]; 	// elektronska pošta kraja
$PlacePhone = $placeinfo[0]["st"][0]; 		// telefon kraja

Nato oblikujemo zgornji del strani:

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">  Št. </td>
	<td width='300' bgcolor = "#f0f0e4"> Ime </td>
	<td width='250' bgcolor = "#f0f0e4"> E-pošta </td>
	<td width='60' bgcolor = "#f0f0e4"> Telefon </td>
	<td width='150' bgcolor = "#f0f0e4"> Mobilni </td></tr>
	<tr><td></td><td> Podatki 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>";

Nato v zanki pridobimo in obdelamo podatke uporabnikov, pri čemer pa preprosto vpišemo 'hide' v polje 'soba' v lastnostih uporabnika v AD, da skrijemo nekatere (na primer službene) račune, takšni uporabniki ne bodo prikazani v imeniku:

for ($i=0; $i < $info["count"]; $i++) { 
$UserHide = $info[$i]["physicaldeliveryofficename"][0];
if ($UserHide != 'hide') {
$UserName = $info[$i]["cn"][0];                //Ime korisnika
$UserPosition = $info[$i]["title"][0]; 		// Pozicija
$UserMail = $info[$i]["mail"][0];			//mail
if (!$UserMail) $UserMail = "-";                  //ako nema podataka o pošti u AD, prikazujemo crtu
$UserIpPhone = $info[$i]["ipphone"][0];		//ip telefon
	if (!$UserIpPhone) $UserIpPhone = "-";    //ako nema podataka o pošti u AD, prikazujemo crtu
$UserMobile = $info[$i]["mobile"][0];		//mobilni
	if (!$UserMobile) $UserMobile = "-";     //ako nema podataka o pošti u AD, prikazujemo crtu

Usput, ako trebate dobiti vrednost drugog atributa, zapamtite (to je važno):
u zahtevu predajemo ime atributa malim slovima, inače neće raditi.

I umetnemo dobijene podatke u tabelu:

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

Zatim zatvaramo LDAP konekciju, ili prikazujemo poruku o nemogućnosti povezivanja na server:

ldap_close($ds); 
} 
else echo "<h4>Ni mogoče se je povezati na LDAP strežnik</h4>"; 
echo '<br><br><br></body></html>';}

Fajl "main_table.html" iznutra predstavlja jednostavnu html stranicu sa linkovima i izgleda otprilike ovako:

<head>
<link rel="shortcut icon" href="ico.png"/>
<meta charset="windows-1251"/>
<title>Adresar podjetja «YourMegaCompanyName»</title>
</head>
<body style='background-color:#ffffff;'>
<center><a href="index.php"><img border="none" src="logo.png"/></a></center>
<center><b>Prostor in pisarne</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>

Ako nekome pomogne moj kod — biću srećan, koristite ga!

Takođe možete slobodno menjati kako želite (poboljšavati/pogoršavati) i deliti na bilo koji način.

Hvala za pozornost!

Izvor: habr.com

Kupite zanesljivo gostovanje za spletne strani z zaščito pred DDoS, VPS VDS strežniki 🔥 Kupite zanesljivo gostovanje za spletne strani z zaščito pred DDoS, VPS VDS strežniki | ProHoster