Vytváříme WEB adresář pomocí PHP + LDAP

Stalo se, že ve (relativně) velké firmě bylo mnoho vzdálených kanceláří, ve kterých bylo slušné množství uživatelů. Všechny kanceláře byly spojeny do jedné sítě se společnou doménou, každá kancelář byla v Active Directory (dále jen AD) definována jako organizační jednotka (OU), ve které již byli zakládáni uživatelé.

Bylo třeba umožnit uživatelům rychle a bez větších námahy získat kontaktní údaje potřebného zaměstnance z AD a uvolnit systémové administrátory od rutiny editace textového souboru, který hrál roli adresáře.

Připravené vhodné varianty pro řešení daného úkolu nebyly nalezeny, a proto bylo nutné udělat vše vlastními rukama a hlavou.

Začneme tím, že se musíme nejprve rozhodnout, co použít, to je jednoduché — konečný adresář musí být dostupný všem uživatelům domény prostřednictvím prohlížeče. První, co vás napadne, je PHP ve spojení s ldap, to budeme používat. Velkým plusem použití PHP považuji jeho relativní jednoduchost — jakýkoli mírně znalý systémový administrátor může, pokud je to nutné, provést potřebné úpravy v kódu, aniž by se příliš namáhal.

Takže začneme. Nejprve nastavíme parametry připojení k doméně:

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

Dalším krokem je určit, v jakém OU budeme hledat uživatele. Budeme to dělat zachytáváním hodnot z $_GET[‘place’]. Například, pokud uživatel přechází na adresu server/index.php?place=first, pak bude proměnné $place přiřazena hodnota 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;
	// zde můžete přidat další podmínky.
default:
	$doscript=false; 
	break;
}
if (!$doscript) include "main_table.html";

Proměnná $doscript slouží k tomu, aby uchovávala hodnotu — určili jsme OU, ve kterém budeme hledat uživatele, nebo ne. Pokud se nenaleznou shody uvedené v „switch-case“, pak $doscript=false, hlavní část skriptu se nebude vykonávat a bude vyvolána úvodní stránka „main_table.html“ (o ní se zmíním na konci).

Pokud jsme však definovali OU, pak přistoupíme k dalším krokům: začneme vykreslovat uživatelskou stránku adresáře:

jinak pokud ($doscript) {
{echo "
<!DOCTYPE html> 
<html xmlns='http://www.w3.org/1999/xhtml'>
<head>
<link rel='shortcut icon' href='ico.png'>
<meta charset='windows-1251/ '>

Aktivujeme styly pro příjemnější vzhled (ano, mohli jsme je připojit jako css soubor, ale některé verze IE nemají tendenci styly takto zpracovávat, takže je musíme psát přímo do skriptu):

*{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;}
	
/* Neparní řádky */#table tbody tr:nth-child(odd){background: #fff;}
	/* Párné řádky */   #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;}

S styly je konec, nyní napíšeme název záložky a vytvoříme pohodlný odkaz pro návrat na domovskou stránku:

<title>Adresář „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>Domů</p></a>
</td></tr></table>
";

Definujeme vyhledávací filtry podle AD a získáme údaje o OU:

$filter ="(&(objectcategory=user)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))"; //všichni uživatelé, kromě deaktivovaných.
$filter2 ="(objectCategory=OrganizationalUnit)"; // pro získání informací o 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];			// název místa
$PlaceAddres = $placeinfo[0]["street"][0];		// adresa místa
$PlaceMail = $placeinfo[0]["description"][0]; 	// mail místa
$PlacePhone = $placeinfo[0]["st"][0]; 		// telefon místa

Dále upravíme horní část stránky:

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"> Název </td>
	<td width='250' bgcolor = "#f0f0e4"> E-mail </td>
	<td width='60' bgcolor = "#f0f0e4"> Telefon </td>
	<td width='150' bgcolor = "#f0f0e4"> Mobile </td></tr>
	<tr><td></td><td> Údaje 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ále v cyklu získáme a zpracujeme údaje uživatelů, přičemž pro skrytí některých (například služebních) účtů stačí uvést „hide“ v poli „komnata“ v údajích uživatele v AD, tito uživatelé se nebudou zobrazovat ve vyhledávači:

for ($i=0; $i<$info["count"];$i++) { 
$UserHide = $info[$i]["physicaldeliveryofficename"][0];
if ($UserHide != 'hide') {
$UserName = $info[$i]["cn"][0];                /// Jméno uživatele
$UserPosition = $info[$i]["title"][0]; 		/// Pozice
$UserMail = $info[$i]["mail"][0];			///mail
if (!$UserMail)) $UserMail = "-";                  /// pokud nejsou údaje o schránce v AD, zobrazíme pomlčku
$UserIpPhone = $info[$i]["ipphone"][0];		///ip telefon
	if (!$UserIpPhone) $UserIpPhone = "-";    /// pokud nejsou údaje o schránce v AD, zobrazíme pomlčku
$UserMobile = $info[$i]["mobile"][0];		///mobil
	if (!$UserMobile) $UserMobile = "-";     /// pokud nejsou údaje o schránce v AD, zobrazíme pomlčku

Mimochodem, pokud potřebujete získat hodnotu jiného atributu, pamatujte (to je důležité):
v dotazu předáváme jméno atributu malými písmeny, jinak to nebude fungovat.

A vložíme získaná data do tabulky:

    echo "<tr>
	<td>". $n+=1 ."</td>
	<td> ". $UserName ."<br> <div class='smalltext'>". $UserPosition ."</div></td><td>"; // Jméno uživatele a pozice 
	if ($UserMail !='-') echo "<div class='transition-rotate'><a href="mailto:'$UserMail'">$UserMail  </a></div>";    // pokud má uživatel e-mail, vytváříme odkaz na odeslání e-mailu
	else echo "-"; //pokud není e-mail, zobrazíme pomlčku.
 	echo "<td> ". $UserIpPhone ." </td>
 	<td> ". $UserMobile ." </td></tr>";
	}
}
echo "</table>";

Dále uzavřeme spojení s ldap, nebo zobrazíme zprávu o nemožnosti připojení k serveru:

ldap_close($ds); 
} 
else echo "<h4>Nelze se připojit k LDAP serveru</h4>"; 
echo '<br><br><br></body></html>';}

Soubor „main_table.html“ uvnitř představuje jednoduchou html stránku s odkazy a vypadá přibližně takto:

<head>
<link rel="shortcut icon" href="ico.png"/>
<meta charset="windows-1251"/>
<title>Adresář „YourMegaCompanyName“</title>
</head>
<body style='background-color:#ffffff;'>
<center><a href="index.php"><img border="none" src="logo.png"/></a></center>
<center><b>Místa a kanceláře</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>

Pokud to někomu pomůže můj kód — budu rád, používejte ho!

Také ho můžete volně upravovat podle svých představ (vylepšovat/horšit) a šířit jakýmikoliv způsoby.

Děkujeme za pozornost!

Zdroj: habr.com

Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster