Skep 'n WEB-adresgids PHP + LDAP

Dit het so gebeur dat 'n (relatief) groot veldtog baie afgeleë kantore gehad het met 'n ordentlike aantal gebruikers. Alle kantore is gekoppel aan een netwerk met 'n gemeenskaplike domein, elke kantoor is in die Active Directory (hierna na verwys as AD) gedefinieer as 'n Organisasie-eenheid (OU), waarin gebruikers reeds geskep is.

Dit was nodig om gebruikers die vermoë te gee om vinnig en moeiteloos die kontakbesonderhede van die nodige werknemer by AD te bekom, en stelseladministrateurs te bevry van die roetine om 'n tekslêer te redigeer wat die rol van 'n adresboek gespeel het.

Daar was geen gereedgemaakte geskikte opsies om die taak op te los nie, so ek moes alles met my eie hande en kop doen.

Kom ons begin met die feit dat jy eers moet besluit wat om te gebruik, dit is eenvoudig - die finale gids moet beskikbaar wees vir alle domeingebruikers deur 'n blaaier. Die eerste ding wat in gedagte kom, is PHP in samewerking met ldap, en ons sal dit gebruik. Ek beskou die relatiewe eenvoud van die gebruik van PHP as 'n groot pluspunt - enige stelseladministrateur wat selfs 'n bietjie verstaan, sal die nodige veranderinge aan die kode kan aanbring, indien nodig, sonder om besondere inspanning te doen.

So, kom ons begin. Laat ons eers die parameters stel om aan die domein te koppel:

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

Die volgende stap is om te bepaal in watter OE ons gebruikers sal soek. Ons sal dit doen deur waardes van $_GET['plek'] te onderskep. Byvoorbeeld, as die gebruiker navigeer na server/index.php?place=eerste, dan die veranderlike $plek waarde toegeken sal word eerste.

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

veranderlike $doscript is nodig om die waarde te stoor - of ons die OE bepaal het waarin ons gebruikers sal soek of nie. As daar geen passings in die "switch-case" gelys is nie, dan $doscript=false, sal die hoofgedeelte van die script nie uitgevoer word nie, maar die beginbladsy "main_table.html" sal vertoon word (ek sal daaroor praat heel aan die einde).

As ons 'n OE gedefinieer het, gaan ons voort met verdere aksies: ons begin om 'n handleiding vir die gebruiker te teken:

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

Ons sluit style in vir 'n aangenamer voorkoms (ja, hulle kan as 'n css-lêer ingesluit word, maar sommige weergawes van IE wil nie style aanvaar wat op hierdie manier gestel is nie, so jy moet direk na die skrif skryf):

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

Style is verby, nou skryf ons die titel van die oortjie en trek 'n gerieflike skakel terug na die hoofblad:

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

Ons definieer soekfilters volgens AD, en kry data oor die OE:

$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

Vervolgens versier ons die bokant van die bladsy:

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

Vervolgens kry ons 'n lus en verwerk gebruikersdata, terwyl om sommige (byvoorbeeld diens) rekeninge te versteek, ons eenvoudig "versteek" in die "kamer"-veld in die gebruikersbesonderhede in AD skryf, sulke gebruikers sal nie vertoon in die gids:

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

Terloops, as jy die waarde van 'n ander eienskap moet kry, onthou dan (dit is belangrik):
in die versoek gee ons die naam van die kenmerk deur kleinletters in lettersanders sal dit nie werk nie.

En voeg die ontvangde data in die tabel in:

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

Vervolgens sluit ons die ldap-verbinding, of vertoon 'n boodskap oor die onvermoë om aan die bediener te koppel:

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

Die "main_table.html"-lêer binne is 'n eenvoudige HTML-bladsy met skakels, en lyk so iets:

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

As my kode iemand help, sal ek bly wees, gebruik dit!

Jy kan dit ook vrylik wysig soos jy wil (verbeter/degradeer) en versprei dit op enige manier.

Skep 'n nuwe weergawe!

Bron: will.com

Voeg 'n opmerking