我一直在研究使用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
选项?
我有一个使用Filter
和DirectoryEntry
的工作方法,但正在寻找DirectorySearcher
提供的简单性和方法。
答案 0 :(得分:1)
似乎你不能。
我正在查看.NET Core实现的源代码,但我认为我们可以假设.NET 4.x实现类似,如果不完全相同。
PrincipalSearcher.FindAll()
调用ADStoreCtx_Query.Query()
,它调用一个名为PushFilterToNativeSearcher()
的内部方法,它开始搞乱过滤器,覆盖你可能放在那里的任何东西。
我已经做了一些寻找替代方案,但没有什么好处。您最好直接使用DirectorySearcher
。
AccountManagement
命名空间有时会让事情变得简单,但出于这样的原因,我一直回到DirectoryServices
。即使是性能 - AccountManagement
在某些情况下也会表现得更糟。