我想提高在类似查询的查询中查找用户的速度:
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路径?
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];
用作用户搜索的基本路径。