Ldap查询只返回1000个用户...是的我正在使用分页

时间:2014-06-16 21:49:17

标签: active-directory

我有一个简单的GetStaff函数,它应该从活动目录中检索所有用户。我们有超过1000个用户,因此目录搜索器正在使用分页,因为AD MaxPageSize的默认值为1000.

目前,当我构建并发送回所有1054个用户时,搜索“有时”工作,有时它只返回1000.如果它工作一次,它会一直工作。如果失败一次,它会一直失败。我已经在using语句中设置了所有内容以确保对象被销毁,但它似乎并不总是尊重PageSize属性。默认情况下,如果设置了PageSize属性,则搜索者应使用SizeLimit 0.我尝试将大小限制设置为0,将其设置为0,并将其设置为100000,并且不稳定的结果是相同的。我也尝试将PageSize降低到250并获得相同的不稳定结果。目前我正在尝试更改服务器上的ldap策略以使MaxPageSize为10000,并且我仍然接收1000个用户,搜索PageSize也为10000。不确定我在这里缺少什么,但任何帮助或方向都将不胜感激。

    public IEnumerable<StaffInfo> GetStaff(string userId)
    {
        try
        {
            var userList = new List<StaffInfo>();

            using (var directoryEntry = new DirectoryEntry("LDAP://" + _adPath + _adContainer, _quarcAdminUserName, _quarcAdminPassword))
            {
                using (var de = new DirectorySearcher(directoryEntry)
                {
                    Filter = GetDirectorySearcherFilter(LdapFilterOptions.AllUsers),
                    PageSize = 1000,
                    SizeLimit = 0
                })
                {

                    foreach (SearchResult sr in de.FindAll())
                    {
                        try
                        {
                            var userObj = sr.GetDirectoryEntry();
                            var staffInfo = new StaffInfo(userObj);

                            userList.Add(staffInfo);
                        }
                        catch (Exception ex)
                        {
                            Log.Error("AD Search result loop Error", ex);
                        }
                    }
                }
            }

            return userList;
        }
        catch (Exception ex)
        {
            Log.Error("AD get staff try Error", ex);
            return Enumerable.Empty<StaffInfo>();
        }

    }

2 个答案:

答案 0 :(得分:1)

一位朋友带着帮助我的下面回复回复了我,所以我想我会分享它并希望它可以帮助其他人解决同样的问题。

我首先想到的是“您使用的是域名,例如foo.com作为_adpath吗?”

如果是这样,那我就有了一个很好的主意。对Foo.com的dns查询将返回域中最多25个DC的随机列表。如果该随机列表中的第一个DC没有响应或防火墙,并且您从DNS获得该DC,那么您将体验到您描述的行为。由于DNS是在本地计算机上缓存的,因此您会看到它在某一天发生,然后在下一次运行时不会发生。这是令人愤怒的行为。 :/

您可以使用网络跟踪对此进行验证,以确定是否发生这种情况。

那么你如何解决它呢?几个选项。

  1. 查询DNS - &gt;创建一个返回的主机列表 - &gt;试试第一个。如果失败,请尝试下一个。如果您点击列表的底部,则失败。如果您这样做,请大声记录每个独立的故障,以便管理员不要责怪您。
  2. 更好的方法是向AD管理员询问ldap服务器列表,并将其与上述方法一起使用。

    80%的管理员会告诉您使用域名。这很好,因为部署新域将“正常工作”而无需重新配置。

    15%的管理员希望指定几个最接近应用程序的DC。这对性能有好处,但如果他们在他们升级域时忘记了这个应用程序,那就太糟糕了。

    其他5%并不重要。 :)

    我看到的下一点是您使用的是LDAP,而不是LDAP。这没关系,但你有可能会使用“基本”绑定。通过“基本”绑定,joe hacker可以使用网络嗅探器窃取您的帐户凭据。有几种可能的解决方法。  1.还有另一个DirectoryEntry构造函数,可以将“安全”指定为auth方法。 2.询问您的管理员是否可以使用LdapS。 (如果您需要与Active Directory以外的LDAP服务器通信,则更具可移植性)

    最后一部分是关于页面大小。 1000普遍应该是好的。不要使用任何值&gt; 5,000或者你可以期待一些烦躁的行为。即,这高于Windows 2003下的默认限制,而在Windows 2008中,页面大小被硬编码限制为5,000,除非使用AD中名为dsHeuristics的相当模糊的位覆盖页面大小。 http://support.microsoft.com/kb/2009267

答案 1 :(得分:0)

默认情况下,LDAP配置为最多只返回1000.您可以在请求的域中更改此设置。