Paglikha ng direktoryo ng WEB address na PHP + LDAP

Nagkataon na ang isang (medyo) malaking kampanya ay mayroong maraming malalayong opisina na may disenteng bilang ng mga gumagamit. Ang lahat ng mga opisina ay konektado sa isang network na may isang karaniwang domain, ang bawat opisina ay tinukoy sa Active Directory (mula rito ay tinutukoy bilang AD) bilang isang Unit ng Organisasyon (OU), kung saan ang mga user ay nilikha na.

Kinakailangang bigyan ang mga user ng pagkakataon na mabilis at walang kahirap-hirap na makuha ang impormasyon sa pakikipag-ugnayan ng kinakailangang empleyado mula sa AD, at libreng mga tagapangasiwa ng system mula sa nakagawiang pag-edit ng isang text file na gumaganap ng papel ng isang address book.

Walang mga handa na angkop na mga pagpipilian para sa paglutas ng problema, kaya kailangan kong gawin ang lahat gamit ang aking sariling mga kamay at ulo.

Magsimula tayo sa katotohanan na kailangan mo munang magpasya kung ano ang gagamitin, ito ay simple - ang huling direktoryo ay dapat na magagamit sa lahat ng mga gumagamit ng domain sa pamamagitan ng isang browser. Ang unang bagay na naiisip ay PHP kasabay ng ldap, at gagamitin namin ang mga ito. Itinuturing kong malaking bentahe ng paggamit ng PHP ang pagiging simple nito - sinumang tagapangasiwa ng system na may kaunting pag-unawa ay makakagawa ng mga kinakailangang pagbabago sa code, kung kinakailangan, nang hindi partikular na nahihirapan.

Kaya, magsimula tayo. Una, itakda natin ang mga parameter para sa pagkonekta sa domain:

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

Ang susunod na punto ay upang matukoy kung aling OU ang hahanapin namin para sa mga user. Gagawin namin ito sa pamamagitan ng pagharang ng mga halaga mula sa $_GET['lugar']. Halimbawa, kung pupunta ang user sa address server/index.php?place=una, pagkatapos ay ang variable $lugar itatalaga ang halaga 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 ay kinakailangan upang iimbak ang halaga - kung tinukoy namin ang OU kung saan kami maghahanap ng mga user o hindi. Kung walang mga tugma na nakalista sa "switch-case", pagkatapos ay $doscript=false, ang pangunahing bahagi ng script ay hindi isasagawa, at ang panimulang pahina na "main_table.html" ay ipapakita (Sasabihin ko sa iyo ang tungkol sa ito sa pinakadulo).

Kung natukoy namin ang isang OU, pagkatapos ay magpatuloy kami sa mga karagdagang pagkilos: magsisimula kaming gumuhit ng pahina ng direktoryo para sa user:

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

Nagsasama kami ng mga estilo para sa isang mas kaaya-ayang hitsura (oo, maaaring isama ang mga ito bilang isang css file, ngunit ang ilang bersyon ng IE ay hindi gustong tumanggap ng mga istilong itinakda sa ganitong paraan, kaya kailangan mong direktang isulat ang mga ito 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>

Tapos na kami sa mga istilo, ngayon ay isinusulat namin ang pamagat ng tab at gumuhit ng isang maginhawang link upang bumalik sa pangunahing pahina:

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

Tinutukoy namin ang mga filter ng paghahanap ayon sa AD at kumukuha kami ng data tungkol 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

Susunod na idinisenyo namin ang tuktok ng pahina:

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

Susunod, natatanggap at pinoproseso namin ang data ng user sa isang loop, habang para maitago ang ilang (halimbawa, serbisyo) account, ilalagay lang namin ang "itago" sa field na "kuwarto" sa mga detalye ng user sa AD, ang mga naturang user ay hindi magiging ipinapakita 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, то отображаем прочерк

Sa pamamagitan ng paraan, kung kailangan mong makuha ang halaga ng isa pang katangian, pagkatapos ay tandaan (ito ay mahalaga):
sa kahilingan ipinapasa namin ang pangalan ng katangian maliit na titik mga titik, kung hindi, hindi ito gagana.

At ipasok ang natanggap na data sa talahanayan:

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

Susunod, isinasara namin ang koneksyon sa ldap, o nagpapakita ng mensahe tungkol sa imposibilidad ng pagkonekta sa server:

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

Ang file na "main_table.html" mula sa loob ay isang simpleng html na pahina na may mga link, at mukhang ganito:

<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 makakatulong ang aking code sa sinuman, matutuwa ako, gamitin ito!

Maaari mo ring malayang i-edit ito ayon sa gusto mo (pagbutihin/mas masahol pa) at ipamahagi ito sa anumang paraan.

Salamat sa iyo!

Pinagmulan: www.habr.com

Magdagdag ng komento