1

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

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

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

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();

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

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

我有一种工作方法DirectoryEntryDirectorySearcher但正在寻找 aUserPrincipal提供的简单性和方法。

4

1 回答 1

3

看来你不能。

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

PrincipalSearcher.FindAll()calls ADStoreCtx_Query.Query(),它调用一个名为 的内部方法PushFilterToNativeSearcher(),它开始弄乱过滤器,覆盖你可能放在那里的任何东西。

我已经做了一些寻找替代品的工作,但没有什么好的。你最好DirectorySearcher直接使用。

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

于 2018-03-19T13:01:28.247 回答