在 .NET 中使用 Active Directory 搜索进行分页的有效方法是什么?在 AD 中进行搜索的方法有很多,但到目前为止我找不到如何有效地进行搜索。我希望能够表明Skip
and Take
参数并能够检索结果中与我的搜索条件匹配的记录总数。
我试过用PrincipalSearcher http://msdn.microsoft.com/en-us/library/system.directoryservices.accountmanagement.principalsearcher%28v=vs.110%29.aspx class:
using (var ctx = new PrincipalContext(ContextType.Domain, "FABRIKAM", "DC=fabrikam,DC=com"))
using (var criteria = new UserPrincipal(ctx))
{
criteria.SamAccountName = "*foo*";
using (var searcher = new PrincipalSearcher(criteria))
{
((DirectorySearcher)searcher.GetUnderlyingSearcher()).SizeLimit = 3;
var results = searcher.FindAll();
foreach (var found in results)
{
Console.WriteLine(found.Name);
}
}
}
在这里,我能够将搜索结果限制为 3 个,但我无法获得与我的搜索条件相对应的记录总数(SamAccountName
包含foo
)例如,我也无法指示搜索者跳过前 50 条记录。
我也尝试使用System.DirectoryServices.DirectoryEntry http://msdn.microsoft.com/en-us/library/system.directoryservices.directoryentry%28v=vs.110%29.aspx and System.DirectoryServices.Protocols.SearchRequest http://msdn.microsoft.com/en-us/library/system.directoryservices.protocols.searchrequest%28v=vs.110%29.aspx但我唯一能做的就是指定页面大小。
那么,这是在客户端获取所有结果并在那里执行“跳过”和“计数”的唯一方法吗?我真的希望有更有效的方法可以直接在域控制器上实现这一点。
您可以尝试虚拟列表视图搜索。下面按照cn对用户进行排序,然后从第100个开始得到51个用户。
DirectoryEntry rootEntry = new DirectoryEntry("LDAP://domain.com/dc=domain,dc=com", "user", "pwd");
DirectorySearcher searcher = new DirectorySearcher(rootEntry);
searcher.SearchScope = SearchScope.Subtree;
searcher.Filter = "(&(objectCategory=person)(objectClass=user))";
searcher.Sort = new SortOption("cn", SortDirection.Ascending);
searcher.VirtualListView = new DirectoryVirtualListView(0, 50, 100);
foreach (SearchResult result in searcher.FindAll())
{
Console.WriteLine(result.Path);
}
对于您的用例,您只需要 DirectoryVirtualListView 的 BeforeCount、AfterCount 和 Offset 属性(DirectoryVirtualListView ctor 中的 3 个)。 DirectoryVirtualListView 的文档非常有限。您可能需要对其行为进行一些实验。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)