LDAP AD - атрибут диапазона, как его использовать?

Я пытаюсь использовать атрибут range.

Для тестирования я использую поиск, который без диапазона возвращает 3 записи, и я устанавливаю диапазон 0-1, который должен возвращать только первый 2. Однако я получаю все 3 результата.

Вот как я это делаю:

String rangeStr = attribute + ";range=0-1";
String returnedAttrs[] = {rangeStr, attribute};
_searchControls.setReturningAttributes(returnedAttrs);
_searchControls.setSearchScope(scope);
NamingEnumeration<SearchResult> answer = _context.search(name, filter, _searchControls);
List<String> result = new LinkedList<String>();
while (answer != null && answer.hasMoreElements())
{
    Attribute currentAttr = answer.next().getAttributes().get(attribute);
    if (currentAttr == null)
        continue;
    for (int i=0; i<currentAttr.size(); i++)
    {
        String val = currentAttr.get(i).toString();
        result.add(val);
    }
}

Что я делаю не так?

Я использую размер страницы 1000, но если я правильно понимаю, это не должно влиять на ранжированный поиск (учитывая, что размер страницы больше запрашиваемого диапазона). Это верно?

ldap,

3

Ответов: 1


#!/usr/bin/env python

import ldap

def msad_flatten_ranges(conn, dn, ldap_dict):
  for attrname in ldap_dict:
    if ';range=' in attrname:
      #
      # parse range attr
      #
      actual_attrname, range_stmt = attrname.split(';')
      bound_lower, bound_upper = [
        int(x) for x in range_stmt.split('=')[1].split('-')
      ]

      step = bound_upper - bound_lower + 1
      while True:
        attr_next = '%s;range=%d-%d' % (
          actual_attrname, bound_lower, bound_upper
        )

        dn, attrs = conn.search_s(
          dn, ldap.SCOPE_BASE, attrlist = [attr_next])[0]

        assert len(attrs) == 1

        ret_attrname = attrs.keys()[0]

        ldap_dict[actual_attrname].extend(attrs[ret_attrname])
        if ret_attrname.endswith('-*'):
          break

        bound_lower = bound_upper + 1
        bound_upper += step
LDAP,