Мой синтаксис LDAP неверен в поисковом фильтре - PullRequest
1 голос
/ 20 октября 2011

Это моя первая попытка запросить информацию об AD на нашем сервере LDAP.Когда я пытаюсь выполнить запрос к серверу LDAP, вот что я пытаюсь получить:

Я пытаюсь получить всех активных сотрудников с пределом 500 записей, отображаемое имя которого начинается с «sav», есть электронная почтаaddress и имеет атрибут userAccountControl, равный 512. Проблема, с которой я сталкиваюсь, заключается в том, что я получаю только 8 записей.Я должен был буквально вернуть как минимум 10 записей.

Я провел отдельный поиск по двум записям, которые НЕ были получены в моем поиске, и у каждой был адрес электронной почты и значение userAccountControl 512. Так что яне уверен, почему эти 2 записи отсутствовали.

Я уверен, что что-то не так в моем синтаксисе, но я не могу найти, что это такое.Любая ПОМОЩЬ / НАПРАВЛЕНИЕ будут оценены.Спасибо.

После поиска в Google я определил ФИЛЬТР ПОИСКА как:

String searchFilter = "(&(objectClass=user)(displayname="+displayname+"*"+")(mail=*)(userAccountControl=512))";

Пожалуйста, см. Мой полный метод ниже:

public List<String> getAutocompleteEmpRecordsList(String displayname, LdapContext ctx) {
    List<String> activeEmpAttributes = new ArrayList<String>();
    Attributes attrs = null;
    int count = 0;
    int empEmailAddrLen = 0;
    try {
        SearchControls constraints = new SearchControls();
        constraints.setCountLimit(500);          
        constraints.setSearchScope(SearchControls.SUBTREE_SCOPE);
        String[] attrIDs = {"displayname", "mail", "userAccountControl"};
        constraints.setReturningAttributes(attrIDs);
        String searchFilter = "(&(objectClass=user)(displayname="+displayname+"*"+")(mail=*)(userAccountControl=512))";
        NamingEnumeration answer = ctx.search("OU=Standard,OU=Users,DC=xxx,DC=org", searchFilter, constraints);
        if (answer != null) {
            while (answer.hasMore()) {
                attrs = ((SearchResult) answer.next()).getAttributes();
                if (attrs.get("displayname") != null) {
                    int empNameLen = attrs.get("displayname").toString().length();
                    activeEmpAttributes.add(attrs.get("displayname").toString().substring(13, empNameLen));
                }
                count++;
                ctx.close();
            }
        }
        else {
            throw new Exception("Invalid User");
        }
        System.out.println("activeEmpAttributes: " + activeEmpAttributes);
        System.out.println("count: " + activeEmpAttributes.size());
    } catch (Exception ex) {
        ex.printStackTrace();
    }
    return activeEmpAttributes;
}

Ответы [ 3 ]

0 голосов
/ 21 октября 2011

Можете ли вы опубликовать значения userAccountControl, displayName и mail для двух исключенных пользователей?

FWIW, медиальный поиск на displayName будет выполняться намного быстрее, если вы добавите к нему индекс кортежа.

0 голосов
/ 21 октября 2011

Я загрузил бесплатный инструмент AD, чтобы просмотреть все необходимые мне данные в AD, и он показал мне, что данные не были проблемой, но я просто не нажимал на все нужные мне OU, потому что не было только 1 OU, где все наши пользователи хранятся.

Следовательно, после еще одного поиска в Google я нашел страницу на сайте Oracle, посвященную LDAP, и я изменил свой LDAPContext на DirContext, чтобы мое соединение выполняло поиск в каталоге, а также использовало REFERRAL этого контекста и установило значение «follow» чтобы избежать PartialSearchException.

Я думал, что опубликую свои выводы на случай, если какой-нибудь другой новичок столкнется с той же проблемой.

Если вы видите обратную сторону изменений, которые я сделал, пожалуйста, дайте мне знать. С уважением.

Вот мой исправленный код:

public List<String> getAutocompleteEmpRecordsList(String displayname, DirContext ctx) {
    List<String> activeEmpAttributes = new ArrayList<String>();
    Attributes attrs = null;
    int count = 0;
    int empEmailAddrLen = 0;
    try {
        SearchControls constraints = new SearchControls();
        constraints.setCountLimit(500); 
        constraints.setSearchScope(SearchControls.SUBTREE_SCOPE);
        String[] attrIDs = {"displayname", "mail", "userAccountControl"};
        constraints.setReturningAttributes(attrIDs);
        String searchFilter = "(&(objectClass=user)(displayname="+displayname.trim()+"*"+")(mail=*)(userAccountControl=512))";
        NamingEnumeration answer = ctx.search("DC=xxx,DC=org", searchFilter, constraints);
        if (answer != null) {
            while (answer.hasMore()) {
                attrs = ((SearchResult) answer.next()).getAttributes();
                if (attrs.get("displayname") != null) {
                    int empNameLen = attrs.get("displayname").toString().length();
                    activeEmpAttributes.add(attrs.get("displayname").toString().substring(13, empNameLen));
                }
                count++;
                ctx.close();
            }
        }
        else {
            throw new Exception("Invalid User");
        }
        System.out.println("activeEmpAttributes: " + activeEmpAttributes);
        System.out.println("count: " + activeEmpAttributes.size());
    } catch (Exception ex) {
        ex.printStackTrace();
    }
    return activeEmpAttributes;
}

В любом случае, спасибо.

0 голосов
/ 20 октября 2011

Возможно, вы путаете атрибут displayname и атрибут cn.

На сервере Windows у вас есть инструмент командной строки LDIDIFDE.EXE, который позволяет вам протестировать ваш фильтр.

ldifde -f datas.ldf -d "OU=Standard,OU=THR Users,DC=txhealth,DC=org" -r "(&(objectClass=user)(displayname=sav*)(mail=*)(userAccountControl=512))"
ldifde -f datas.ldf -d "OU=Standard,OU=THR Users,DC=txhealth,DC=org" -r "(&(objectClass=user)(cn=sav*)(mail=*)(userAccountControl=512))"

В MMC «Пользователь и компьютер» вы также можете проверить свой фильтр.

Запустить Active-Directory пользователя и компьютера:

User and computer Active-Directory

Правая кнопкапо зарегистрированному запросу:

New request

Выберите персонализированный поиск, у вас есть вспомогательная вкладка для общих атрибутов:

helper tab for common attributes

ВыВы можете выбрать персонализированную вкладку для технических атрибутов

personalized tab for technical attributes

Вы можете протестировать и скопировать полученный LDAP-фильтр (вам не нужен двойной (& достаточно одного)):

Resulting LDAP filter

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...