Группы Active Directory существенно упрощают управление доступом в домене. Вы можете добавлять один группы в другие. Это называется вложенные группы Active Directory. Вложенные группы — это удобный способ управления доступами в AD на основе ролей.
Однако при диагностике проблем, связанных с полномочиями, администраторы могут обнаружить, что источником проблемы являются вложенные группы. Чаще всего проблемы с вложенными группами возникают при диагностике запрещающих правил доступа и групповых политик.
Вы не сможете узнать в каких вложенных группах находится пользователь AD с помощью графической консоли Active Directory Users and Computer (dsa.msc). В этой статье мы покажем, как с помощью PowerShell узнать, в каких вложенных группах состоит пользователь.
На скриншоте ниже видно, что пользователь является членом двух групп AD (кроме стандартной Domain Users): CA_IT_dept and CA_Server_Admins.
Теперь на контроллере домена с помощью утилиты dsget выведем полный состав групп, в которых состоит пользователь с учетом вложенных групп (параметр -expand -memberof):
dsget user "CN=John Brion,OU=Users,OU=MSK,DC=test,DC=com" -expand -memberof
В данном примере пользователь является членом 6 групп.
Если вы используете для получения списка членов групп или пользователей командлеты из модуля AD PowerShell – эти командлеты также не выводят информацию о вложенных группах.
Get-ADUser aivanov -properties memberof | select memberof -expandproperty memberof
С помощью командлета Get-ADGroupMember с параметром –Recursive можно вывести список всех членов группы, включая вложенные.
Но в результатах такой команды будут присутствовать только объекты, не имеющие дочерних объектов. Информация о вложенных группах среди результатов вывода будет отсутствовать.
Чтобы получить информацию о вложенных группах пользователя в PowerShell, вам нужно использовать специальный extensible LDAP фильтр LDAP_MATCHING_RULE_IN_CHAIN (1.2.840.113556.1.4.1941). Данный фильтр используется для выявления вложенных групп, выполняет поиск соответствия по всей цепочки от корня (доступен начиная с Windows Server 2003 SP2).
Выведем все доменные группы, в которых состоит пользователь без фильтра:
Get-ADGroup –LDAPFilter “(member= CN=John Brion,OU=Users,OU=MSK,DC=test,DC=com)”|ft –a
А затем используем правило LDAP_MATCHING_RULE_IN_CHAIN.
Get-ADGroup –LDAPFilter “(member:1.2.840.113556.1.4.1941:= CN=John Brion,OU=Users,OU=MSK,DC=test,DC=com)”|ft –a
Как вы видите, вторая команда отобразила все группы пользователя в домене, включая вложенные.
Аналогичным образом можно определить входит, ли пользователь в какую-то группу. Первая команда покажет только непосредственных членов группы:
Get-ADUser –LDAPFilter “(memberOf=CN=MSK_Users,OU=Groups,OU=MSK, DC=test,DC=com)”|ft -a
Непосредственно в группу никто не добавлен. Теперь попробуем вывести членов этой группы через вложенную группу:
Get-ADUser –LDAPFilter "(memberOf:1.2.840.113556.1.4.1941:=CN=MSK_Users,OU=Groups,OU=MSK,DC=test,DC=com)"|ft -a
Microsoft дает следующие рекомендации по использовании вложенных групп, которые могут упросить управление в AD:
- Не рекомендуется использовать больше одного уровня вложенности групп;
- Одна группа безопасности может быть членом только одной вышестоящей группы;
- Не используйте вложенные группы, если с помощью этих групп реализуются запрещающие права;
- Вложенная глобальная группа безопасности не может обладать привилегиями высшего уровня.