我一直在编写一些代码来使用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();上面的结果基于SizeLimit (10)返回正确的结果数量,并按照PropertyName正确排序,但是它根本不会使用Filter选项。
有没有任何方法来设置一个PrincipalSearcher来使用OR过滤器(不需要查询所有用户和过滤客户端),或者让它正确地使用Filter选项?
我有一个使用DirectoryEntry和DirectorySearcher的工作方法,但我正在寻找UserPrincipal提供的简单性和方法。
发布于 2018-03-19 13:01:28
看来你不能。
我正在寻找.NET核心实现的源代码,但我认为我们可以假设.NET 4.x实现是相似的,如果不是完全相同的话。
PrincipalSearcher.FindAll()调用ADStoreCtx_Query.Query(),它调用一个名为PushFilterToNativeSearcher()的内部方法,该方法开始破坏过滤器,覆盖您可能放在那里的所有内容。
我已经在寻找另一种选择了,但没有什么好的。最好直接使用DirectorySearcher。
AccountManagement名称空间有时会使事情变得简单,但出于这样的原因,我一直回到DirectoryServices。在某些情况下,即使性能- AccountManagement也可能执行得更糟糕。
https://stackoverflow.com/questions/49345614
复制相似问题