gpt4 book ai didi

c# - Active Directory 搜索的有效分页

转载 作者:IT王子 更新时间:2023-10-29 04:39:33 26 4
gpt4 key购买 nike

在 .NET 中使用 Active Directory 搜索进行分页的有效方法是什么?有很多方法可以在 AD 中搜索,但到目前为止我找不到如何有效地进行搜索。我希望能够指示 SkipTake 参数,并能够在结果中检索符合我的搜索条件的记录总数。

我尝试使用 PrincipalSearcher 进行搜索类:

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.DirectoryEntrySystem.DirectoryServices.Protocols.SearchRequest但我唯一能做的就是指定页面大小。

那么在客户端获取所有结果并在那里进行跳过和计数的唯一方法是什么?我真的希望有更有效的方法可以直接在域 Controller 上实现这一点。

最佳答案

您可以尝试虚拟 ListView 搜索。下面按照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 的文档非常有限。您可能需要对其行为进行一些实验。

关于c# - Active Directory 搜索的有效分页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21628009/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com