PHP + LDAP இணைய முகவரி கோப்பகத்தை உருவாக்குதல்

ஒரு (ஒப்பீட்டளவில்) ஒரு பெரிய பிரச்சாரம் கண்ணியமான எண்ணிக்கையிலான பயனர்களைக் கொண்ட பல தொலைதூர அலுவலகங்களைக் கொண்டிருந்தது. அனைத்து அலுவலகங்களும் ஒரு பொதுவான டொமைனுடன் ஒரே நெட்வொர்க்கில் இணைக்கப்பட்டுள்ளன, ஒவ்வொரு அலுவலகமும் செயலில் உள்ள கோப்பகத்தில் (இனி AD என குறிப்பிடப்படுகிறது) ஒரு நிறுவன அலகு (OU) என வரையறுக்கப்பட்டுள்ளது, இதில் பயனர்கள் ஏற்கனவே உருவாக்கப்பட்டுள்ளனர்.

AD இலிருந்து தேவையான பணியாளரின் தொடர்புத் தகவலை விரைவாகவும் சிரமமின்றிப் பெறுவதற்கான வாய்ப்பையும் பயனர்களுக்கு வழங்குவது அவசியமாக இருந்தது, மேலும் முகவரி புத்தகத்தின் பாத்திரத்தை வகிக்கும் உரைக் கோப்பைத் திருத்தும் வழக்கத்திலிருந்து கணினி நிர்வாகிகளுக்கு இலவசம்.

சிக்கலைத் தீர்ப்பதற்கான ஆயத்த பொருத்தமான விருப்பங்கள் எதுவும் இல்லை, எனவே நான் எல்லாவற்றையும் என் கைகளாலும் தலையாலும் செய்ய வேண்டியிருந்தது.

முதலில் நீங்கள் எதைப் பயன்படுத்த வேண்டும் என்பதைத் தீர்மானிக்க வேண்டும் என்ற உண்மையைத் தொடங்குவோம், இது எளிது - இறுதி அடைவு உலாவி வழியாக டொமைனின் அனைத்து பயனர்களுக்கும் கிடைக்க வேண்டும். முதலில் நினைவுக்கு வருவது PHP உடன் ldap உடன் இணைந்து, அவற்றைப் பயன்படுத்துவோம். PHP ஐப் பயன்படுத்துவதன் பெரிய நன்மையை அதன் ஒப்பீட்டளவில் எளிமையாகக் கருதுகிறேன் - எந்த ஒரு சிஸ்டம் அட்மினிஸ்ட்ரேட்டரும் சிறிதளவு புரிந்து கொண்டாலும், அவசியமானால், குறிப்பாக சிரமப்படாமல் குறியீட்டில் தேவையான மாற்றங்களைச் செய்ய முடியும்.

எனவே, ஆரம்பிக்கலாம். முதலில், டொமைனுடன் இணைப்பதற்கான அளவுருக்களை அமைப்போம்:

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

எந்த OU இல் பயனர்களைத் தேடுவோம் என்பதைத் தீர்மானிப்பது அடுத்த புள்ளி. $_GET['இடம்'] இலிருந்து மதிப்புகளை இடைமறிப்பதன் மூலம் இதைச் செய்வோம். எடுத்துக்காட்டாக, பயனர் முகவரிக்குச் சென்றால் server/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 ஐ வரையறுத்திருந்தாலும் இல்லாவிட்டாலும். "ஸ்விட்ச்-கேஸ்" இல் பட்டியலிடப்பட்ட பொருத்தங்கள் இல்லை என்றால், $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

கருத்தைச் சேர்