如何在Java中修复Ldap连接错误“ javax.naming.SizeLimitExceededException:[LDAP:错误代码4-超出大小限制]”?

时间:2019-10-31 06:54:18

标签: 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获取所有记录

  • 在单行中
  • 成批分发(由于我没有员工编号,因此使用*时不会再检查如何检查记录)

PS:我已经对相关帖子进行了所有更改,但无法解决问题。

2 个答案:

答案 0 :(得分:1)

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

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

pageSize可以是任何<= 1000。

答案 1 :(得分:1)

您似乎遇到了Microsoft Active Directory MaxPageSize设置,该设置控制单个搜索结果中返回的最大对象数。

您不能从客户端更改MaxPageSize。

Microsoft的建议是使用可以使用的简单页面结果控件。

我确实注意到您有

  

controls.setCountLimit(1200);

设置客户机上作为结果返回的最大条目数。