А АWednesday, 19 June 2024

Вложенные группы в Active Directory.

Всем привет.

Группы Active Directory используются для множества разных целей, будь то фильтрация групповой политики или назначение определенных привилегий пользователям. Достаточно гибкая структура позволяет разграничивать объекты пользователей и компьютеров наиболее удобным для нас образом.

Но в то же время это приводит к образованию иерархии групп, состоящей из нескольких уровней, тем самым затрудняя определение, в какие же именно группы входит определенный пользователь. Для поиска подобной информации мы можем использовать командлеты модуля Active Directory.

Например поиск по объектам пользователей.

Исходя из 

$SamAccName = 'Morozov-МB'

и

$Name = 'Морозов Марк Васильевич'

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

Get-ADPrincipalGroupMembership -Identity $SamAccName

Если же нам понадобится узнать все группы, в которые он входит посредством вложенных групп, мы можем воспользоваться командлетом Get-ADAccountAuthorizationGroup:

Get-ADAccountAuthorizationGroup -Identity $SamAccName | Where-Object objectClass

В данном случае среди результатов будут присутствовать не только созданные вами группы, в которые явно или неявно входит определенный пользователь, но и системные группы, такие, например, как Authenticated Users и This Organization. По сути, командлет Get-ADAccountAuthorizationGroup выводит все группы, SID которых будет присутствовать в токене безопасности данного пользователя. Если же нас интересуют только действительно существующие группы, то есть те, членством в которых мы можем управлять явным образом, мы можем отфильтровать результаты по существованию значения атрибута objectClass, поскольку у групп, не присутствующих в Active Directory в виде объектов, оно будет отсутствовать:

Get-ADAccountAuthorizationGroup -Identity $SamAccName | Where-Object objectClass

Точно так же, как и в случае с группами, мы можем обратиться к атрибутам объекта пользователя, чтобы получить информацию о том, членом каких групп он является.

Для получения групп, в которые пользователь входит явным образом, мы можем запросить значение атрибута MemberOf. Это backlink-атрибут, то есть он не присутствует в ActiveDirectory явно, а является отражением значений других атрибутов - в данном случае атрибута Member.

$a = Get-ADUser -Identity $SamAccName -Properties MemberOf | Select-Object -ExpandProperty MemberOf

На что тут стоит обратить внимание, так это на то, что среди вывода будет отсутствовать одна группа — та, что значится как Primary Group. Обычно это Domain Users для пользователей и Domain Computers для компьютеров. Текущая primary group объекта определяется значением атрибута primaryGroupID.

Также значение атрибута MemberOf мы можем получить следующими способами:

1) [ADSI]"LDAP://CN=$Name,OU=Bank Users,dc=forza,dc=com" | Select-Object -ExpandProperty MemberOf

2) ([ADSISEARCHER]"samaccountname=$SamAccName").Findone().Properties.memberof 

3) $a = [adsisearcher]""

$a.Filter = "samaccountname=$SamAccName"

$a.Findone().Properties.memberof


Так можем получить список всех членов группы, как непосредственных, так и входящих во вложенные группы, обратившись к атрибуту типа constructed - msds-MemberTransitive.

Тут использовать для этого командлет Get-ADGroup не получится, тут нужен командлет Get-ADObject, для получения  value атрибута типа constructed - msds-MemberOfTransitive.

Результат запроса будет содержать все входящие в группы объекты - как пользователей и компьютеров, так и других групп.

$a = Get-ADObject -Identity "CN=$Name,OU=Bank Users,dc=forza,dc=com" -Properties msds-MemberOfTransitive | Select-Object -ExpandProperty msds-MemberOfTransitive


Еще одним способом будет использование объекта DirectorySearcher:

$adsisearcher = New-Object -TypeName System.DirectoryServices.DirectorySearcher

$adsisearcher.SearchRoot = "LDAP://CN=$Name,OU=Bank Users,dc=forza,dc=com"

$adsisearcher.SearchScope = "Base"

$adsisearcher.PropertiesToLoad.Add("msds-MemberOfTransitive")

$result = $adsisearcher.FindAll()

$result[0].Properties.'msds-memberoftransitive'

($result[0].Properties.'msds-memberoftransitive').count

Удачи.

No comments:

Post a Comment

А что вы думаете по этому поводу?

Версия на печать

Популярное