Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我可以从DirectorySearcher获得1000条以上的记录吗?_C#_Asp.net_Active Directory - Fatal编程技术网

C# 我可以从DirectorySearcher获得1000条以上的记录吗?

C# 我可以从DirectorySearcher获得1000条以上的记录吗?,c#,asp.net,active-directory,C#,Asp.net,Active Directory,我刚刚注意到结果的返回列表限制为1000。我有超过1000组在我的领域(巨大的领域)。我怎样才能获得1000多张唱片?我可以从以后的唱片开始吗?我可以把它分成多个搜索吗 我的问题是: DirectoryEntry dirEnt = new DirectoryEntry("LDAP://dhuba1kwtn004"); string[] loadProps = new string[] { "cn", "samaccountname", "name", "distinguishedname" };

我刚刚注意到结果的返回列表限制为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();

我尝试设置srch.SizeLimit=2000,但这似乎不起作用。有什么想法吗?

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

顺便说一句,您还应该在完成DirectorySearcher后处理它

using(var srch = new DirectorySearcher(dirEnt, "(objectClass=Group)", loadProps))
{
    srch.PageSize = 1000;
    var results = srch.FindAll();
}
API文档不是很清楚,但本质上:

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

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

正如Biri指出的,处理FindAll返回的SearchResultCollection非常重要,否则可能会出现内存泄漏

在.NET 2.0或更高版本中帮助避免这种情况的一种方法是编写一个自动处理SearchResultCollection的包装器方法。这可能类似于以下内容(或者可能是.NET 3.5中的扩展方法):


如果foreach中存在提前终止,该怎么办?结果集合是否仍然被释放?@kerem也许这不是对您问题的及时回答,但是使用
会导致调用
Dispose()
,即使出现异常(使用
最终
块[do so])@Joe出于某种原因,我发现“默认情况下搜索没有分页(PageSize=0)。在这种情况下,将返回多达SizeLimit的结果。“当使用具有底层
DirectorySearcher
PrincipalSearcher
时,似乎不正确。它只是正确地枚举结果。可能服务器端或
PrincipalSearcher
以某种方式覆盖了这一点…@GuacoIV-很可能
PrincipalSearcher
正在覆盖默认行为,尤其是因为它没有公开
PageSize
SizeLimit
属性。您可能可以通过检查
PrincipalSearcher.GetUnderlineSearcher
方法返回的
DirectorySearcher
来确认这一点,以查看它是如何配置的。您会在web上找到很多关于这方面的帖子。有些帖子是非常令人困惑,似乎表明无论你做什么,服务器端设置都会毁掉你的一天。在AD 2012以后的版本中,这是使用DirectorySearcher检索任意数量对象的正确答案。我已经尝试了18k结果。srch.PageSize=int.MaxValue。效果不错。
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);
}