Kreante TTT-adresaron PHP + LDAP

Okazis, ke (relative) granda kampanjo havis multajn forajn oficejojn kun deca nombro da uzantoj. Ĉiuj oficejoj estas konektitaj en unu reto kun komuna domajno, ĉiu oficejo estis difinita en Aktiva Dosierujo (ĉi-poste nomata AD) kiel Organizunuo (OU), en kiu uzantoj jam estis kreitaj.

Necesis doni al uzantoj la ŝancon rapide kaj senpene akiri la kontaktinformojn de la bezonata dungito de AD, kaj senpagajn sistemadministrantojn de la rutino de redaktado de tekstdosiero, kiu ludis la rolon de adresaro.

Ne estis pretaj taŭgaj elektoj por solvi la problemon, do mi devis fari ĉion per miaj propraj manoj kaj kapo.

Ni komencu per tio, ke unue vi devas decidi kion uzi, ĝi estas simpla - la fina dosierujo estu disponebla por ĉiuj uzantoj de la domajno per retumilo. La unua afero, kiu venas al la menso, estas PHP kune kun ldap, kaj ni uzos ilin. Mi konsideras, ke la granda avantaĝo uzi PHP estas ĝia relativa simpleco - ĉiu sistemadministranto kun eĉ malgranda kompreno povos fari la necesajn ŝanĝojn al la kodo, se necese, sen aparte streĉo.

Do, ni komencu. Unue, ni agordu la parametrojn por konekti al la domajno:

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

La sekva punkto estas determini en kiu OU ni serĉos uzantojn. Ni faros tion per kaptado de valoroj de $_GET ['loko']. Ekzemple, se la uzanto iras al la adreso server/index.php?place=unua, tiam la variablo $loko estos asignita valoro unua.

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

Variablo $doskribo necesas por konservi la valoron - ĉu ni difinis la OU en kiu ni serĉos uzantojn aŭ ne. Se ne estas kongruoj listigitaj en la "switch-case", tiam $doscript=false, la ĉefa parto de la skripto ne estos ekzekutita, kaj la komenca paĝo "main_table.html" estos montrata (mi rakontos al vi pri ĝi ĉe la fino mem).

Se ni difinis OU, tiam ni daŭrigas pliajn agojn: ni komencas desegni dosierujan paĝon por la uzanto:

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

Ni inkluzivas stilojn por pli agrabla aspekto (jes, ili povus esti inkluzivitaj kiel css-dosiero, sed iuj versioj de IE ne volas akcepti stilojn tiel fiksitajn, do vi devas skribi ilin rekte en la skripton):

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

Ni finis kun la stiloj, nun ni skribas la titolon de la langeto kaj desegnas oportunan ligilon por reveni al la ĉefa paĝo:

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

Ni difinas serĉfiltrilojn laŭ AD kaj ricevas datumojn pri la 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

Poste ni desegnas la supron de la paĝo:

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

Poste, ni ricevas kaj prilaboras uzantajn datumojn en buklo, dum por kaŝi iujn (ekzemple, servo) kontojn, ni simple enmetas "kaŝi" en la kampo "ĉambro" en la uzantdetaloj en AD, tiaj uzantoj ne estos. montrata en la dosierujo:

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

Cetere, se vi bezonas akiri la valoron de alia atributo, tiam memoru (ĉi tio estas grava):
en la peto ni transdonas la atributan nomon minuskla literoj, alie ĝi ne funkcios.

Kaj enigu la ricevitajn datumojn en la tabelon:

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

Poste, ni fermas la ldap-konekton, aŭ montras mesaĝon pri la neebleco konekti al la servilo:

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

La dosiero "main_table.html" de interne estas simpla html-paĝo kun ligiloj, kaj aspektas kiel ĉi tio:

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

Se mia kodo helpas iun, mi ĝojos, uzu ĝin!

Vi ankaŭ povas libere redakti ĝin laŭplaĉe (plibonigi/malbonigi) kaj disvastigi ĝin per ajna maniero.

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

fonto: www.habr.com

Aldoni komenton