PrincipalSearcher不遵循基础DirectorySearcher的过滤器

时间:2018-03-18 07:45:33

标签: c# active-directory userprincipal directorysearcher

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

我遇到的问题是PrincipalSearcher无法进行OR查询,因此如果我想通过电子邮件地址或SamAccountName搜索用户,则无法进行查询。

为了解决这个问题,似乎PrincipalSearcher在后​​台使用了DirectorySearcher,因此您可以访问DirectorySearcher并根据需要进行设置(使用{{1} }}),由于某种原因,它不会遵循我指定的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(); (10)返回正确的结果数量,并按SizeLimit对其进行正确排序,但根本不会使用PropertyName选项

有没有办法设置Filter使用OR过滤器(不查询所有用户和过滤客户端)或让它正确使用PrincipalSearcher选项?

我有一个使用FilterDirectoryEntry的工作方法,但正在寻找DirectorySearcher提供的简单性和方法。

1 个答案:

答案 0 :(得分:1)

似乎你不能。

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

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

我已经做了一些寻找替代方案,但没有什么好处。您最好直接使用DirectorySearcher

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