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

问题描述 投票:0回答:2

可能重复:
我可以从 Asp.Net 中的 DirectorySearcher 获取超过 1000 条记录吗?

我正在使用 ADS 目录搜索器 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());
        }
c# active-directory
2个回答
15
投票

有两种方法可以解决此限制 - 有关详细信息,请参阅 DirectorySearcher 上的MSDN 文档:

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

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

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

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


12
投票

这是由于服务器端的限制。来自

DirectorySearcher.SizeLimit
文档:

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

和:

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

基本上由此看来,除非有一种方法可以更改服务器端默认值,否则您将被限制为 1000 个条目。指定

PageSize
可能会让您一次获取特定数字,total 大于 1000...不确定。

顺便说一句,看起来你还应该在

using
:
 周围有一个 
SearchResultCollection

指令
using (SearchResultCollection results = ds.FindAll())
{
    foreach (SearchResult sr in results) 
    {
        ...
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.