C# 我可以从DirectorySearcher获得1000条以上的记录吗?
我刚刚注意到结果的返回列表限制为1000。我有超过1000组在我的领域(巨大的领域)。我怎样才能获得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" };
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的结果
如果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);
}