Ukudala uhla lwemibhalo yekheli le-WEB PHP + LDAP

Kwenzeka ukuthi umkhankaso omkhulu (ngokulinganiselwe) ube namahhovisi amaningi akude anenani elihloniphekile labasebenzisi. Wonke amahhovisi axhunywe kunethiwekhi eyodwa enesizinda esivamile, ihhovisi ngalinye lachazwa ku-Active Directory (kamuva ebizwa ngokuthi i-AD) njenge-Organization Unit (OU), lapho abasebenzisi base bevele bedalwe khona.

Kwakudingeka ukunikeza abasebenzisi ithuba lokuthola ngokushesha futhi kalula ulwazi lokuxhumana lomsebenzi odingekayo kusuka ku-AD, kanye nabaphathi besistimu yamahhala kusukela ohlelweni lokuhlela ifayela lombhalo elidlala indima yencwadi yamakheli.

Zazingekho izinketho ezifanele esezenziwe ngomumo zokuxazulula inkinga, ngakho kwakufanele ngenze yonke into ngezandla zami nangekhanda.

Ake siqale ngeqiniso lokuthi okokuqala udinga ukunquma ukuthi yini ozoyisebenzisa, kulula - umkhombandlela wokugcina kufanele utholakale kubo bonke abasebenzisi besizinda ngesiphequluli. Into yokuqala efika engqondweni i-PHP ngokuhlanganyela ne-ldap, futhi sizoyisebenzisa. Ngibheka inzuzo enkulu yokusebenzisa i-PHP njengokulula kwayo - noma yimuphi umlawuli wesistimu onokuqonda okuncane uzokwazi ukwenza izinguquko ezidingekayo kukhodi, uma kunesidingo, ngaphandle kokucindezela ngokukhethekile.

Ngakho, ake siqale. Okokuqala, ake simise imingcele yokuxhuma esizindeni:

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

Iphuzu elilandelayo ukunquma ukuthi iyiphi i-OU esizoyisesha abasebenzisi. Sizokwenza lokhu ngokunqamula amanani ​​kusuka ku-$_GET['indawo']. Isibonelo, uma umsebenzisi eya ekhelini iseva/index.php?place=kuqala, bese kuba ukushintshashintsha Indawo ye-$ izonikezwa inani kuqala.

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

Iyaguquguquka $doscript kuyadingeka ukuze kugcinwe inani - noma ngabe siyichazile i-OU lapho sizosesha khona abasebenzisi noma cha. Uma kungekho okufanayo okubalwe “ku-switch-case”, bese i-$doscript=false, ingxenye eyinhloko yombhalo ngeke isetshenziswe, futhi ikhasi lokuqala elithi “main_table.html” lizovezwa (ngizokutshela mayelana ekugcineni).

Uma sichaze i-OU, bese siqhubekela ezenzweni ezengeziwe: siqala ukudweba ikhasi lenkomba yomsebenzisi:

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

Sifaka izitayela zokubukeka okujabulisa kakhudlwana (yebo, zingafakwa njengefayela le-css, kodwa ezinye izinguqulo ze-IE azifuni ukwamukela izitayela ezibekwe ngale ndlela, ngakho-ke kufanele uzibhale ngqo kuskripthi):

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

Sesiqedile ngezitayela, manje sibhala isihloko sethebhu bese sidweba isixhumanisi esilungele ukubuyela ekhasini eliyinhloko:

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

Sichaza izihlungi zosesho nge-AD futhi sithola idatha mayelana ne-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

Okulandelayo siklama phezulu kwekhasi:

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

Okulandelayo, sithola futhi sicubungule idatha yomsebenzisi ku-loop, kuyilapho ukuze sifihle amanye (isibonelo, isevisi) ama-akhawunti, sivele sifake okuthi “fihla” endaweni “yegumbi” emininingwaneni yomsebenzisi ku-AD, abasebenzisi abanjalo ngeke kuboniswe kuhla lwemibhalo:

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

Phela, uma udinga ukuthola inani lesinye isici, khumbula (lokhu kubalulekile):
esicelweni sidlulisa igama lemfanelo izinhlamvu ezincane izincwadi, kungenjalo ngeke kusebenze.

Bese ufaka idatha etholiwe kuthebula:

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

Okulandelayo, sivala uxhumano lwe-ldap, noma sibonise umlayezo mayelana nokungenzeki kokuxhuma kuseva:

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

Ifayela elithi “main_table.html” elingaphakathi liyikhasi le-html elilula elinezixhumanisi, futhi libukeka kanje:

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

Uma ikhodi yami isiza noma ubani, ngizojabula, ngiyisebenzise!

Ungakwazi futhi ukukuhlela ngokukhululekile njengoba uthanda (uthuthukise/okubi kakhulu) futhi usabalalise nganoma iyiphi indlela.

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

Source: www.habr.com

Engeza amazwana