active-directory - Ldap 查询仅返回 1000 个用户...是的,我正在使用分页

标签 active-directory

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

目前,当我构建并发送回所有 1054 个用户时,搜索“有时”会起作用,而其他时候它只发送回 1000 个用户。如果它工作一次,它就会一直工作。如果失败一次,就会一直失败。我已经在 using 语句中设置了所有内容以确保对象被销毁,但它似乎仍然不总是尊重 PageSize 属性。默认情况下,如果设置了 PageSize 属性,则搜索器应使用 SizeLimit 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>();
        }

    }

最佳答案

一位 friend 给我回复了以下回复,这对我有帮助,所以我想我会分享它,并希望它可以帮助其他遇到同样问题的人。

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

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

您可以通过网络跟踪来验证这一点,看看是否正在发生这种情况。

那么你如何解决这个问题呢?有几个选择。

  1. 查询 DNS -> 创建返回的主机列表 -> 尝试第一个。如果失败,请尝试下一个。如果您到达列表底部,则失败。如果您这样做,请大声记录每个独立的故障,这样管理员就不会责怪您。

更好的方法是向 AD 管理员询问 ldap 服务器列表,并按照上述方法使用该列表。

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

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

另外 5% 并不重要。 :)

我看到的下一点是您使用的是 LDAP,而不是 LDAP。这很好,但是存在使用“基本”绑定(bind)的风险。通过“基本”绑定(bind),joe hacker 可以使用网络嗅探器窃取您的帐户凭据。有几种可能的解决方法。 1. 还有另一个 DirectoryEntry 构造函数可以让您指定“Secure”作为身份验证方法。 2. 询问您的管理员是否可以使用 LdapS。 (更便携,以防您需要与 Active Directory 之外的 LDAP 服务器通信)

最后一部分是关于页面大小的。一般1000应该没问题。不要使用任何大于 5,000 的值,否则您可能会出现一些烦躁的行为。即,这高于 Windows 2003 下的默认限制,而在 Windows 2008 中,页面大小被硬编码限制为 5,000,除非使用 AD 中名为 dsHeuristics 的相当晦涩的位来覆盖它。 http://support.microsoft.com/kb/2009267

关于active-directory - Ldap 查询仅返回 1000 个用户...是的,我正在使用分页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24252803/

相关文章:

azure - Azure Active Directory (AAD) 用户名​​的最大长度是多少?

java - 使用 Active Directory SSO 从 Microsoft IE 到 Java 服务器时,为什么会收到 GSSException?

Azure:VM 设置后 DNS 更改

azure - 使用 Azure AD 进行身份验证,手动 GET 请求成功,但使用 .net Framework 应用程序失败

authentication - Sonar 3.4 LDAP 身份验证与 Active Directory - NullPointer 异常

c# - 如何获取 guest /管理员的本地组名?

java - 使用Java更改AD密码

.net - 如何在Powershell中安全地验证AD用户(加密凭据)

active-directory - 将 Windows 10 IoT Core 添加到域

vba - 寻找 LDAP URL?