PHP + LDAP వెబ్ చిరునామా డైరెక్టరీని సృష్టిస్తోంది

ఒక (సాపేక్షంగా) పెద్ద ప్రచారానికి తగిన సంఖ్యలో వినియోగదారులతో అనేక రిమోట్ కార్యాలయాలు ఉన్నాయి. అన్ని కార్యాలయాలు ఒక సాధారణ డొమైన్‌తో ఒక నెట్‌వర్క్‌కి అనుసంధానించబడి ఉన్నాయి, ప్రతి కార్యాలయం యాక్టివ్ డైరెక్టరీలో (ఇకపై ADగా సూచిస్తారు) ఆర్గనైజేషన్ యూనిట్ (OU)గా నిర్వచించబడింది, దీనిలో వినియోగదారులు ఇప్పటికే సృష్టించబడ్డారు.

AD నుండి అవసరమైన ఉద్యోగి యొక్క సంప్రదింపు సమాచారాన్ని త్వరగా మరియు అప్రయత్నంగా పొందే అవకాశాన్ని వినియోగదారులకు అందించడం అవసరం మరియు చిరునామా పుస్తకం యొక్క పాత్రను పోషించే టెక్స్ట్ ఫైల్‌ను సవరించే రొటీన్ నుండి ఉచిత సిస్టమ్ నిర్వాహకులు.

సమస్యను పరిష్కరించడానికి రెడీమేడ్ తగిన ఎంపికలు లేవు, కాబట్టి నేను నా స్వంత చేతులతో మరియు తలతో ప్రతిదీ చేయాల్సి వచ్చింది.

మొదట మీరు ఏమి ఉపయోగించాలో నిర్ణయించుకోవాలి అనే వాస్తవంతో ప్రారంభిద్దాం, ఇది చాలా సులభం - చివరి డైరెక్టరీ బ్రౌజర్ ద్వారా డొమైన్ యొక్క వినియోగదారులందరికీ అందుబాటులో ఉండాలి. ldapతో కలిపి PHP గుర్తుకు వచ్చే మొదటి విషయం, మరియు మేము వాటిని ఉపయోగిస్తాము. PHPని దాని సాపేక్ష సరళతగా నేను భావిస్తున్నాను - ఏ సిస్టమ్ అడ్మినిస్ట్రేటర్ అయినా కొంచెం అవగాహన ఉన్న కోడ్‌లో అవసరమైన మార్పులు చేయగలరు, అవసరమైతే, ప్రత్యేకించి ఒత్తిడి లేకుండా.

కాబట్టి, ప్రారంభిద్దాం. ముందుగా, డొమైన్‌కు కనెక్ట్ చేయడానికి పారామితులను సెట్ చేద్దాం:

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

మేము వినియోగదారుల కోసం ఏ OUలో శోధిస్తామో నిర్ణయించడం తదుపరి అంశం. మేము $_GET['స్థలం'] నుండి విలువలను అడ్డగించడం ద్వారా దీన్ని చేస్తాము. ఉదాహరణకు, వినియోగదారు చిరునామాకు వెళితే సర్వర్/index.php?place=మొదటి, అప్పుడు వేరియబుల్ $స్థలం విలువ కేటాయించబడుతుంది మొదటి.

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

వేరియబుల్ $డాస్క్రిప్ట్ విలువను నిల్వ చేయడానికి ఇది అవసరం - మేము వినియోగదారుల కోసం శోధించే 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 యొక్క కొన్ని సంస్కరణలు ఈ విధంగా సెట్ చేసిన శైలులను అంగీకరించడానికి ఇష్టపడవు, కాబట్టి మీరు వాటిని నేరుగా స్క్రిప్ట్‌లో వ్రాయాలి):

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

మేము శైలులతో పూర్తి చేసాము, ఇప్పుడు మేము ట్యాబ్ యొక్క శీర్షికను వ్రాసి, ప్రధాన పేజీకి తిరిగి రావడానికి అనుకూలమైన లింక్‌ను గీస్తాము:

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

మేము 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];  			// 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

తరువాత మేము పేజీ పైభాగాన్ని డిజైన్ చేస్తాము:

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

తర్వాత, మేము వినియోగదారు డేటాను లూప్‌లో స్వీకరిస్తాము మరియు ప్రాసెస్ చేస్తాము, అయితే కొన్ని (ఉదాహరణకు, సేవ) ఖాతాలను దాచడానికి, మేము 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];			//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, то отображаем прочерк

మార్గం ద్వారా, మీరు మరొక లక్షణం యొక్క విలువను పొందాలంటే, గుర్తుంచుకోండి (ఇది ముఖ్యం):
అభ్యర్థనలో మేము లక్షణం పేరును పాస్ చేస్తాము చిన్న అక్షరం అక్షరాలు, లేకపోతే అది పని చేయదు.

మరియు అందుకున్న డేటాను పట్టికలో చొప్పించండి:

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

తరువాత, మేము ldap కనెక్షన్‌ని మూసివేస్తాము లేదా సర్వర్‌కు కనెక్ట్ చేయడం అసంభవం గురించి సందేశాన్ని ప్రదర్శిస్తాము:

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

లోపల ఉన్న “main_table.html” ఫైల్ లింక్‌లతో కూడిన సాధారణ html పేజీ మరియు ఇలా కనిపిస్తుంది:

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

నా కోడ్ ఎవరికైనా సహాయం చేస్తే, నేను సంతోషిస్తాను, దాన్ని ఉపయోగించండి!

మీరు దీన్ని మీ ఇష్టానుసారం ఉచితంగా సవరించవచ్చు (అభివృద్ధి/అధ్వాన్నంగా) మరియు ఏ విధంగానైనా పంపిణీ చేయవచ్చు.

Спасибо!

మూలం: www.habr.com

ఒక వ్యాఖ్యను జోడించండి