WEB-osoitehakemiston luominen PHP + LDAP

Kävi niin, että (suhteellisen) suuressa kampanjassa oli useita etätoimistoja, joissa oli kunnollinen määrä käyttäjiä. Kaikki toimistot on liitetty yhteen verkkoon, jolla on yhteinen toimialue, jokainen toimisto on määritelty Active Directoryssa (jäljempänä AD) organisaatioyksiköksi (OU), johon käyttäjät oli jo luotu.

Oli tarpeen antaa käyttäjille mahdollisuus saada nopeasti ja vaivattomasti tarvittavan työntekijän yhteystiedot AD:lta ja vapauttaa järjestelmänvalvojat osoitekirjan roolissa olevan tekstitiedoston muokkausrutiineista.

Ongelman ratkaisemiseksi ei ollut valmiita sopivia vaihtoehtoja, joten minun piti tehdä kaikki omin käsin ja pään avulla.

Aloitetaan siitä, että ensin sinun on päätettävä, mitä käyttää, se on yksinkertaista - lopullisen hakemiston pitäisi olla kaikkien verkkotunnuksen käyttäjien saatavilla selaimen kautta. Ensimmäinen asia, joka tulee mieleen, on PHP yhdessä ldapin kanssa, ja käytämme niitä. Pidän PHP:n käytön suurena etuna sen suhteellista yksinkertaisuutta - kuka tahansa järjestelmänvalvoja, jolla on vähänkin ymmärrystä, pystyy tarvittaessa tekemään tarvittavat muutokset koodiin ilman erityistä rasitusta.

Joten aloitetaan. Ensin asetetaan parametrit verkkotunnukseen yhdistämistä varten:

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

Seuraava kohta on määrittää, mistä organisaatioyksiköstä etsimme käyttäjiä. Teemme tämän sieppaamalla arvot kohteesta $_GET['place']. Esimerkiksi jos käyttäjä menee osoitteeseen server/index.php?place=ensimmäinen, sitten muuttuja $paikka annetaan arvo ensimmäinen.

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

muuttuja $doscript tarvitaan arvon tallentamiseen - riippumatta siitä, olemmeko määrittäneet organisaatioyksikön, josta etsimme käyttäjiä vai emme. Jos "switch-case" -kohdassa ei ole vastaavuuksia, $doscript=false, komentosarjan pääosaa ei suoriteta ja aloitussivu "main_table.html" tulee näkyviin (kerron sinulle se aivan lopussa).

Jos olemme määrittäneet organisaatioyksikön, siirrymme lisätoimintoihin: alamme piirtää käyttäjälle hakemistosivun:

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

Sisällytämme tyylit miellyttävämpään ulkoasuun (kyllä, ne voitaisiin sisällyttää css-tiedostona, mutta jotkin IE:n versiot eivät halua hyväksyä tällä tavalla asetettuja tyylejä, joten sinun on kirjoitettava ne suoraan skriptiin):

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

Tyylit ovat valmiit, nyt kirjoitamme välilehden otsikon ja piirrämme kätevän linkin palataksemme pääsivulle:

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

Määrittelemme hakusuodattimet AD:n mukaan ja saamme tietoja organisaatioyksiköstä:

$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

Seuraavaksi suunnittelemme sivun yläosan:

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

Seuraavaksi vastaanotamme ja käsittelemme käyttäjätietoja silmukassa, kun taas joidenkin (esimerkiksi palvelu-) tilien piilottamiseksi kirjoitamme yksinkertaisesti "piilota" AD:n käyttäjätietojen "huone"-kenttään. näkyy hakemistossa:

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

Muuten, jos haluat saada toisen määritteen arvon, muista (tämä on tärkeää):
pyynnössä välitämme määritteen nimen pienet kirjaimet kirjeet, muuten se ei toimi.

Ja lisää vastaanotetut tiedot taulukkoon:

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

Seuraavaksi suljemme ldap-yhteyden tai näytämme viestin mahdottomasta muodostaa yhteyttä palvelimeen:

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

Tiedosto "main_table.html" sisältäpäin on yksinkertainen html-sivu, jossa on linkkejä, ja se näyttää suunnilleen tältä:

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

Jos koodini auttaa jotakuta, olen iloinen, käytä sitä!

Voit myös vapaasti muokata sitä haluamallasi tavalla (parantaa/pahentaa) ja levittää sitä millä tahansa tavalla.

Спасибо за внимание!

Lähde: will.com

Lisää kommentti