代码之家  ›  专栏  ›  技术社区  ›  TonyP

c active directory services findall()只返回1000个条目[重复]

  •  5
  • TonyP  · 技术社区  · 15 年前

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

    我正在使用ads directory searcher 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 回复  |  直到 15 年前
        1
  •  11
  •   Jon Skeet    15 年前

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

    最大对象数 服务器在搜索中返回。这个 默认值为零,这意味着 使用服务器确定的默认大小 最多1000个条目。

    还有:

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

    从这个基本上看,除非有更改服务器端默认值的方法,否则您将被限制为1000个条目。有可能指定 PageSize 会让你一次取一个特定的号码,用 全部的 大于1000…不确定。

    顺便说一下,看起来你也应该 using 指示 SearchResultCollection :

    using (SearchResultCollection results = ds.FindAll())
    {
        foreach (SearchResult sr in results) 
        {
            ...
        }
    }
    
        2
  •  15
  •   marc_s    15 年前

    有两种方法可以绕过这个限制-请参见 MSDN docs on DirectorySearcher 详情:

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

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

    处理需要1000个以上条目的情况的首选方法肯定是页面搜索-请参阅msdn文档:

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

    推荐文章