Ստեղծում ենք WEB հասցեական մատյան PHP + LDAP

Այդպես տեղի ունեցավ, որ (կանխատեսելի) մեծ ընկերությունում բազմաթիվ հեռավոր գրասենյակներ կային, որտեղ բավականաչափ օգտվողներ գոյություն ունեին: Բոլոր գրասենյակները միացված են մեկ الشبكة ընդհանուր տիրույթով, յուրաքանչյուրը գրասենյակ Active Directory-ում (ապագայում AD) սահմանված է որպես Organization Unit (OU), որտեղ արդեն ստեղծվել էին օգտվողները:

Որոշելու անհրաժեշտություն կար օգտվողներին, որպեսզի նրանք կարողանան արագ և առանց հատուկ ջանքերի ձեռք բերել անհրաժեշտ աշխատակցի կապի տվյալները AD-ից, իսկ համակարգի ադմինիստրատորներին ազատել ტექստային ֆայլի խմբագրումից, որը ծառայում էր հասցեի գրքի դերակատարության:

Պատրաստի համապատասխան տարբերակներ խնդիրը լուծելու համար չգտնվեց, այնպես որ ստիպված եղանք ամեն բան անել մեր ձեռքերով և մտքերով:

Ուրեմն սկսենք նրանից, որ պետք է որոշենք, թե ինչ օգտագործել, սա պարզ է՝ վերջնական վարգորոշիչը պետք է լինի հասանելի բոլոր կրիչների համար սանդղակային միջոցով: Առաջինը, որ գալիս է մտքում, դա PHP-ն է ldap-ի հետ միասին, դրանք էլ ենք օգտագործելու: PHP-ի օգտագործման մեծ առավելություններից մեկը նրա հարաբերական պարզությունն է, որ ցանկացած համակարգի ադմինիստրատոր, որն էլ քիչ թե շատ հասկանում է ծրագրավորման մեջ, կկարողանա անհրաժեշտ փոփոխություններ անել կոդում, առանց ծայրահեղ դժվարանալու:

Ուրեմն սկսենք: Նախ պետք է սահմանենք կապի պարամետրերը տիրույթի հետ:

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

Հաջորդ քայլում պետք է սահմանենք, թե որ OU-ում ենք փնտրելու օգտվողներին: Դա անելու ենք վերբեռնելով արժեքները $_GET[‘place’]-ից: Օրինակ, եթե օգտվողը գնում է հասցեով server/index.php?place=first, ապա փոխարինող $place փոխարինողը արժեք է ստանում 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;
	// այստեղ կարելի է ավելացնել ևս պայմաններ.
default:
	$doscript=false; 
	break;
}
if (!$doscript) include "main_table.html";

Փոխարինող $doscript պետք է պահի արժեք՝ արդյոք մենք սահմանել ենք OU-ն, որտեղ պետք է որոնենք օգտվողներին, թե ոչ: Եթե «switch-case»-ում տվյալներ չեն հայտնաբերվել, ապա $doscript=false, հիմնական սկրիպտը չի կատարվի, և կցուցադրվի մեկնարկային էջ «main_table.html» (այս մասին ավելի ուշ կխոսեմ):

Իսկ եթե մենք սահմանել ենք OU-ն, ապա անցնում ենք հետագա քայլերին՝ սկսելով օգտվողին ցուցակիչի էջ նկարել:

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

Ինչպես նաև ակտիվացնում ենք ոճեր ավելի հաճելի տեսք ունենալու համար (այո, դրանք կարելի էր միացնել որպես css-ֆայլ, սակայն որոշ IE տարբերակներ չեն ցանկանում ընդունել այդ ձևով սահմանված ոճերը, ուստի պարտավոր ենք գրել ուղղակի սկրիպտում):

*{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;}
		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;}

Զանգվածից ընտրված է, հիմա գրում ենք թերթիկի վերնագիր և պատրաստում հարմար վերադարձման հղում դեպի գլխավոր էջ:

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

Որոշում ենք որոնողական ֆիլտրեր AD-ի համար եւ ստանում ենք 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];        // Այս վայրի անունը
$PlaceAddres = $placeinfo[0]["street"][0];        // Այս վայրի հասցեն
$PlaceMail = $placeinfo[0]["description"][0];   // Այս վայրի էլեկտրոնային հասցեն
$PlacePhone = $placeinfo[0]["st"][0];       // Այս վայրի հեռախոսահամարը

Հաջորդիվ ձևավորում ենք էջի վերին մասը:

հնչյուն<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"> Էլ. փոստ </td>
	<td width='60' bgcolor = "#f0f0e4"> Հեռախոս </td>
	<td width='150' bgcolor = "#f0f0e4"> Մոբիլ </td></tr>
	<tr><td></td><td> OU տեղեկություններ </td><td>";
hնչյուն "<div class='transition-rotate'><a href="mailto:"" . $placemail .">" . $PlaceMail . " </a></div>";
hնչյուն "</td><td width='150'> " . $PlacePhone . " </td><td> - </td></tr>";

Հետո արտաքին գծերով ստանում և մշակվում են օգտվողների տվյալները, իսկ որոշ (օրինակ, ծառայողական) հաշիվները թաքցնելու համար պարզապես գրված է «hide» «սենյակ» դաշտում AD-ի օգտվողների տվյալներում, այդպիսի օգտվողները չեն көрсетվելու տվյալների բազայում:

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];               // էլ. հասցեն
if (!$UserMail)) $UserMail = "-";                  // Եթե AD-ում ոչ մի տվյալ չկա, ցույց է տրվում նշանը
$UserIpPhone = $info[$i]["ipphone"][0];           // IP հեռախոս
	if (!$UserIpPhone) $UserIpPhone = "-";  // Եթե AD-ում ոչ մի տվյալ չկա, ցույց է տրվում նշանը
$UserMobile = $info[$i]["mobile"][0];         // մոբիլային
	if (!$UserMobile) $UserMobile = "-";      // Եթե AD-ում ոչ մի տվյալ չկա, ցույց է տրվում նշանը

Առիթ կա, եթե ձեզ այլ ատրիբուտի արժեք ստանալու համար պետք է, գիտեք (նաև կարևոր է):
ֆիլտրում փոխանցում ենք ատրիբուտի անվանումը ափա տառերով, այլապես չի աշխատելու:

Եւ ստանում ենք ստացված տվյալները աղյուսակում:

    և "<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>";    // եթե օգտվողն ունի էլ. փոստ, ստեղծում ենք կապի հղում
	else echo "-"; //եթե էլ. փոստ չկա, ставим прочерк.
 	echo "<td> ". $UserIpPhone ." </td>
 	<td> ". $UserMobile ." </td></tr>";
	}
}
echo "</table>";

Այնուհետև մենք փակել ենք ldap կապը, կամ ցույց տալիս ենք հաղորդագրություն, որ սերվերին կապ հաստատելը անհնար է:

ldap_close($ds); 
} 
else echo "<h4>LDAP ծառայություն միանալու անհաջողություն</h4>"; 
echo '<br><br><br></body></html>';}

Ֆայլը «main_table.html» ներսում իրենից ներկայացում է պարզ html էջ կապերով, և դիտվող լինում է մոտավորապես այնպես:

<head>
<link rel="shortcut icon" href="ico.png"/>
<meta charset="windows-1251"/>
<title>«YourMegaCompanyName» ընկերության հասցեիսնություն</title>
</head>
<body style='background-color:#ffffff;'>
<center><a href="index.php"><img border="none" src="logo.png"/></a></center>
<center><b>Տեղեր և գրասենյակներ</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>

Եթե մեկին կօգնի իմ կոդը՝ ես կվայելեմ, օգտագործեք:

Ուրախությամբ կարող եք ազատորեն խմբագրել այն, ինչպես ցանկանում եք (ուրախացնել/վատացնել) և տարածել ցանկացած եղանակով:

Շնորհակալություն ուշադրություն դնելու համար!

Ընտանիք: habr.com

Գնել հուսալի հյուրընկալում DDoS պաշտպանությամբ, VPS VDS սերվերներով 🔥 Գնել հուսալի հյուրընկալում DDoS պաշտպանությամբ, VPS VDS սերվերներով | ProHoster