我能从 DirectorySearcher 获得超过1000条记录吗?

我刚注意到结果的返回列表限制为1000个。我有超过1000个组在我的领域(巨大的领域)。我怎样才能得到超过1000张唱片?我可以从后面的唱片开始吗?我能把它分成多个搜索吗?

以下是我的疑问:

DirectoryEntry dirEnt = new DirectoryEntry("LDAP://dhuba1kwtn004");
string[] loadProps = new string[] { "cn", "samaccountname", "name", "distinguishedname" };
DirectorySearcher srch = new DirectorySearcher(dirEnt, "(objectClass=Group)", loadProps);
var results = srch.FindAll();

我试过设置 尺寸限制 = 2000;,但似乎不起作用。有什么办法吗?

66989 次浏览

您需要将 DirectorySearch.PageSize 设置为非零值才能获得所有结果。

顺便说一下,你也应该释放目录搜索当你完成它

using(var srch = new DirectorySearcher(dirEnt, "(objectClass=Group)", loadProps))
{
srch.PageSize = 1000;
var results = srch.FindAll();
}

API 文档不是很清楚,但本质上是:

  • 在进行分页搜索时,将忽略 SizeLimit,并且在迭代 FindAll 返回的结果时返回所有匹配的结果。结果将一次从服务器检索一个页面。我选择了上面的1000值,但是如果您喜欢,可以使用较小的值。折衷之处在于: 使用较小的 PageSize 将更快地返回每个页面的结果,但是在迭代大量结果时需要更频繁地调用服务器。

  • 默认情况下搜索不分页(PageSize = 0)。在这种情况下,返回直到 SizeLimit 的结果。

正如 Biri 指出的,处理 FindAll 返回的 SearchResultCollection 非常重要,否则可能会出现内存泄漏 正如 DirectorySearcher 的 MSDN 文档的“备注”部分所述

避免这种情况的一种方法是。NET 2.0或更高版本是编写一个自动处理 SearchResultCollection 的包装器方法。这可能类似于下面的内容(或者可能是。净值3.5) :

public IEnumerable<SearchResult> SafeFindAll(DirectorySearcher searcher)
{
using(SearchResultCollection results = searcher.FindAll())
{
foreach (SearchResult result in results)
{
yield return result;
}
} // SearchResultCollection will be disposed here
}

然后,您可以按照以下方式使用它:

using(var srch = new DirectorySearcher(dirEnt, "(objectClass=Group)", loadProps))
{
srch.PageSize = 1000;
var results = SafeFindAll(srch);
}