Oprettelse af en WEB-adressemappe PHP + LDAP

Det skete sådan, at en (relativt) stor kampagne havde mange fjernkontorer med et pænt antal brugere. Alle kontorer er forbundet til ét netværk med et fælles domæne, hvert kontor blev defineret i Active Directory (herefter benævnt AD) som en Organisation Unit (OU), hvor brugere allerede var oprettet.

Det var nødvendigt at give brugerne mulighed for hurtigt og ubesværet at få kontaktoplysningerne på den ønskede medarbejder fra AD, og ​​frigøre systemadministratorer fra rutinen med at redigere en tekstfil, der spillede rollen som en adressebog.

Der var ingen færdige egnede muligheder for at løse problemet, så jeg var nødt til at gøre alt med mine egne hænder og hoved.

Lad os starte med det faktum, at du først skal beslutte, hvad du skal bruge, det er enkelt - den endelige mappe skal være tilgængelig for alle brugere af domænet via en browser. Det første, der kommer til at tænke på, er PHP i forbindelse med ldap, og vi vil bruge dem. Jeg anser den store fordel ved at bruge PHP for at være dens relative enkelhed - enhver systemadministrator med selv en lille forståelse vil være i stand til at foretage de nødvendige ændringer i koden, hvis det er nødvendigt, uden at anstrenge sig.

Så lad os begynde. Lad os først indstille parametrene for at oprette forbindelse til domænet:

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

Det næste punkt er at bestemme, i hvilken OU vi vil søge efter brugere. Vi vil gøre dette ved at opsnappe værdier fra $_GET['sted']. For eksempel hvis brugeren går til adressen server/index.php?place=første, derefter variablen $sted vil blive tildelt en værdi første.

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

Variabel $doscript er nødvendig for at gemme værdien - uanset om vi har defineret den OU, hvor vi vil søge efter brugere eller ej. Hvis der ikke er nogen matches angivet i "switch-case", så $doscript=false, vil hoveddelen af ​​scriptet ikke blive udført, og startsiden "main_table.html" vil blive vist (jeg vil fortælle dig om det til allersidst).

Hvis vi har defineret en OU, går vi videre til yderligere handlinger: vi begynder at tegne en katalogside for brugeren:

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

Vi inkluderer stilarter for et mere behageligt udseende (ja, de kunne inkluderes som en css-fil, men nogle versioner af IE ønsker ikke at acceptere stilarter sat på denne måde, så du skal skrive dem direkte ind i scriptet):

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

Vi er færdige med stilarter, nu skriver vi titlen på fanen og tegner et praktisk link for at vende tilbage til hovedsiden:

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

Vi definerer søgefiltre efter AD og får data om organisationen:

$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

Dernæst designer vi toppen af ​​siden:

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

Dernæst modtager og behandler vi brugerdata i en løkke, mens vi for at skjule nogle (f.eks. service) konti blot indtaster "skjul" i feltet "rum" i brugeroplysningerne i AD, sådanne brugere bliver ikke vist i mappen:

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

Forresten, hvis du har brug for at få værdien af ​​en anden egenskab, så husk (dette er vigtigt):
i anmodningen videregiver vi attributnavnet små bogstaver bogstaverellers virker det ikke.

Og indsæt de modtagne data i tabellen:

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

Dernæst lukker vi ldap-forbindelsen eller viser en besked om umuligheden af ​​at oprette forbindelse til serveren:

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

Filen "main_table.html" indefra er en simpel html-side med links og ser nogenlunde sådan ud:

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

Hvis min kode hjælper nogen, vil jeg være glad, brug den!

Du kan også frit redigere det som du ønsker (forbedre/værre) og distribuere det på enhver måde.

Tak for din opmærksomhed!

Kilde: www.habr.com

Tilføj en kommentar