Nyieun diréktori alamat Wéb PHP + LDAP

Éta kajadian yén kampanye (relatif) ageung ngagaduhan seueur kantor terpencil kalayan sajumlah pangguna anu lumayan. Sadaya kantor disambungkeun kana hiji jaringan sareng domain umum, unggal kantor didefinisikeun dina Active Directory (saterusna disebut AD) salaku Unit Organisasi (OU), dimana pamaké geus dijieun.

Ieu diperlukeun pikeun masihan pamaké kasempetan pikeun gancang sarta effortlessly ménta inpo kontak tina pagawe diperlukeun ti AD, sarta pangurus sistem bébas tina rutin ngédit file téks nu maénkeun peran hiji buku alamat.

Henteu aya pilihan anu cocog pikeun ngarengsekeun masalah, janten kuring kedah ngalakukeun sadayana nganggo panangan sareng sirah kuring.

Hayu urang mimitian ku kanyataan yén mimitina anjeun kedah mutuskeun naon anu dianggo, éta saderhana - diréktori final kedah sayogi pikeun sadaya pangguna domain ngalangkungan browser. Hal kahiji anu datang ka pikiran téh PHP ditéang jeung ldap, sarta kami bakal ngagunakeun éta. Kuring nganggap kauntungan anu ageung tina ngagunakeun PHP janten kesederhanaan relatif - naon waé administrator sistem anu gaduh sakedik pamahaman bakal tiasa ngadamel parobihan anu dipikabutuh pikeun kodeu, upami diperyogikeun, tanpa ngagentos.

Ku kituna, hayu urang mimitian. Mimiti, hayu urang nyetél parameter pikeun nyambungkeun kana domain:

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

Titik salajengna nyaéta pikeun nangtukeun mana OU kami bakal milarian pangguna. Urang bakal ngalakukeun ieu ku intercepting nilai tina $_GET['tempat']. Salaku conto, upami pangguna angkat ka alamat server/index.php?place=kahiji, lajeng variabel $tempat bakal dibéré nilai kahiji.

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

Variabel $doskrip diperlukeun pikeun nyimpen nilai - naha urang geus nangtukeun OU nu urang bakal neangan pamaké atawa henteu. Upami teu aya patandingan anu didaptarkeun dina "switch-case", maka $doscript=false, bagian utama naskah moal dieksekusi, sareng halaman awal "main_table.html" bakal ditingalikeun (Kuring bakal nyarioskeun ka anjeun ngeunaan éta dina tungtungna).

Upami urang parantos netepkeun OU, teras urang teraskeun kana tindakan salajengna: urang ngawitan ngagambar halaman diréktori pikeun pangguna:

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

Kami kalebet gaya pikeun tampilan anu langkung pikaresepeun (enya, aranjeunna tiasa dilebetkeun salaku file css, tapi sababaraha versi IE henteu hoyong nampi gaya anu disetél ku cara ieu, janten anjeun kedah nyerat langsung kana naskah):

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

Kami parantos réngsé gaya, ayeuna urang nyerat judul tab sareng ngagambar tautan anu cocog pikeun uih deui ka halaman utama:

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

Urang nangtukeun saringan pilarian ku AD sarta meunangkeun data ngeunaan 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

Salajengna urang ngarancang luhureun kaca:

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

Salajengna, urang nampi sareng ngolah data pangguna dina hiji loop, sedengkeun pikeun nyumputkeun sababaraha akun (contona, jasa), urang ngan saukur ngalebetkeun "nyumputkeun" dina widang "kamar" dina detil pangguna dina AD, pangguna sapertos kitu moal aya. dipintonkeun dina diréktori:

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

Ngomong-ngomong, upami anjeun kedah kéngingkeun nilai atribut anu sanés, teras émut (ieu penting):
dina pamundut urang lulus nami atribut aksara leutik hurup, disebutkeun eta moal jalan.

Sareng selapkeun data anu ditampi kana tabél:

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

Salajengna, urang nutup sambungan ldap, atawa nembongkeun pesen ngeunaan impossibility nyambung ka server:

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

Berkas "main_table.html" ti jero mangrupikeun halaman html anu sederhana sareng tautan, sareng katingali sapertos kieu:

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

Lamun kode kuring mantuan saha, Kuring bakal bungah, make eta!

Anjeun ogé tiasa sacara bébas ngédit éta sakumaha anu anjeun pikahoyong (ngaronjatkeun / langkung parah) sareng nyebarkeun ku cara naon waé.

Hatur nuhun kanggo nengetan!

sumber: www.habr.com

Tambahkeun komentar