LDAP 搜索多个服务器和域 (PHP)
LDAP Search Multiple Servers and Domains (PHP)
所以我正在尝试使用 PHP 和 LDAP 按用户名搜索 AD。但是,有多个服务器和多个域。我想出了如何使登录顺利进行的方法,至少就我的测试而言。不过搜索功能有点难。
$Servers = $LDAP['LDAPSrvs'];
$Domains = $LDAP['LDAPDoms'];
$sLoop = 0;
$dLoop = 0;
foreach($Servers as $Server)
{
$sLoop++;
$connect = 'ldap://'.$Server;
$lcon = ldap_connect($connect);
ldap_set_option($lcon, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_set_option($lcon, LDAP_OPT_NETWORK_TIMEOUT, 1);
$bind = ldap_bind($lcon, $LDAP['LDAPUser'], $LDAP['LDAPPass']);
if($bind)
{
$search = ldap_search($lcon, $DN, "(sAMAccountName=$username)");
if($search)
{
$info = ldap_get_entries($lcon, $search);
echo var_export($info);
if(count($info) >= 1)
break;
} else {
new MessageHandler('No users were found.', 'INFO');
}
}
else
{
new MessageHandler('Something went wrong.', 'ERR');
}
}
@ldap_close($lcon);
上面的代码是我用来搜索的。但是,它会造成很大的延迟,甚至在服务器/DN 中出现错误,它也找不到任何具有该用户名的用户。
我对 LDAP 和 PHP 的经验非常有限,所以我真的不知道如何自己解决这个问题。我总是通过尝试和失败来解决问题,所以最终我可能会找到一个可行的 hack。但是,如果有人可以通过向我解释如何完成它来帮助我,将不胜感激!
您可以使用 ldap_count_entries()
从服务器快速返回计数以查看是否找到了某些东西。这可能比首先检索搜索结果并发现其中没有任何内容要快。
所以它可能看起来像这样:
foreach($Servers as $Server) {
$sLoop++;
$connect = 'ldap://'.$Server;
$lcon = ldap_connect($connect);
ldap_set_option($lcon, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_set_option($lcon, LDAP_OPT_NETWORK_TIMEOUT, 1);
ldap_set_option($lcon, LDAP_OPT_REFERRALS, 0);
$bind = ldap_bind($lcon, $LDAP['LDAPUser'], $LDAP['LDAPPass']);
if(! $bind) {
new MessageHandler('Something went wrong.', 'ERR');
continue;
}
$search = ldap_search($lcon, $DN, "(sAMAccountName=$username)");
if (ldap_count_entries($lcon, $search) < 1) {
new MessageHandler('No Users found.', 'ERR');
continue;
}
$info = ldap_get_entries($lcon, $search);
echo var_export($info);
@ldap_close($lcon);
}
我不确定它的速度是否加快了很多。
您还可以在循环中的某处添加类似 echo microtime();
的内容,以查看某些服务器的响应是否比其他服务器慢。
所以我正在尝试使用 PHP 和 LDAP 按用户名搜索 AD。但是,有多个服务器和多个域。我想出了如何使登录顺利进行的方法,至少就我的测试而言。不过搜索功能有点难。
$Servers = $LDAP['LDAPSrvs'];
$Domains = $LDAP['LDAPDoms'];
$sLoop = 0;
$dLoop = 0;
foreach($Servers as $Server)
{
$sLoop++;
$connect = 'ldap://'.$Server;
$lcon = ldap_connect($connect);
ldap_set_option($lcon, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_set_option($lcon, LDAP_OPT_NETWORK_TIMEOUT, 1);
$bind = ldap_bind($lcon, $LDAP['LDAPUser'], $LDAP['LDAPPass']);
if($bind)
{
$search = ldap_search($lcon, $DN, "(sAMAccountName=$username)");
if($search)
{
$info = ldap_get_entries($lcon, $search);
echo var_export($info);
if(count($info) >= 1)
break;
} else {
new MessageHandler('No users were found.', 'INFO');
}
}
else
{
new MessageHandler('Something went wrong.', 'ERR');
}
}
@ldap_close($lcon);
上面的代码是我用来搜索的。但是,它会造成很大的延迟,甚至在服务器/DN 中出现错误,它也找不到任何具有该用户名的用户。
我对 LDAP 和 PHP 的经验非常有限,所以我真的不知道如何自己解决这个问题。我总是通过尝试和失败来解决问题,所以最终我可能会找到一个可行的 hack。但是,如果有人可以通过向我解释如何完成它来帮助我,将不胜感激!
您可以使用 ldap_count_entries()
从服务器快速返回计数以查看是否找到了某些东西。这可能比首先检索搜索结果并发现其中没有任何内容要快。
所以它可能看起来像这样:
foreach($Servers as $Server) {
$sLoop++;
$connect = 'ldap://'.$Server;
$lcon = ldap_connect($connect);
ldap_set_option($lcon, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_set_option($lcon, LDAP_OPT_NETWORK_TIMEOUT, 1);
ldap_set_option($lcon, LDAP_OPT_REFERRALS, 0);
$bind = ldap_bind($lcon, $LDAP['LDAPUser'], $LDAP['LDAPPass']);
if(! $bind) {
new MessageHandler('Something went wrong.', 'ERR');
continue;
}
$search = ldap_search($lcon, $DN, "(sAMAccountName=$username)");
if (ldap_count_entries($lcon, $search) < 1) {
new MessageHandler('No Users found.', 'ERR');
continue;
}
$info = ldap_get_entries($lcon, $search);
echo var_export($info);
@ldap_close($lcon);
}
我不确定它的速度是否加快了很多。
您还可以在循环中的某处添加类似 echo microtime();
的内容,以查看某些服务器的响应是否比其他服务器慢。