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

问题描述 投票:0回答:1

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

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

如何通过使用仅包含路径一部分的context中的类来检索在PrincipalContext构造函数的System.DirectoryServices.AccountManagement部分中使用的完整LDAP路径?

active-directory ldap directoryservices account-management
1个回答
1
投票
您问题的根源是:SamAccountName = $"*{search}*"

特别是开头的*sAMAccountName属性已建立索引,因此通常是非常快速的查询。但是,由于开头有通配符,因此它不能在此搜索中使用索引。这意味着它必须查看您域中的

每个用户才能找到匹配项。

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

但是要回答您的实际问题,

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

如果您确实要执行此操作,则必须执行搜索以找到OU并为其读取distinguishedName。您无法使用PrincipalSearcher完成此操作,因为System.DirectoryServices.AccountManagement命名空间只是没有OU的任何类。您将必须直接使用DirectorySearcher(无论如何,这都是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];
用作用户搜索的基本路径。
© www.soinside.com 2019 - 2024. All rights reserved.