【问题标题】:PrincipalContext: How do I get the full LDAP context path from only providing an OU?PrincipalContext:如何仅通过提供 OU 来获取完整的 LDAP 上下文路径?
【发布时间】:2019-11-20 15:21:01
【问题描述】:

我想提高在类似这样的查询中查找用户的速度:

using (PrincipalContext pc = PrincipalContext(ContextType.Domain))
using (UserPrincipal up = new UserPrincipal(pc) { SamAccountName = $"*{search}*" })
using (PrincipalSearcher ps = PrincipalSearcher(up))
{
  ...
}

目前,查询搜索整个目录,需要很长时间。

我想将上下文限制在一个特定的容器中,但是我现在只是这个容器的一个部分。

因此,例如,从这样的完整 LDAP 路径:OU=a,OU=b,OU=c,dc=d,dc=e,dc=loc 我只有 OU=b

如何通过使用来自 System.DirectoryServices.AccountManagement 的类中只有一小部分路径来检索完整的 LDAP 路径,以便在 PrincipalContext 构造函数的 context 部分中使用它?

【问题讨论】:

    标签: active-directory ldap directoryservices account-management


    【解决方案1】:

    问题的根源是:SamAccountName = $"*{search}*"

    特别是开头的*sAMAccountName 属性已编入索引,因此它通常是一个非常快速的查询。但由于您在开头有一个通配符,它​​不能在此搜索中使用索引。这意味着它必须查看您域中的每个用户 来尝试找到匹配项。

    如果您可以将其更改为 $"{search}*",您的问题就会消失。

    但要回答您的实际问题,

    我想将上下文限制到一个特定的容器,但我现在只是这个容器的一个部分。

    如果您真的想完成此操作,则必须执行搜索以找到 OU 并阅读distinguishedNamePrincipalSearcher 无法做到这一点,因为 System.DirectoryServices.AccountManagement 命名空间没有任何用于 OU 的类。您将不得不直接使用DirectorySearcher(无论如何,这就是PrincipalSearcher 在后台使用的)。它看起来像这样:

    var ouName = "b";
    var search = new DirectorySearcher(new DirectoryEntry()) {
        Filter = $"(&(objectClass=organizationalUnit)(name={ouName}))"
    };
    search.PropertiesToLoad.Add("distinguishedName");
    var ou = search.FindOne();
    var ouDn = ou.Properties["distinguishedName"][0];
    

    然后您可以使用ouDn 作为用户搜索的基本路径。

    【讨论】:

    • 感谢您提供这么棒的信息! ...我理解,我使用的查询很慢,但这就是客户要求的。这就是为什么我正在寻找一种在保持功能的同时加快速度的方法。
    猜你喜欢
    • 1970-01-01
    • 2014-06-08
    • 2015-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-16
    • 2013-04-27
    • 1970-01-01
    相关资源
    最近更新 更多