Web adrešu direktorija izveide PHP + LDAP

Sagadījās, ka (salīdzinoši) lielai kampaņai bija daudz attālu biroju ar pienācīgu lietotāju skaitu. Visi biroji ir savienoti vienā tīklā ar kopīgu domēnu, katrs birojs Active Directory (turpmāk tekstā AD) tika definēts kā organizācijas vienība (OU), kurā jau tika izveidoti lietotāji.

Bija jādod lietotājiem iespēja ātri un bez piepūles iegūt vajadzīgā darbinieka kontaktinformāciju no AD un atbrīvot sistēmas administratorus no teksta faila rediģēšanas rutīnas, kas pildīja adrešu grāmatas lomu.

Nebija gatavu piemērotu variantu problēmas risināšanai, tāpēc viss bija jādara ar savām rokām un galvu.

Sāksim ar to, ka vispirms jāizlemj, ko izmantot, tas ir vienkārši – gala direktorijam jābūt pieejamam visiem domēna lietotājiem, izmantojot pārlūkprogrammu. Pirmā lieta, kas nāk prātā, ir PHP kopā ar ldap, un mēs tos izmantosim. Par lielo PHP lietošanas priekšrocību uzskatu tā relatīvo vienkāršību – jebkurš sistēmas administrators ar kaut nelielu izpratni spēs veikt nepieciešamās izmaiņas kodā, ja tas būs nepieciešams, īpaši nepārpūloties.

Tātad, sāksim. Vispirms iestatīsim parametrus savienojuma izveidei ar domēnu:

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

Nākamais punkts ir noteikt, kurā OU mēs meklēsim lietotājus. Mēs to darīsim, pārtverot vērtības no $_GET['vieta']. Piemēram, ja lietotājs dodas uz adresi serveris/index.php?vieta=pirmais, tad mainīgais $vieta tiks piešķirta vērtība pirmais.

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

Mainīgs $doscript ir nepieciešams, lai saglabātu vērtību — neatkarīgi no tā, vai esam definējuši OU, kurā meklēsim lietotājus, vai nē. Ja mapē “switch-case” nav norādītas atbilstības, tad $doscript=false, skripta galvenā daļa netiks izpildīta un tiks parādīta sākuma lapa “main_table.html” (pastāstīšu par tas pašās beigās).

Ja esam definējuši OU, mēs pārejam pie turpmākām darbībām: sākam zīmēt lietotāja direktorija lapu:

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

Mēs iekļaujam stilus patīkamākam izskatam (jā, tos varētu iekļaut kā css failu, taču dažas IE versijas nevēlas pieņemt šādi iestatītus stilus, tāpēc tie ir jāieraksta tieši skriptā):

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

Esam pabeiguši ar stiliem, tagad rakstām cilnes nosaukumu un uzzīmējam ērtu saiti, lai atgrieztos galvenajā lapā:

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

Mēs definējam meklēšanas filtrus pēc AD un iegūstam datus par 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

Tālāk mēs noformējam lapas augšdaļu:

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

Tālāk mēs saņemam un apstrādājam lietotāju datus cilpā, savukārt, lai paslēptu dažus (piemēram, pakalpojumu) kontus, AD lietotāja detaļās laukā "telpa" vienkārši ievadām "slēpt", šādi lietotāji netiks parādīts direktorijā:

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

Starp citu, ja jums ir nepieciešams iegūt cita atribūta vērtību, atcerieties (tas ir svarīgi):
pieprasījumā mēs nododam atribūta nosaukumu mazie burti vēstules, pretējā gadījumā tas nedarbosies.

Un ievietojiet saņemtos datus tabulā:

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

Pēc tam mēs aizveram ldap savienojumu vai parādām ziņojumu par neiespējamību izveidot savienojumu ar serveri:

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

Fails “main_table.html” no iekšpuses ir vienkārša html lapa ar saitēm, un tā izskatās apmēram šādi:

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

Ja mans kods kādam palīdz, es priecāšos, izmantojiet to!

Varat arī to brīvi rediģēt, kā vēlaties (uzlabot/sliktāk) un izplatīt to ar jebkādiem līdzekļiem.

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

Avots: www.habr.com

Pievieno komentāru