Kreye yon anyè adrès WEB PHP + LDAP

Li te rive ke yon (relativman) gwo kanpay te gen anpil biwo aleka ak yon kantite desan itilizatè yo. Tout biwo yo konekte nan yon sèl rezo ak yon domèn komen, yo te defini chak biwo nan Anyè Aktif (ki refere yo kòm AD) kòm yon Inite Òganizasyon (OU), nan ki itilizatè yo te deja kreye.

Li te nesesè yo bay itilizatè yo opòtinite yo byen vit ak efor jwenn enfòmasyon an kontak nan anplwaye ki nesesè nan AD, ak gratis administratè sistèm nan woutin nan koreksyon yon dosye tèks ki te jwe wòl nan yon liv adrès.

Pa te gen okenn opsyon ki pare apwopriye pou rezoud pwoblèm nan, kidonk mwen te oblije fè tout bagay ak pwòp men mwen ak tèt mwen.

Ann kòmanse ak lefèt ke premye ou bezwen deside ki sa yo sèvi ak, li nan senp - anyè final la ta dwe disponib nan tout itilizatè nan domèn nan atravè yon navigatè. Premye bagay ki vin nan tèt ou se PHP an konjonksyon avèk ldap, epi nou pral sèvi ak yo. Mwen konsidere gwo avantaj ki genyen nan itilize PHP kòm senplisite relatif li - nenpòt administratè sistèm ki gen menm yon ti kras konpreyansyon yo pral kapab fè chanjman ki nesesè nan kòd la, si sa nesesè, san yo pa patikilyèman tension.

Se konsa, ann kòmanse. Premyèman, ann mete paramèt yo pou konekte ak domèn nan:

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

Pwen kap vini an se detèmine nan ki OU nou pral chèche itilizatè yo. Nou pral fè sa nan entèsepte valè soti nan $_GET ['place']. Pou egzanp, si itilizatè a ale nan adrès la server/index.php?place=premye, Lè sa a, varyab la $ kote yo pral bay valè a premye.

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

Varyab $doskripsyon se nesesè yo estoke valè a - si nou te defini OU a nan ki nou pral chèche itilizatè yo oswa ou pa. Si pa gen okenn alimèt ki nan lis "switch-case", Lè sa a, $doscript = fo, pati prensipal la nan script la pa pral egzekite, epi paj la kòmanse "main_table.html" pral parèt (mwen pral di w sou li nan fen menm).

Si nou te defini yon OU, Lè sa a, nou kontinye nan plis aksyon: nou kòmanse trase yon paj anyè pou itilizatè a:

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

Nou enkli estil pou yon aparans pi bèl (wi, yo ta ka enkli kòm yon dosye css, men kèk vèsyon nan IE pa vle aksepte estil yo mete nan fason sa a, kidonk ou dwe ekri yo dirèkteman nan script la):

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

Nou fini ak estil yo, kounye a nou ekri tit la nan tab la epi trase yon lyen pratik pou retounen nan paj prensipal la:

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

Nou defini filtè rechèch pa AD epi jwenn done sou OU a:

$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

Apre sa, nou desine tèt paj la:

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

Apre sa, nou resevwa ak trete done itilizatè yo nan yon bouk, pandan y ap nan lòd yo kache kèk (pa egzanp, sèvis) kont, nou tou senpleman antre "kache" nan jaden an "chanm" nan detay itilizatè yo nan AD, itilizatè sa yo pa pral parèt nan anyè a:

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

By wout la, si ou bezwen jwenn valè a nan yon lòt atribi, Lè sa a, sonje (sa a enpòtan):
nan demann lan nou pase non atribi a miniskil lèt, sinon li pa pral travay.

Epi mete done yo resevwa nan tablo a:

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

Apre sa, nou fèmen koneksyon ldap la, oswa montre yon mesaj sou enposib pou konekte ak sèvè a:

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

Fichye "main_table.html" ki soti anndan an se yon paj html senp ak lyen, epi li sanble yon bagay tankou sa a:

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

Si kòd mwen an ede nenpòt moun, mwen pral kontan, sèvi ak li!

Ou kapab tou lib edite li jan ou vle (amelyore/pi mal) epi distribye li pa nenpòt mwayen.

Mèsi pou atansyon ou!

Sous: www.habr.com

Add nouvo kòmantè