PrincipalContext:如何仅通过提供 OU 获取完整的 LDAP 上下文路径?

PrincipalContext: How do I get the full LDAP context path from only providing an OU?

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

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 中只有一小部分的 class 检索完整的 LDAP 路径以在 PrincipalContext 构造函数的 context 部分中使用它路径的?

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

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

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

但要回答您的实际问题,

I'd like to constrain the context to a specific container, but I only now a single portion of this container.

如果您真的想完成此过程,则必须执行搜索以找到 OU 并阅读 distinguishedName。您不能使用 PrincipalSearcher 来执行此操作,因为 System.DirectoryServices.AccountManagement 命名空间没有用于 OU 的任何 class。您将不得不直接使用 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 作为用户搜索的基本路径。