Afirandina pelrêça navnîşana WEB PHP + LDAP

Wusa qewimî ku kampanyayek (bi nisbetî) mezin gelek nivîsgehên dûr bi hejmareke maqûl a bikarhêneran hebûn. Hemî nivîsgeh bi yek torê ve bi domainek hevpar ve girêdayî ne, her ofîs di Active Directory de (li vir AD tê binav kirin) wekî Yekîneyek Rêxistinê (OU) hate destnîşankirin, ku tê de bikarhêner berê hatine afirandin.

Pêwîst bû ku fersendê bide bikarhêneran ku bi lez û bez agahdariya pêwendiya karmendê pêdivî ji AD bistînin, û rêvebirên pergalê ji rûtîn guherandina pelek nivîsê ya ku rola pirtûka navnîşan lîstiye azad bikin.

Ji bo çareserkirina pirsgirêkê vebijarkên guncan ên amade tunebûn, ji ber vê yekê neçar bûm ku her tiştî bi dest û serê xwe bikim.

Ka em bi vê rastiyê dest pê bikin ku pêşî hûn hewce ne ku biryar bidin ka çi bikar bînin, ew hêsan e - pelrêça paşîn divê ji hemî bikarhênerên domainê re bi gerokek peyda bibe. Yekem tiştê ku tê bîra PHP-ê bi ldap-ê re têkildar e, û em ê wan bikar bînin. Ez feydeya mezin a karanîna PHP-ê hêsaniya wê ya têkildar dihesibînim - her rêvebirê pergalê bi têgihîştinek piçûk jî dê bikaribe guhertinên pêwîst di kodê de, ger hewce bike, bêyî ku bi taybetî tengahî bike.

Ji ber vê yekê, em dest pê bikin. Pêşî, bila em parametreyên ji bo girêdana bi domainê re destnîşan bikin:

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

Xala din ev e ku em diyar bikin ku em ê li kîjan OU-yê li bikarhêneran bigerin. Em ê vê yekê bi navgînkirina nirxên ji $_GET['cih'] bikin. Ji bo nimûne, eger bikarhêner diçe navnîşanê server/index.php?place=yekem, paşê guherbar $cih dê nirxek were destnîşan kirin yekem.

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

Têgûherr $doscript ji bo hilanîna nirxê hewce ye - gelo me OU-ya ku em ê tê de li bikarhêneran bigerin diyar kiriye an na. Ger di "switch-case" de hevberî nehatibe navnîş kirin, wê hingê $doscript=false, beşa sereke ya skrîptê nayê darve kirin, û rûpela destpêkê "main_table.html" dê were xuyang kirin (ez ê ji we re vebêjim ew di dawiyê de).

Ger me OU diyar kiribe, wê hingê em berbi kiryarên din ve diçin: em dest bi xêzkirina rûpelek pelrêça ji bo bikarhêner dikin:

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

Em şêwazên ji bo xuyangek xweştir vedigirin (erê, ew dikarin wekî pelek css werin nav kirin, lê hin guhertoyên IE naxwazin şêwazên bi vî rengî hatine destnîşan kirin qebûl bikin, ji ber vê yekê hûn neçar in ku wan rasterast di skrîptê de binivîsin):

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

Em bi şêwazan qediyan, naha em sernavê tabloyê dinivîsin û zencîreyek hêsan dikêşin da ku vegerin ser rûpela sereke:

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

Em fîlterên lêgerînê ji hêla AD-ê ve diyar dikin û di derbarê OU de daneyan digirin:

$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

Piştre em serê rûpelê sêwiran dikin:

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ûv re, em daneyên bikarhênerê di dorpêkekê de distînin û pêvajoyê dikin, di heman demê de ji bo ku em hin hesabên (mînakî, karûbar) veşêrin, em tenê di nav hûrguliyên bikarhêner de di AD-ê de di qada "odê" de "veşêre" têkevin, bikarhênerên weha dê nebin. di pelrêçê de têne xuyang kirin:

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

Bi awayê, heke hûn hewce ne ku nirxa taybetmendiyek din bistînin, wê hingê bîr bînin (ev girîng e):
di daxwazê ​​de em navê taybetmendiyê derbas dikin tîpên biçûk nameyên, wekî din ew ê nexebite.

Û daneyên wergirtî têxin tabloyê:

    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ûv re, em pêwendiya ldap-ê digirin, an peyamek li ser ne gengaziya girêdana bi serverê re nîşan didin:

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

Pelê "main_table.html" ji hundurê rûpelek html-ê ya hêsan a bi lînkan e, û tiştek bi vî rengî xuya dike:

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

Ger koda min arîkariya kesek bike, ez ê kêfxweş bibim, wê bikar bînin!

Her weha hûn dikarin bi serbestî li gorî ku hûn dixwazin biguhezînin (baştir/xirabtir) û bi her awayî belav bikin.

Ji bo baldariya te spas!

Source: www.habr.com

Add a comment