It meitsjen fan in WEB-adresmap PHP + LDAP

It barde dat in (relatyf) grutte kampanje in protte kantoaren op ôfstân hie mei in fatsoenlik oantal brûkers. Alle kantoaren binne ferbûn yn ien netwurk mei in mienskiplik domein, elk kantoar waard definiearre yn Active Directory (hjirnei oantsjutten as AD) as in Organization Unit (OU), wêryn brûkers waarden al makke.

It wie nedich om brûkers de kâns te jaan om fluch en maklik de kontaktynformaasje fan 'e fereaske meiwurker fan AD te krijen, en systeembehearders fergees te meitsjen fan' e routine fan it bewurkjen fan in tekstbestân dy't de rol fan in adresboek spile.

D'r wiene gjin klearebare passende opsjes foar it oplossen fan it probleem, dus ik moast alles mei myn eigen hannen en holle dwaan.

Litte wy begjinne mei it feit dat jo earst moatte beslute wat te brûken, it is ienfâldich - de definitive map moat beskikber wêze foar alle brûkers fan it domein fia in browser. It earste ding dat yn 't sin komt is PHP yn gearhing mei ldap, en wy sille se brûke. Ik beskôgje it grutte foardiel fan it brûken fan PHP as syn relative ienfâld - elke systeembehearder mei sels in bytsje begryp sil de nedige wizigingen yn 'e koade kinne meitsje, as it nedich is, sûnder spesjaal ynspanning.

Dus, litte wy begjinne. Litte wy earst de parameters ynstelle foar ferbining mei it domein:

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

It folgjende punt is om te bepalen yn hokker OU wy sille sykje nei brûkers. Wy sille dit dwaan troch wearden te ûnderskeppen fan $_GET['plak']. Bygelyks, as de brûker nei it adres giet server/index.php?place=earste, dan de fariabele $plak sil wurde tawiisd de wearde earste.

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

Variable $doskript is nedich om de wearde op te slaan - oft wy de OU hawwe definieare wêryn wy sille sykje nei brûkers of net. As d'r gjin wedstriden binne neamd yn 'e "switch-case", dan $doscript=false, it haaddiel fan it skript sil net wurde útfierd, en de startside "main_table.html" sil wurde werjûn (ik sil jo fertelle oer it oan 'e ein).

As wy in OU hawwe definieare, geane wy ​​troch nei fierdere aksjes: wy begjinne in mapside te tekenjen foar de brûker:

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

Wy befetsje stilen foar in nofliker uterlik (ja, se kinne opnommen wurde as in css-bestân, mar guon ferzjes fan IE wolle gjin stilen akseptearje dy't op dizze manier ynsteld binne, dus jo moatte se direkt yn it skript skriuwe):

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

Wy binne klear mei de stilen, no skriuwe wy de titel fan 'e ljepper en tekenje in handige keppeling om werom te gean nei de haadside:

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

Wy definiearje sykfilters troch AD en krije gegevens oer de OU:

$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

Folgjende ûntwerpe wy de boppekant fan 'e side:

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êrnei ûntfange en ferwurkje wy brûkersgegevens yn in lus, wylst om guon (bygelyks tsjinst) akkounts te ferbergjen, wy gewoan "ferbergje" yn it "keamer" fjild yn 'e brûkersdetails yn AD ynfiere, sokke brûkers sille net wêze werjûn yn de map:

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

Trouwens, as jo de wearde fan in oar attribút moatte krije, tink dan oan (dit is wichtich):
yn it fersyk passe wy de attribútnamme troch lytse letters letters, oars sil it net wurkje.

En ynfoegje de ûntfongen gegevens yn 'e tabel:

    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êrnei slute wy de ldap-ferbining, of werjaan in berjocht oer de ûnmooglikheid fan ferbining mei de tsjinner:

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

It bestân "main_table.html" fan binnen is in ienfâldige html-side mei keppelings, en sjocht der sa út:

<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 myn koade helpt immen, Ik sil wêze bliid, brûk it!

Jo kinne it ek frij bewurkje sa't jo wolle (ferbetterje / slimmer) en fersprieden it op alle manieren.

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

Boarne: www.habr.com

Add a comment