PHP + LDAP වෙබ් ලිපින නාමාවලියක් නිර්මාණය කිරීම

(සාපේක්ෂ වශයෙන්) විශාල ප්‍රචාරක ව්‍යාපාරයකට යහපත් පරිශීලකයින් සංඛ්‍යාවක් සහිත බොහෝ දුරස්ථ කාර්යාල තිබීම සිදු විය. සියලුම කාර්යාල පොදු වසමක් සමඟ එක් ජාලයකට සම්බන්ධ කර ඇත, සෑම කාර්යාලයක්ම සක්‍රීය නාමාවලියෙහි (මෙතැන් සිට AD ලෙස හැඳින්වේ) සංවිධාන ඒකකයක් (OU) ලෙස අර්ථ දක්වා ඇත, එහි පරිශීලකයන් දැනටමත් නිර්මාණය කර ඇත.

AD වෙතින් අවශ්‍ය සේවකයාගේ සම්බන්ධතා තොරතුරු ඉක්මනින් හා වෙහෙසකින් තොරව ලබා ගැනීමට පරිශීලකයින්ට අවස්ථාව ලබා දීම අවශ්‍ය වූ අතර ලිපින පොතක කාර්යභාරය ඉටු කරන පෙළ ගොනුවක් සංස්කරණය කිරීමේ පුරුද්දෙන් පද්ධති පරිපාලකයින් නිදහස් කරයි.

ගැටළුව විසඳීම සඳහා සූදානම් කළ සුදුසු විකල්ප නොමැත, එබැවින් මට මගේම දෑතින් සහ හිසෙන් සියල්ල කිරීමට සිදු විය.

මුලින්ම ඔබ භාවිතා කළ යුතු දේ තීරණය කිරීමට අවශ්ය බව අපි පටන් ගනිමු, එය සරලයි - අවසාන නාමාවලිය බ්රවුසරයක් හරහා වසමේ සියලුම පරිශීලකයින්ට ලබා ගත යුතුය. මතකයට එන පළමු දෙය වන්නේ ldap සමඟ ඒකාබද්ධව PHP වන අතර අපි ඒවා භාවිතා කරන්නෙමු. 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

අදහස් එක් කරන්න