Группы 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
А что вы думаете по этому поводу?