Ħolqien ta 'direttorju ta' indirizzi WEB PHP + LDAP

Ġara li kampanja (relattivament) kbira kellha ħafna uffiċċji remoti b'numru deċenti ta' utenti. L-uffiċċji kollha huma konnessi f'netwerk wieħed b'dominju komuni, kull uffiċċju kien definit f'Active Directory (minn hawn 'il quddiem imsejħa AD) bħala Unità ta' Organizzazzjoni (OU), li fiha diġà nħolqu utenti.

Kien meħtieġ li l-utenti jingħataw l-opportunità li jiksbu malajr u mingħajr sforz l-informazzjoni ta 'kuntatt tal-impjegat meħtieġ minn AD, u amministraturi tas-sistema b'xejn mir-rutina tal-editjar ta' fajl ta 'test li kellu r-rwol ta' ktieb tal-indirizzi.

Ma kien hemm l-ebda għażliet adattati lesti biex issolvi l-problema, għalhekk kelli nagħmel kollox b'idejja u b'rasi.

Nibdew bil-fatt li l-ewwel trid tiddeċiedi x'għandek tuża, huwa sempliċi - id-direttorju finali għandu jkun disponibbli għall-utenti kollha tad-dominju permezz ta 'browser. L-ewwel ħaġa li tiġi f'moħħna hija PHP flimkien ma 'ldap, u aħna se nużawhom. Inqis li l-vantaġġ kbir tal-użu tal-PHP huwa s-sempliċità relattiva tiegħu - kwalunkwe amministratur tas-sistema anke bi ftit fehim se jkun jista 'jagħmel il-bidliet meħtieġa fil-kodiċi, jekk meħtieġ, mingħajr tensjoni partikolari.

Allura, ejja nibdew. L-ewwel, ejja nissettjaw il-parametri għall-konnessjoni mad-dominju:

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

Il-punt li jmiss huwa li tiddetermina f'liema OU se nfittxu l-utenti. Se nagħmlu dan billi ninterċettaw valuri minn $_GET['post']. Per eżempju, jekk l-utent imur fl-indirizz server/index.php?post=ewwel, imbagħad il-varjabbli $post se jiġi assenjat il-valur ewwel.

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

Varjabbli $doscript hija meħtieġa biex taħżen il-valur - kemm jekk iddefinijna l-OU li fiha ser infittxu utenti jew le. Jekk ma jkunx hemm logħbiet elenkati fil-“switch-case”, allura $doscript=false, il-parti prinċipali tal-iskrittura ma tiġix eżegwita, u l-paġna tal-bidu “main_table.html” se tintwera (ngħidlek dwar hija fl-aħħar nett).

Jekk iddefinijna OU, allura nipproċedu għal aktar azzjonijiet: nibdew niġbed paġna tad-direttorju għall-utent:

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ħna ninkludu stili għal dehra aktar pjaċevoli (iva, jistgħu jiġu inklużi bħala fajl css, iżda xi verżjonijiet ta 'IE ma jridux jaċċettaw stili stabbiliti b'dan il-mod, għalhekk għandek tiktebhom direttament fl-iskrittura):

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

Għamilna l-istili, issa niktbu t-titlu tat-tab u niġbed link konvenjenti biex terġa 'lura għall-paġna ewlenija:

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

Aħna niddefinixxu l-filtri tat-tiftix minn AD u niksbu data dwar l-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

Sussegwentement niddisinjaw in-naħa ta' fuq tal-paġna:

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

Sussegwentement, nirċievu u nipproċessaw id-dejta tal-utent f'linja, filwaqt li biex naħbu xi kontijiet (pereżempju, tas-servizz), aħna sempliċement nidħlu "ħbi" fil-qasam "kamra" fid-dettalji tal-utent f'AD, utenti bħal dawn mhux se jkunu murija fid-direttorju:

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

Mill-mod, jekk għandek bżonn tikseb il-valur ta 'attribut ieħor, imbagħad ftakar (dan huwa importanti):
fit-talba ngħaddu l-isem tal-attribut minusura ittri, inkella mhux se taħdem.

U daħħal id-dejta riċevuta fit-tabella:

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

Sussegwentement, nagħlqu l-konnessjoni ldap, jew nuru messaġġ dwar l-impossibbiltà li tikkonnettja mas-server:

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

Il-fajl "main_table.html" minn ġewwa huwa paġna html sempliċi b'links, u jidher xi ħaġa bħal din:

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

Jekk il-kodiċi tiegħi jgħin lil xi ħadd, inkun ferħan, użah!

Tista' wkoll teditjaha liberament kif tixtieq (ttejjeb/agħar) u tqassamha bi kwalunkwe mezz.

Grazzi tal-attenzjoni tiegħek!

Sors: www.habr.com

Żid kumment