java - 如何修复 Java 中的 Ldap 连接错误 "javax.naming.SizeLimitExceededException: [LDAP: error code 4 - Sizelimit Exceeded]"?

标签 java active-directory ldap

AD 共有 7563 名员工。我需要使用 (employeeId=*) 选择它们

以下是我的 Java 代码:

        Hashtable<String, String> ldapEnv = new Hashtable<>();
        ldapEnv.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
        ldapEnv.put(Context.PROVIDER_URL, PROVIDER_URL);
        ldapEnv.put("com.sun.jndi.Ldap.connect.timeout", CONNECTION_TIMEOUT); // specify timeout out to be 5 seconds
        ldapEnv.put(Context.SECURITY_AUTHENTICATION, AUTHENTICATION_TYPE);
        ldapEnv.put(Context.SECURITY_PRINCIPAL, AD_USER);
        ldapEnv.put(Context.SECURITY_CREDENTIALS, AD_PASS);
        DirContext context = new InitialDirContext(ldapEnv); // initial context created
        System.out.println("(employeeID=" + aDemployeeID + ")");
        String searchFilter = "(employeeID=*)";
        SearchControls controls = new SearchControls();
        String[] requiredAttribute = { "mail", "Targetaddress", "UserPrincipalName" };
        controls.setSearchScope(SearchControls.SUBTREE_SCOPE);
        controls.setReturningAttributes(requiredAttribute);
        controls.setCountLimit(1200);

        NamingEnumeration<SearchResult> users1 = context.search(SEARCH_DIRECTORY_1, searchFilter, controls);

        adAttributesToEVRYIntegrator = new HashMap<>();
        int count = 0;
        while (users1.hasMore()) {
            SearchResult sr = users1.next();

            NamingEnumeration<? extends Attribute> aDattributes = sr.getAttributes().getAll();
            count = count + 1;
            while (aDattributes.hasMore()) {
                Attribute requestedAttributesFromAD = aDattributes.next();
                System.out.println(requestedAttributesFromAD.get().toString());
            System.out.println(count);

        }

输出:

 After 1000 Records:
 javax.naming.SizeLimitExceededException: [LDAP: error code 4 - Sizelimit Exceeded]; remaining name 'OU=Users,OU=Sweden,OU=CCD,OU=Customers,DC=corp,DC=corpcommon,DC=com'

我检查了多个文件夹,发现:

  • 默认情况下,LDAP 返回 1000 条记录。

有人可以建议如何从 LDAP 获取所有记录

  • 单程
  • 分批(因为我没有员工 ID,所以如何检查已收到的记录在使用 * 时不会再次出现)

PS:我已经完成了相关帖子中的所有更改,但无法解决问题。

最佳答案

您需要使用PagedResultsControl 。您必须更改 context 的声明,使其成为 LdapContext,并且您可以在 InitialLdapContext< 的构造函数中传递 PagedResultsControl/:

int pageSize = 1000;
LdapContext context = new InitialLdapContext(ldapEnv, new Control[] {
    new PagedResultsControl(pageSize, Control.CRITICAL) });

pageSize 可以是 <= 1000 的任意值。

关于java - 如何修复 Java 中的 Ldap 连接错误 "javax.naming.SizeLimitExceededException: [LDAP: error code 4 - Sizelimit Exceeded]"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58638194/

相关文章:

active-directory - 特定 OU 中子 OU 中所有用户的 LDAP 查询

java - 如何通过 java 打开现有文件,如 .docx、.txt、.pptx?

java - 迁移到 java 17 后有关 "memory mappings per process"和 JVM 崩溃的 GC 警告

java - XML 文件中的根元素未缩进

c# - 获取锁定的 AD 用户列表会引发错误。我使用的搜索词不正确吗?

java - Spring 3、ldap 和查询自动完成文本字段

c# - 使用 ValidateCredentials 重复失败的登录尝试是否会导致用户被锁定?

java反射: getMethods function not showing a method

azure - 将 Azure Web App 上的 Azure Active Directory 与 Meteor 结合使用

Azure Active Directory - 更新用户 - 目标实体集当前不支持该请求