【问题标题】:Search for users in AD在 AD 中搜索用户
【发布时间】:2014-08-26 12:34:54
【问题描述】:

在 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 个中间名,或者只有一个姓氏,但当然他们可以有更多。

关于如何制作一个好的(快速)搜索过滤器有什么建议吗?

【问题讨论】:

    标签: php active-directory ldap ldap-query


    【解决方案1】:

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

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

    换句话说,第一个条件应该是最严格的条件,这意味着满足条件的对象会更少。

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

    有关优化 AD 搜索操作的详细信息,请参阅 Microsoft 专门针对此主题的 MSDN page。

    【讨论】:

    • 很棒的信息。按照您的参考,我注意到我的慢查询问题是 (displayName=*$fullName*) 开头的通配符。将其更改为 (anr=$fullName) 就可以了。我还做了一些其他优化并最终得到: (|(&(objectCategory=person)(objectClass=user)(givenname=$firstName*)(sn=$lastName*)(mail=*)(!(userAccountControl:1.2 .840.113556.1.4.803:=2)))(&(objectCategory=person)(objectClass=user)(anr=$fullName)(mail=*)(!(userAccountControl:1.2.840.113556.1.4.803:=2 ))))
    猜你喜欢
    • 2015-12-13
    • 1970-01-01
    • 2021-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多