Поиск всех групп пользователя AD по протоколу LDAP

    Мне по роду занятий часто приходится иметь дело с сервисами интегрирующимися с AD. К сожалению в большинстве таких сервисов напрочь отсутствует поддержка такой удобной «фичи» AD как Nested Groups
    Неужели организовать перечисление всех вложенных групп пользователя так сложно?

    На первый взгляд.

    На первый взгляд для решения поставленной задачи как минимум потребуется организовать циклический вызов функций для получения групп, в которые входит группа пользователя и так далее. При таком подходе важно не забыть и обработать возможную ситуацию, когда группа A вложена в группу B, а группа B вложена в группу A.
    А если проверка членства в группе вызывается достаточно часто, то такой подход может потребовать значительных вычислительных ресурсов.

    Но выход есть.

    Существует прекрасная статья Active Directory: LDAP Syntax Filters
    В которой приведён интересный пример LDAP фильтра для получения групп пользователя, включая вложенные:
    (member:1.2.840.113556.1.4.1941:=cn=Jim Smith,ou=West,dc=Domain,dc=com)
    

    Также на MSDN есть статья Search Filter Syntax, описывающая имеющиеся Matching Rules, которые можно использовать в фильтрах LDAP совместно с Active Directory. В этой статье правило LDAP_MATCHING_RULE_IN_CHAIN описано более подробно:
    Это правило применимо только к атрибутам типа distinguishedName. Этот специальный модификатор оператора совпадения позволяет обойти всё дерево вложенных объектов.


    Таким образом задача обработки вложенности групп легко переносится на сервер AD.

    Чем это знание может быть полезно администраторам?

    Некоторые сервисы позволяют администратору при настройке задать LDAP фильтр для поиска групп пользователя — в таком случае администратор без вмешательства в код приложения может менять его поведение в отношении вложенных групп. Достаточно фильтры:
    (member=cn=Jim Smith,ou=West,dc=Domain,dc=com)
    (memberOf=cn=Sales,ou=West,dc=Domain,dc=com)
    

    заменить на
    (member:1.2.840.113556.1.4.1941:=cn=Jim Smith,ou=West,dc=Domain,dc=com)
    (memberOf:1.2.840.113556.1.4.1941:=cn=Sales,ou=West,dc=Domain,dc=com)
    


    Пример использования расширяемых правил сравнения на PowerShell

    Комментарии 6

      +1
      Магические циферки. Неудивительно, что про них часто забывают. Сделали бы какое-нибудь более человекочитаемое представление — было бы намного лучше.
      0
      Но много ли кто вообще знает, что расширяемые правила сравнения в ldap тоже имеют свои OIDы? :)

      Подозреваю, что немного… Хотя LDAP_MATCHING_RULE_BIT_AND упоминается довольно часто (и многие им даже пользуются) например при выборке по флагам в UserAccountControl
        0
        Две статьи по AD за день. Шикарно!!!
          0
          Давно в черновиках лежали — до последнего сомневался стоит ли публиковать, а потом решил: хрен с ней с кармой — не мариновать же её. ;)
          0
          промазал

          Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

          Самое читаемое