Krijimi i një drejtorie adresash WEB PHP + LDAP

Kështu ndodhi që një fushatë (relativisht) e madhe kishte shumë zyra të largëta me një numër të mirë përdoruesish. Të gjitha zyrat janë të lidhura në një rrjet me një domen të përbashkët, secila zyrë është përcaktuar në Active Directory (në tekstin e mëtejmë AD) si një Njësi Organizative (OU), në të cilën përdoruesit janë krijuar tashmë.

Ishte e nevojshme t'u jepej përdoruesve mundësinë që shpejt dhe pa mundim të merrnin informacionin e kontaktit të punonjësit të kërkuar nga AD, dhe administratorët e sistemit të lironin nga rutina e redaktimit të një skedari teksti që luante rolin e një libri adresash.

Nuk kishte opsione të gatshme të përshtatshme për zgjidhjen e problemit, kështu që më duhej të bëja gjithçka me duart dhe kokën time.

Le të fillojmë me faktin se së pari duhet të vendosni se çfarë të përdorni, është e thjeshtë - drejtoria përfundimtare duhet të jetë e disponueshme për të gjithë përdoruesit e domenit përmes një shfletuesi. Gjëja e parë që ju vjen në mendje është PHP në lidhje me ldap, dhe ne do t'i përdorim ato. Unë e konsideroj avantazhin e madh të përdorimit të PHP-së si thjeshtësinë e tij relative - çdo administrator i sistemit me sado pak kuptim do të jetë në gjendje të bëjë ndryshimet e nevojshme në kod, nëse është e nevojshme, pa u sforcuar veçanërisht.

Pra, le të fillojmë. Së pari, le të vendosim parametrat për t'u lidhur me domenin:

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

Pika tjetër është të përcaktojmë se në cilën OU do të kërkojmë për përdoruesit. Ne do ta bëjmë këtë duke përgjuar vlerat nga $_GET['place']. Për shembull, nëse përdoruesi shkon në adresën server/index.php?place=i parë, pastaj variabli $vend do t'i caktohet vlera i parë.

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

Ndryshore $doscript është e nevojshme për të ruajtur vlerën - nëse e kemi përcaktuar OU në të cilën do të kërkojmë përdoruesit apo jo. Nëse nuk ka përputhje të listuara në "switch-case", atëherë $doscript=false, pjesa kryesore e skriptit nuk do të ekzekutohet dhe faqja fillestare "main_table.html" do të shfaqet (unë do t'ju tregoj për atë në fund).

Nëse kemi përcaktuar një OU, atëherë vazhdojmë me veprime të mëtejshme: fillojmë të vizatojmë një faqe drejtorie për përdoruesin:

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

Ne përfshijmë stile për një pamje më të këndshme (po, ato mund të përfshihen si një skedar css, por disa versione të IE nuk duan të pranojnë stile të vendosura në këtë mënyrë, kështu që ju duhet t'i shkruani ato drejtpërdrejt në skenar):

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

Ne kemi mbaruar me stilet, tani shkruajmë titullin e skedës dhe nxjerrim një lidhje të përshtatshme për t'u kthyer në faqen kryesore:

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

Ne përcaktojmë filtrat e kërkimit sipas AD dhe marrim të dhëna për 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

Më tej ne hartojmë pjesën e sipërme të faqes:

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

Më pas, ne marrim dhe përpunojmë të dhënat e përdoruesit në një cikli, ndërsa për të fshehur disa llogari (për shembull, shërbimi), thjesht futim "fshih" në fushën "dhomë" në detajet e përdoruesit në AD, përdorues të tillë nuk do të jenë shfaqet në drejtori:

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

Nga rruga, nëse keni nevojë të merrni vlerën e një atributi tjetër, atëherë mbani mend (kjo është e rëndësishme):
në kërkesë kalojmë emrin e atributit shkronja të vogla letra, përndryshe nuk do të funksionojë.

Dhe futni të dhënat e marra në tabelë:

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

Më pas, mbyllim lidhjen ldap ose shfaqim një mesazh në lidhje me pamundësinë e lidhjes me serverin:

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

Skedari "main_table.html" nga brenda është një faqe e thjeshtë html me lidhje dhe duket diçka si kjo:

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

Nëse kodi im ndihmon dikë, do të jem i lumtur, ta përdor!

Ju gjithashtu mund ta modifikoni lirisht sipas dëshirës (përmirësoni/më keq) dhe ta shpërndani me çdo mjet.

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

Burimi: www.habr.com

Shto një koment