c #Active Directory服务findAll()仅返回1000个条目

时间:2010-08-15 17:17:00

标签: c# active-directory

  

可能重复:
  Can I get more than 1000 records from a DirectorySearcher in Asp.Net?

我正在使用ADS Directory搜索器findAll()方法搜索现有登录(如下面的代码所示)。似乎findall方法只返回1000个条目,尽管有更多的条目。 我如何找到每次登录的所有()?

    IList<string> adslist = new List<string>();
    using (DirectoryEntry de = new DirectoryEntry("LDAP://armlink.com", null, null, AuthenticationTypes.Secure))
    using (DirectorySearcher ds = new DirectorySearcher(de, "(objectclass=user)", new string[] { "samaccountname" }))

        foreach (SearchResult sr in ds.FindAll())
        {
            string[] e = sr.Path.Split(new string[] { "LDAP://", "OU=", ",", "DC=", ".com", "/CN=" }, StringSplitOptions.RemoveEmptyEntries);
            ResultPropertyCollection pc = sr.Properties;
            adslist.Add(e[0] + "/" + pc["samaccountname"][0].ToString());
            //   Debug.WriteLine(adslist.Last());
        }

2 个答案:

答案 0 :(得分:15)

有两种解决此限制的方法 - 有关详细信息,请参阅MSDN docs on DirectorySearcher

  • DirectorySearcher.SizeLimit属性设置为您需要的某个值 - 这将在单个搜索中返回给定数量的条目;但是,您不能在单个操作中获得超过服务器限制(默认值:1'000个条目) - 但是,该服务器限制是可配置选项 - 您可以将其设置得更高,然后将目录搜索者的大小限制设置得更高 - 但是您希望一次返回的条目越多,您的通话时间就越长!

  • DirectorySearcher.PageSize设置为某个值,例如250左右,进行“分页搜索”,例如您在一次操作中返回250个条目,如果您迭代到第251个条目,则目录搜索器返回(在第二次,第三次,第四次调用中)以获得另外250个条目。这通常是更好的选择,因为您可以快速返回该数量的条目,但您可以根据需要继续搜索更多条目

处理需要超过1000个条目的情况的首选方法绝对是分页搜索 - 请参阅MSDN文档:

  

服务器找到号码后   由...指定的对象   PageSize属性,它会停止   搜索并返回结果   客户端。当客户请求时   更多数据,服务器将重启   搜索它停止的地方。

答案 1 :(得分:11)

这是由服务器端限制造成的。来自DirectorySearcher.SizeLimit文档:

  

最大对象数量   服务器在搜索中返回。该   默认值为零,表示为   使用服务器确定的默认大小   限制1000个条目。

  

如果将SizeLimit设置为大于服务器确定的默认值1000的值   条目,使用服务器确定的默认值。

基本上,除非有一种更改服务器端默认值的方法,否则您将被限制为1000个条目。指定PageSize可能会让您一次获取一个特定数字,总计大于1000 ...不确定。

顺便说一句,看起来你应该在using附近有SearchResultCollection指令:

using (SearchResultCollection results = ds.FindAll())
{
    foreach (SearchResult sr in results) 
    {
        ...
    }
}