首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PrincipalSearcher不遵循底层DirectorySearcher过滤器

PrincipalSearcher不遵循底层DirectorySearcher过滤器
EN

Stack Overflow用户
提问于 2018-03-18 07:45:32
回答 1查看 769关注 0票数 1

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

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

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

代码语言:javascript
复制
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的工作方法,但我正在寻找UserPrincipal提供的简单性和方法。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-19 13:01:28

看来你不能。

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

PrincipalSearcher.FindAll()调用ADStoreCtx_Query.Query(),它调用一个名为PushFilterToNativeSearcher()的内部方法,该方法开始破坏过滤器,覆盖您可能放在那里的所有内容。

我已经在寻找另一种选择了,但没有什么好的。最好直接使用DirectorySearcher

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49345614

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档