Vi lager en WEB-adressebok PHP + LDAP

Det skjedde slik at et (relativt) stort selskap hadde mange fjernkontorer hvor det var en god del brukere. Alle kontorer er knyttet sammen i et nettverk med en felles domene, og hvert kontor ble definert i Active Directory (heretter AD) som en Organisasjonsenhet (OU), som allerede hadde brukere opprettet.

Det var nÞdvendig Ä gi brukerne muligheten til raskt og uten for mye besvÊr Ä fÄ kontaktinformasjonen til den nÞdvendige ansatte fra AD, samtidig som systemadministratorene ble frigjort fra rutinen med Ä redigere en tekstfil som fungerte som adressebok.

Det fantes ingen passende lÞsninger for oppgaven, sÄ vi mÄtte gjÞre alt selv med bÄde hender og hode.

La oss begynne med Ă„ bestemme hva vi skal bruke, dette er enkelt — den endelige adressen skal vĂŠre tilgjengelig for alle brukere i domenet gjennom en nettleser. Det fĂžrste som kommer i tankene er PHP sammen med ldap, og det vil vi bruke. En stor fordel med Ă„ bruke PHP er dens relative enkelhet — enhver systemadministrator som har en liten forstĂ„else for det, kan enkelt gjĂžre nĂždvendige endringer i koden om nĂždvendig.

La oss starte. For det fÞrste mÄ vi angi pÄloggingsparametrene for domenet:

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

Neste punkt er Ă„ bestemme hvilket OU vi vil sĂžke etter brukere i. Dette vil vi gjĂžre ved Ă„ hente verdier fra $_GET[‘place’]. For eksempel, hvis brukeren gĂ„r til adressen server/index.php?place=first, sĂ„ vil variabelen $place fĂ„ verdien 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 du legge til flere betingelser.
default:
	$doscript=false; 
	break;
}
if (!$doscript) include "main_table.html";

Variabelen $doscript er nĂždvendig for Ă„ lagre verdien — har vi bestemt hvilken OU vi skal sĂžke etter brukere i eller ikke. Hvis det ikke ble funnet noen treff i «switch-case», sĂ„ settes $doscript=false, og hoveddelen av skriptet vil ikke bli kjĂžrt; i stedet vil startside «main_table.html» bli vist (jeg vil fortelle om den pĂ„ slutten).

Hvis vi har bestemt OU, da fortsetter vi med neste steg: vi begynner Ă„ lage adresseboksiden for brukeren:

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 stiler for et mer behagelig utseende (ja, de kunne vÊrt koblet til som en css-fil, men enkelte versjoner av IE Þnsker ikke Ä gjenkjenne stiler angitt pÄ denne mÄten, sÄ vi mÄtte skrive dem direkte inn i skriptet):

*{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;}
	
	/* Ujevne rader */#table tbody tr:nth-child(odd){background: #fff;}
	/* Jevne rader */   #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;}

Stilene er nÄ pÄ plass, nÄ skriver vi tittelen pÄ fanen og lager en praktisk lenke tilbake til hovedsiden:

<title>Adressebok over «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 hovedsiden</p></a>
</td></tr></table>
";

Vi definerer sÞkefiltre etter AD, og fÄr informasjon om OU:

$filter ="(&(objectcategory=user)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))"; // alle brukere, unntatt deaktiverte.
$filter2 ="(objectCategory=OrganizationalUnit)"; // for Ă„ hente 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]; 	// e-post til sted
$PlacePhone = $placeinfo[0]["st"][0]; 		// telefon til sted

Deretter formaterer vi den Ăžverste delen av siden:

ekko"<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"> Navn </td>
	<td width='250' bgcolor = "#f0f0e4"> E-post </td>
	<td width='60' bgcolor = "#f0f0e4"> Telefon </td>
	<td width='150' bgcolor = "#f0f0e4"> Mobile </td></tr>
	<tr><td></td><td> OU-data </td><td>";
ekko "<div class='transition-rotate'><a href="mailto:"" . $placemail .">" . $PlaceMail ." </a></div>";
ekko "</td><td width='150'> " . $PlacePhone ." </td><td> - </td></tr>";

Deretter henter vi i en lÞkke og behandler brukerdata, samtidig som vi for Ä skjule enkelte (for eksempel tjenestekontoer), ganske enkelt skriver «hide» i feltet «rom» i brukerens attributter i AD, vil slike brukere ikke vises i katalogen:

for ($i=0; $i<$info["count"];$i++) { 
$UserHide = $info[$i]["physicaldeliveryofficename"][0];
if ($UserHide != 'hide') {
$UserName = $info[$i]["cn"][0];                //Brukernavn
$UserPosition = $info[$i]["title"][0]; 		// Stilling
$UserMail = $info[$i]["mail"][0];			//mail
if (!$UserMail) $UserMail = "-";                  //hvis ingen data om e-posten i AD, viser vi bindestrek
$UserIpPhone = $info[$i]["ipphone"][0];		//ip-telefon
	if (!$UserIpPhone) $UserIpPhone = "-";    //hvis ingen data om e-posten i AD, viser vi bindestrek
$UserMobile = $info[$i]["mobile"][0];		//mobil
	if (!$UserMobile) $UserMobile = "-";     //hvis ingen data om e-posten i AD, viser vi bindestrek

Forresten, hvis du trenger Ä fÄ verdien av en annen attributt, husk (det er viktig):
i spÞrringen sender vi navnet pÄ attributtet smÄ bokstaver, ellers vil det ikke fungere.

Og vi setter inn de innhentede dataene i tabellen:

    echo "<tr>
	<td>". $n+=1 ."</td>
	<td> ". $UserName ."<br> <div class='smalltext'>". $UserPosition ."</div></td><td>"; //	Brukernavn og stilling
	if ($UserMail !='-') echo "<div class='transition-rotate'><a href="mailto:'$UserMail'">$UserMail  </a></div>";    // hvis bruker har e-post lager vi en lenke for å sende e-post
	else echo "-"; //hvis ikke e-post - sett en bindestrek.
 	echo "<td> ". $UserIpPhone ." </td>
 	<td> ". $UserMobile ." </td></tr>";
	}
}
echo "</table>";

Deretter lukker vi tilkoblingen via ldap, eller viser en melding om at tilkoblingen til serveren ikke kunne oppnÄs:

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

Filen «main_table.html» representerer en enkel html-side med lenker, og ser omtrent slik ut:

<head>
<link rel="shortcut icon" href="ico.png"/>
<meta charset="windows-1251"/>
<title>Adressebok over «YourMegaCompanyName»</title>
</head>
<body style='background-color:#ffffff;'>
<center><a href="index.php"><img border="none" src="logo.png"/></a></center>
<center><b>Stader og kontor</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 noen kan dra nytte av koden min — blir jeg glad, bruk den gjerne!

Du kan ogsÄ fritt redigere den som du Þnsker (forbedre/forverre) og spre den pÄ alle mÄter.

Takk for oppmerksomheten!

Kilde: habr.com

KjĂžp pĂ„litelig hosting for nettsteder med DDoS-beskyttelse, VPS VDS-servere đŸ”„ KjĂžp pĂ„litelig hosting for nettsteder med DDoS-beskyttelse, VPS VDS-servere | ProHoster