Paghimo ug WEB address directory PHP + LDAP

Nahitabo nga ang usa ka (medyo) dako nga kampanya adunay daghang mga hilit nga opisina nga adunay disente nga gidaghanon sa mga tiggamit. Ang tanan nga mga opisina konektado sa usa ka network nga adunay usa ka komon nga domain, ang matag opisina gihubit sa Active Directory (gitawag dinhi nga AD) isip usa ka Organization Unit (OU), diin ang mga tiggamit nahimo na.

Kinahanglan nga hatagan ang mga tiggamit og higayon nga dali ug dali nga makuha ang impormasyon sa pagkontak sa gikinahanglan nga empleyado gikan sa AD, ug libre nga mga tagdumala sa sistema gikan sa naandan nga pag-edit sa usa ka text file nga nagdula sa papel sa usa ka address book.

Wala’y andam nga angay nga kapilian alang sa pagsulbad sa problema, mao nga kinahanglan nakong buhaton ang tanan gamit ang akong kaugalingon nga mga kamot ug ulo.

Magsugod kita sa kamatuoran nga kinahanglan nimo una nga magdesisyon kung unsa ang gamiton, kini yano - ang katapusan nga direktoryo kinahanglan nga magamit sa tanan nga tiggamit sa domain pinaagi sa usa ka browser. Ang unang butang nga mosantop sa hunahuna mao ang PHP inubanan sa ldap, ug gamiton nato kini. Giisip nako nga ang dako nga bentaha sa paggamit sa PHP mao ang relatibong kayano niini - bisan kinsa nga tagdumala sa sistema nga adunay bisan gamay nga pagsabut makahimo sa kinahanglan nga mga pagbag-o sa code, kung kinahanglan, nga wala’y labi nga pagpaningkamot.

Busa, magsugod kita. Una, atong ibutang ang mga parameter alang sa pagkonektar sa domain:

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

Ang sunod nga punto mao ang pagtino kung asa nga OU ang among pangitaon alang sa mga tiggamit. Buhaton namo kini pinaagi sa pag-intercept sa mga mithi gikan sa $_GET['lugar']. Pananglitan, kung ang tiggamit moadto sa adres server/index.php?lugar=una, unya ang variable $lugar ihatag ang bili una.

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

Variable $doscript gikinahanglan aron tipigan ang bili - kung gihubit man nato ang OU diin atong pangitaon ang mga tiggamit o dili. Kung walay mga posporo nga gilista sa "switch-case", unya $doscript=false, ang panguna nga bahin sa script dili ipatuman, ug ang panid sa pagsugod "main_table.html" ipakita (Isulti ko kanimo ang bahin sa kini sa katapusan).

Kung gihubit namo ang usa ka OU, nan magpadayon kami sa dugang nga mga aksyon: magsugod kami sa pagdrowing og panid sa direktoryo alang sa tiggamit:

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

Among gilakip ang mga estilo alang sa mas nindot nga panagway (oo, mahimo kining iapil isip css file, apan ang ubang mga bersyon sa IE dili gusto nga modawat sa mga estilo nga gitakda niining paagiha, mao nga kinahanglan nimo kining isulat direkta ngadto sa script):

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

Nahuman na kami sa mga istilo, karon gisulat namon ang titulo sa tab ug nagdrowing og usa ka kombenyente nga link aron makabalik sa panguna nga panid:

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

Among gihubit ang mga filter sa pagpangita pinaagi sa AD ug nagkuha og datos mahitungod sa 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

Sunod among gidesinyo ang ibabaw sa panid:

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

Sunod, among nadawat ug giproseso ang data sa user sa usa ka loop, samtang aron itago ang pipila (pananglitan, serbisyo) nga mga account, gisulod lang namo ang "pagtago" sa field nga "lawak" sa mga detalye sa user sa AD, ang maong mga tiggamit dili gipakita sa direktoryo:

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

Pinaagi sa dalan, kung kinahanglan nimo nga makuha ang kantidad sa lain nga hiyas, nan hinumdomi (kini hinungdanon):
sa hangyo gipasa namo ang ngalan sa hiyas gamay nga letra mga sulat, kon dili kini molihok.

Ug isulud ang nadawat nga datos sa lamesa:

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

Sunod, gisirad-an namo ang koneksyon sa ldap, o magpakita og mensahe mahitungod sa imposibilidad sa pagkonektar sa server:

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

Ang file nga "main_table.html" gikan sa sulod kay usa ka yano nga panid sa html nga adunay mga link, ug ingon niini ang hitsura:

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

Kung ang akong code makatabang ni bisan kinsa, malipay ko, gamita kini!

Mahimo usab nimo nga gawasnon nga i-edit kini kung gusto nimo (pag-ayo / mas grabe) ug ipang-apod-apod kini sa bisan unsang paagi.

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

Source: www.habr.com

Idugang sa usa ka comment