在AD中搜索用户

时间:2014-08-26 12:34:54

标签: php active-directory ldap ldap-query

在Active Directory中搜索用户的最佳LDAP过滤器是什么? 在我的示例过滤器中,我还排除了没有电子邮件地址的已禁用帐户和帐户。

考虑搜索以下名称:“firname middlename lastname”。 我的代码解析此名称如下:

$name = "firstname middlename lastname";
$nameArray = explode(" ", $name);
$fullName = $name;
$firsName = $nameArray[0];
$lastName = $nameArray[count($nameArray)-1];

如果您只搜索“firstname lastname”或“firstname middlename lastname”,此过滤器效果很好,但如果您搜索“firstname middlename”,则无效:

(&(!(userAccountControl:1.2.840.113556.1.4.803:=2))(mail=*)(givenname=$firstName*)(sn=$lastName*))

此过滤器按预期工作,但速度很慢:

(&(!(userAccountControl:1.2.840.113556.1.4.803:=2))(mail=*)(|(&(givenname=$firstName*)(sn=$lastName*))(displayName=*$fullName*)))

displayName不包含全名,但格式为“lastname firstname middlename”。 在一个完美的世界里,人们会有0或1个中间名,或只有一个姓,但当然他们可以拥有更多。

有关如何制作好(快速)搜索过滤器的任何建议吗?

1 个答案:

答案 0 :(得分:1)

通过LDAP进行Active Directory搜索时,AD会查看您的搜索查询并开始从最左侧的过滤器中选择数据库中的项目。在您的查询中,您首先选择所有未禁用的帐户,然后才能查找您从​​用户那里获得的值。

我的建议是构建搜索查询,以便从您的用户获得最准确的信息,即: 用户输入: Robert ross - >您的查询将以(givenName = $ gn *)开始。

换句话说,第一个条件应该是限制性最强的条件,这意味着将会有更少的符合条件的对象。

此外,您可以将从服务器返回的对象数量限制为小于默认值(通常为1000)的数量,并且仅在用户要求时请求更多结果。此外,AD服务器的排序非常昂贵,因此如果您确实需要排序,请考虑使用PHP进行排序。

有关优化AD搜索操作的详细阅读,请参阅Microsoft专用于此主题的MSDN page