PrincipalSearcher 不遵循底层 DirectorySearcher 的过滤器

PrincipalSearcher not following underlying DirectorySearcher's Filter

我一直在编写一些代码来使用 C# 和 System.DirectoryServices.AccountManagement 命名空间搜索 Active Directory。

我遇到的问题是 PrincipalSearcher 无法执行 OR 查询,因此如果我想通过他们的电子邮件地址或 SamAccountName 搜索用户,这是不可能的。

为了解决这个问题,PrincipalSearcher 似乎在后台使用 DirectorySearcher,因此您可以访问 DirectorySearcher 并根据需要进行设置(使用 GetUnderlyingSearcher), 由于某种原因,它不会遵循我指定的 DirectorySearcher 过滤器。

PrincipalContext ctx = new PrincipalContext(ContextType.Domain, "localhost");
UserPrincipal usrPrinc = new UserPrincipal(ctx);

PrincipalSearcher searchPrinc = new PrincipalSearcher { QueryFilter = usrPrinc };
DirectorySearcher searchdirectory = searchPrinc.GetUnderlyingSearcher() as DirectorySearcher;

searchdirectory.Filter = "(&(objectClass=user)(objectcategory=person)(|(name=*admin*)(samaccountname=*admin*)))";
searchdirectory.Sort.PropertyName = "name";
searchdirectory.SizeLimit = 10;

var results = searchPrinc.FindAll();

以上 returns 正确数量的结果基于 SizeLimit (10) 并按 PropertyName 正确排序,但它不会使用 Filter 选项。

有什么方法可以设置 PrincipalSearcher 以使用 OR 过滤器(无需查询所有用户和过滤客户端)或使其正确使用 Filter 选项?

我有一个使用 DirectoryEntryDirectorySearcher 的工作方法,但一直在寻找 UserPrincipal 提供的简单性和方法。

看来你不能。

我正在寻找 .NET Core 实现的源代码,但我认为我们可以假设 .NET 4.x 实现是相似的,即使不完全相同。

PrincipalSearcher.FindAll() calls ADStoreCtx_Query.Query(), which calls an internal method called PushFilterToNativeSearcher(),它开始扰乱过滤器,覆盖你可能放在那里的任何东西。

我已经搜索了一些替代方案,但没有什么好的。你最好直接使用 DirectorySearcher

AccountManagement 命名空间有时会让事情变得简单,但出于这样的原因,我一直回到 DirectoryServices。甚至性能 - AccountManagement 在某些情况下可能表现更差。