Skapa en webbadresskatalog PHP + LDAP

Det blev så att en (relativt) stor kampanj hade många fjärrkontor med ett hyfsat antal användare. Alla kontor är anslutna till ett nätverk med en gemensam domän, varje kontor definierades i Active Directory (nedan kallat AD) som en organisationsenhet (OU), där användare redan skapats.

Det var nödvändigt att ge användarna möjlighet att snabbt och enkelt få kontaktinformationen för den erforderliga medarbetaren från AD, och befria systemadministratörer från rutinen att redigera en textfil som spelade rollen som en adressbok.

Det fanns inga färdiga lämpliga alternativ för att lösa problemet, så jag var tvungen att göra allt med mina egna händer och huvud.

Låt oss börja med det faktum att först måste du bestämma vad du ska använda, det är enkelt - den slutliga katalogen ska vara tillgänglig för alla användare av domänen via en webbläsare. Det första som kommer att tänka på är PHP i samband med ldap, och vi kommer att använda dem. Jag anser att den stora fördelen med att använda PHP är dess relativa enkelhet - vilken systemadministratör som helst med ens lite förståelse kommer att kunna göra de nödvändiga ändringarna i koden, om det behövs, utan särskilt ansträngande.

Så, låt oss börja. Låt oss först ställa in parametrarna för att ansluta till domänen:

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

Nästa punkt är att bestämma i vilken OU vi ska söka efter användare. Vi kommer att göra detta genom att fånga upp värden från $_GET['plats']. Till exempel om användaren går till adressen server/index.php?place=först, sedan variabeln $place kommer att tilldelas värdet först.

$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 behövs för att lagra värdet - oavsett om vi har definierat organisationsenheten där vi ska söka efter användare eller inte. Om det inte finns några matchningar listade i "switch-case", då $doscript=false, kommer huvuddelen av skriptet inte att köras, och startsidan "main_table.html" kommer att visas (jag ska berätta om det i slutet).

Om vi ​​har definierat en organisationsenhet fortsätter vi till ytterligare åtgärder: vi börjar rita en katalogsida för användaren:

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 inkluderar stilar för ett trevligare utseende (ja, de kan inkluderas som en css-fil, men vissa versioner av IE vill inte acceptera stilar som ställts in på det här sättet, så du måste skriva in dem direkt i skriptet):

<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 är klara med stilarna, nu skriver vi rubriken på fliken och ritar en bekväm länk för att återgå till huvudsidan:

<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 definierar sökfilter efter AD och får data om organisationsenheten:

$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

Därefter designar vi toppen av sidan:

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

Därefter tar vi emot och behandlar användardata i en slinga, medan vi för att dölja vissa (till exempel tjänste) konton helt enkelt anger "dölj" i fältet "rum" i användaruppgifterna i AD, sådana användare kommer inte att vara visas i katalogen:

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

Förresten, om du behöver få värdet av ett annat attribut, kom ihåg (detta är viktigt):
i begäran skickar vi attributnamnet små bokstäver brev, annars fungerar det inte.

Och infoga mottagna 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>";

Därefter stänger vi ldap-anslutningen eller visar ett meddelande om omöjligheten att ansluta till servern:

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

Filen "main_table.html" från insidan är en enkel HTML-sida med länkar och ser ut ungefär så här:

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

Om min kod hjälper någon, blir jag glad, använd den!

Du kan också fritt redigera den som du vill (förbättra/sämre) och distribuera den på alla sätt.

Tack för din uppmärksamhet!

Källa: will.com

Lägg en kommentar