Að búa til veffangaskrá PHP + LDAP

Það gerðist svo að (tiltölulega) stór herferð hafði margar fjarskrifstofur með ágætis fjölda notenda. Allar skrifstofur eru tengdar í eitt net með sameiginlegu léni, hver skrifstofa var skilgreind í Active Directory (hér eftir nefnt AD) sem skipulagseining (OU), þar sem notendur voru þegar búnir til.

Nauðsynlegt var að gefa notendum tækifæri til að fá fljótt og áreynslulaust tengiliðaupplýsingar tilskilins starfsmanns frá AD og losa kerfisstjóra undan þeirri venju að breyta textaskrá sem gegndi hlutverki heimilisfangabókar.

Það voru engir tilbúnir hentugir möguleikar til að leysa vandamálið, svo ég þurfti að gera allt með eigin höndum og höfði.

Við skulum byrja á því að fyrst þarftu að ákveða hvað á að nota, það er einfalt - lokaskráin ætti að vera aðgengileg öllum notendum lénsins í gegnum vafra. Það fyrsta sem kemur upp í hugann er PHP í tengslum við ldap og við munum nota þau. Ég tel stóra kostinn við að nota PHP vera hlutfallslegan einfaldleika þess - hvaða kerfisstjóri sem er með jafnvel smá skilning getur gert nauðsynlegar breytingar á kóðanum, ef nauðsyn krefur, án sérstakrar álags.

Svo, við skulum byrja. Fyrst skulum við stilla færibreytur fyrir tengingu við lénið:

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

Næsti liður er að ákvarða í hvaða OE við munum leita að notendum. Við munum gera þetta með því að stöðva gildi frá $_GET['staður']. Til dæmis ef notandinn fer á heimilisfangið server/index.php?place=fyrsta, þá breytuna $ stað verður úthlutað gildinu fyrsta.

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

Breytilegt $skjal er nauðsynlegt til að geyma gildið - hvort sem við höfum skilgreint OU þar sem við munum leita að notendum eða ekki. Ef það eru engar samsvörun skráðar í „switch-case“, þá $doscript=false, verður aðalhluti skriftunnar ekki keyrður og upphafssíðan „main_table.html“ birtist (ég skal segja þér frá það alveg í lokin).

Ef við höfum skilgreint OE, þá höldum við áfram í frekari aðgerðir: við byrjum að teikna möppusíðu fyrir notandann:

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

Við tökum stíla fyrir skemmtilegra útlit (já, þeir gætu verið með sem css skrá, en sumar útgáfur af IE vilja ekki samþykkja stíla sem eru settir á þennan hátt, svo þú verður að skrifa þá beint inn í handritið):

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

Við erum búin með stílana, nú skrifum við titil flipans og teiknum þægilegan hlekk til að fara aftur á aðalsíðuna:

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

Við skilgreinum leitarsíur eftir AD og fáum gögn um 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

Næst hönnum við efst á síðunni:

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

Næst tökum við á móti og vinnum úr notendagögnum í lykkju, en til að fela suma (til dæmis þjónustu) reikninga slæðum við einfaldlega inn „fela“ í „herbergi“ reitinn í notendaupplýsingunum í AD, slíkir notendur verða ekki birtist í möppunni:

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

Við the vegur, ef þú þarft að fá gildi annars eiginleika, þá mundu (þetta er mikilvægt):
í beiðninni sendum við eigindarheitið lágstafir í bréfum, annars virkar það ekki.

Og settu mótteknu gögnin inn í töfluna:

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

Næst lokum við ldap-tengingunni eða birtum skilaboð um ómögulegt að tengjast þjóninum:

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

Skráin „main_table.html“ innan frá er einföld HTML síða með tenglum og lítur einhvern veginn svona út:

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

Ef kóðinn minn hjálpar einhverjum, mun ég vera ánægður, notaðu hann!

Þú getur líka breytt því að vild (bætt/verra) og dreift því með hvaða hætti sem er.

Svara með tilvísun!

Heimild: www.habr.com

Bæta við athugasemd