Как исправить ошибку соединения Ldap "javax.naming.SizeLimitExceededException: [LDAP: код ошибки 4 - превышен Sizelimit]" в Java? - PullRequest
0 голосов
/ 31 октября 2019

В нашей эры 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

  • In Single Go
  • В пакетах (так как у меня нет идентификатора сотрудника, поэтому проверка того, что записи уже поступили, больше не происходит при использовании *)

PS: Я сделал все изменения в связанных постах, но не смог решить проблему.

Ответы [ 2 ]

1 голос
/ 01 ноября 2019

Похоже, что вы столкнулись с параметром Microsoft Active Directory MaxPageSize , который управляет максимальным количеством объектов, возвращаемых в одном результате поиска.

Вы не можете изменить MaxPageSize склиент.

Рекомендация от Microsoft состоит в том, чтобы использовать элемент управления Simple Paged Results Control, который будет работать.

Я заметил, что у вас есть:

controls.setCountLimit(1200);

Устанавливает максимальное количество записей, которые будут возвращены в результате на клиенте.

1 голос
/ 31 октября 2019

Вам нужно использовать PagedResultsControl. Вам придется изменить объявление context, чтобы оно было LdapContext, и вы можете передать PagedResultsControl в конструкторе InitialLdapContext:

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

pageSize может быть любым<= 1000. </p>

...