Opretter en WEB adressering med PHP + LDAP

Det sker, at en (relativt) stor virksomhed havde mange fjernkontorer, hvor der var et rimeligt antal brugere. Alle kontorerne er forbundet i et netværk med et fælles domæne, og hvert kontor er defineret i Active Directory (herefter AD) som en Organization Unit (OU), hvor brugerne allerede er oprettet.

Det var nødvendigt at give brugerne mulighed for hurtigt og uden større besvær at få kontaktoplysningerne på den nødvendige medarbejder fra AD, samt at frigøre systemadministratorer fra rutinen med at redigere en tekstfil, der fungerede som en adressemailer.

Der blev ikke fundet nogen færdige passende løsninger til den stillede opgave, så det blev nødvendigt at gøre alt selv.

Lad os starte med at fastslå, hvad vi skal bruge; det er ganske enkelt – den endelige kontaktguide skal være tilgængelig for alle brugere i domænet via en browser. Det første, der kommer i tankerne, er PHP i kombination med LDAP, og det er det, vi vil bruge. En stor fordel ved at bruge PHP er, at det er forholdsvis enkelt – enhver systemadministrator, der har en smule forståelse, vil kunne foretage de nødvendige ændringer i koden uden alt for meget besvær.

Lad os så komme i gang. Først skal vi angive forbindelsesparametrene til domænet:

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

Næste punkt er at bestemme, i hvilken OU vi vil lede efter brugere. Dette vil vi gøre ved at opfange værdier fra $_GET[‘place’]. For eksempel, hvis brugeren navigerer til adressen server/index.php?place=first, vil variablen $place blive tildelt værdien first.

$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;
	// her kan vi tilføje flere betingelser.
default:
	$doscript=false; 
	break;
}
if (!$doscript) include "main_table.html";

Variabel $doscript er nødvendig for at gemme værdien – om vi har bestemt hvilken OU, vi vil lede efter brugere i eller ej. Hvis der ikke findes nogen matchende værdier i "switch-case", sættes $doscript=false, og hoveddelen af scriptet vil ikke blive udført, men den starter side "main_table.html" (jeg vil fortælle om den til sidst).

Hvis vi derimod har bestemt OU, så går vi videre med de næste skridt: vi begynder at designe kontaktguiden til 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 aktiverer stilarter for et mere behageligt udseende (ja, de kunne have været tilsluttet som en CSS-fil, men nogle versioner af IE vil ikke acceptere stilarter angivet på den måde, så vi må skrive dem direkte i scriptet):

*{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;}

Stilarterne er klaret, nu skriver vi fanebladets titel og laver et bekvemt link til forsiden:

<title>Adressebog til «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>Til forsiden</p></a>
</td></tr></table>
";

Vi definerer søgefiltre for AD og får data om OU:

$filter ="(&(objectcategory=user)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))"; // alle brugere, undtagen de deaktiverede.
$filter2 ="(objectCategory=OrganizationalUnit)"; // for at få information om 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];  			// navn på sted
$PlaceAddres = $placeinfo[0]["street"][0];		// adresse på sted
$PlaceMail = $placeinfo[0]["description"][0]; 	// mail til sted
$PlacePhone = $placeinfo[0]["st"][0]; 		// telefon til sted

Derefter designer vi den øverste del 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">  Nr. </td>
	<td width='300' bgcolor = "#f0f0e4"> Navn </td>
	<td width='250' bgcolor = "#f0f0e4"> E-mail </td>
	<td width='60' bgcolor = "#f0f0e4"> Telefon </td>
	<td width='150' bgcolor = "#f0f0e4"> Mobil </td></tr>
	<tr><td></td><td> OU-data </td><td>";
echo "<div class='transition-rotate'><a href="mailto:"" . $placemail .">" . $PlaceMail ." </a></div>";
echo "</td><td width='150'> " . $PlacePhone ." </td><td> - </td></tr>";

Derefter henter vi i en løkke og behandler brugerdata, mens vi for at skjule visse (for eksempel systembrugere) konti blot angiver 'hide' i feltet 'rum' i brugerens attributter i AD, vil sådanne brugere ikke blive vist i kataloget:

for ($i=0; $i<$info["count"]; $i++) { 
$UserHide = $info[$i]["physicaldeliveryofficename"][0];
if ($UserHide != 'hide') {
$UserName = $info[$i]["cn"][0];                //Brugernavn
$UserPosition = $info[$i]["title"][0]; 		// Stillingsbetegnelse
$UserMail = $info[$i]["mail"][0];			//mail
if (!$UserMail) $UserMail = "-";                  //hvis der ikke er data om kassen i AD, vis en bindestreg
$UserIpPhone = $info[$i]["ipphone"][0];		//ip telefon
	if (!$UserIpPhone) $UserIpPhone = "-";    //hvis der ikke er data om kassen i AD, vis en bindestreg
$UserMobile = $info[$i]["mobile"][0];		//mobil
	if (!$UserMobile) $UserMobile = "-";     //hvis der ikke er data om kassen i AD, vis en bindestreg

For øvrigt, hvis du har brug for at få værdien af en anden attribut, så husk (det er vigtigt):
vi sender navnet på attributten i forespørgslen med små bogstaver, ellers virker det ikke.

Og vi indsætter de modtagne data i tabellen:

    echo "<tr>
	<td>". $n+=1 ."</td>
	<td> ". $UserName ."<br> <div class='smalltext'>". $UserPosition ."</div></td><td>"; // Brugernavn og stilling 
	if ($UserMail !='-') echo "<div class='transition-rotate'><a href="mailto:'$UserMail'">$UserMail  </a></div>"; // hvis brugeren har e-mail, opretter vi et link til at sende en mail
	else echo "-"; // hvis der ikke er e-mail - sæt en bindestreg.
 	echo "<td> ". $UserIpPhone ." </td>
 	<td> ". $UserMobile ." </td></tr>";
	}
}
echo "</table>";

Derefter lukker vi forbindelsen til ldap eller viser en besked om, at det ikke er muligt at oprette forbindelse til serveren:

ldap_close($ds); 
} 
else echo "<h4>Kan ikke oprette forbindelse til LDAP-server</h4>"; 
echo '<br><br><br></body></html>';}

Filen "main_table.html" repræsenterer indeni en simpel html-side med links og ser således ud:

<head>
<link rel="shortcut icon" href="ico.png"/>
<meta charset="windows-1251"/>
<title>Adressebog til «YourMegaCompanyName»</title>
</head>
<body style='background-color:#ffffff;'>
<center><a href="index.php"><img border="none" src="logo.png"/></a></center>
<center><b>Steder og kontorer</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 kan hjælpe nogen — vil jeg være glad, brug det gerne!

Du må også gerne redigere det, som du vil (forbedre/mindske) og sprede det med enhver metode.

Tak for din opmærksomhed!

Kilde: habr.com

Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere 🔥 Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere | ProHoster