PrincipalSearcher 不遵循底层 DirectorySearcher 的过滤器
PrincipalSearcher not following underlying DirectorySearcher's Filter
我一直在编写一些代码来使用 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();
以上 returns 正确数量的结果基于 SizeLimit
(10) 并按 PropertyName
正确排序,但它不会使用 Filter
选项。
有什么方法可以设置 PrincipalSearcher
以使用 OR 过滤器(无需查询所有用户和过滤客户端)或使其正确使用 Filter
选项?
我有一个使用 DirectoryEntry
和 DirectorySearcher
的工作方法,但一直在寻找 UserPrincipal
提供的简单性和方法。
看来你不能。
我正在寻找 .NET Core 实现的源代码,但我认为我们可以假设 .NET 4.x 实现是相似的,即使不完全相同。
PrincipalSearcher.FindAll()
calls ADStoreCtx_Query.Query()
, which calls an internal method called PushFilterToNativeSearcher()
,它开始扰乱过滤器,覆盖你可能放在那里的任何东西。
我已经搜索了一些替代方案,但没有什么好的。你最好直接使用 DirectorySearcher
。
AccountManagement
命名空间有时会让事情变得简单,但出于这样的原因,我一直回到 DirectoryServices
。甚至性能 - AccountManagement
在某些情况下可能表现更差。
我一直在编写一些代码来使用 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();
以上 returns 正确数量的结果基于 SizeLimit
(10) 并按 PropertyName
正确排序,但它不会使用 Filter
选项。
有什么方法可以设置 PrincipalSearcher
以使用 OR 过滤器(无需查询所有用户和过滤客户端)或使其正确使用 Filter
选项?
我有一个使用 DirectoryEntry
和 DirectorySearcher
的工作方法,但一直在寻找 UserPrincipal
提供的简单性和方法。
看来你不能。
我正在寻找 .NET Core 实现的源代码,但我认为我们可以假设 .NET 4.x 实现是相似的,即使不完全相同。
PrincipalSearcher.FindAll()
calls ADStoreCtx_Query.Query()
, which calls an internal method called PushFilterToNativeSearcher()
,它开始扰乱过滤器,覆盖你可能放在那里的任何东西。
我已经搜索了一些替代方案,但没有什么好的。你最好直接使用 DirectorySearcher
。
AccountManagement
命名空间有时会让事情变得简单,但出于这样的原因,我一直回到 DirectoryServices
。甚至性能 - AccountManagement
在某些情况下可能表现更差。