Когда мы хотим получить информацию о членстве в группах определенного пользователя или компьютера, мы можем воспользоваться командлетами Get-ADPrincipalGroupMembership или Get-ADAccountAuthorizationGroup.
Первый из них выведет информацию обо всех группах, в которые объект входит непосредственно.
Результат выполнения второго командлета будет содержать все группы, в которые объект входит как явно, так и через другие группы. Кроме того, этот командлет выведет информацию обо всех системных группах, SID которых будет присутствовать в токене безопасности пользователя, например Authenticated Users.
Альтернативой использованию вышеупомянутых командлетов будет запрос значений backlink-атрибута MemberOf или атрибута типа constructed msds-MemberOfTransitive.
И опять же, первый из них выведет только те группы, участником которых объект является непосредственно, а второй — все группы, в которые он входит, будь то явным образом, или посредством членства в других группах.
Отличие тут заключается в том, что командлеты Get-ADPrincipalGroupMembership и Get-ADAccountAuthorizationGroup выведут все группы, а запрос значений атрибутов MemberOf и msds-MemberOfTransitive — все, кроме Primary Group, она же Основная группа. По умолчанию основной группой для пользователей является Domain Users, а для компьютеров, соответственно, Domain Computers.
Происходит это потому, что в Active Directory основная группа не указывается ни в атрибуте MemberOf, ни в msds-MemberOfTransitive. Кроме того, упоминания о пользователе или компьютере, для которого определенная группа является основной, вы не найдете и в атрибуте Member этой группы, где в обычном случае указаны все входящие в нее объекты.
Get
Атрибутом объектов пользователей или компьютеров, используемым для указания primary group является primaryGroupID. Его значение — это RID (Relative ID) объекта группы, которая для него является основной.
Relative ID — это последняя группа цифр в SID объекта. Например 500 в строке SID — S-1-5-21-1234567890-1234567890-1234567890-500.
Для пользователей значением primaryGroupID по умолчанию будет 513 (группа Domain Users), для компьютеров — 515 (группа Domain Computers), для контроллеров домена — 516 (группа Domain Controllers).
Запросить RID primary group объекта пользователя мы можем следующим образом:
primaryGroupID = Get-ADUser -Identity ivanov -Properties primaryGroupID | Select-Object -ExpandProperty primaryGroupID
или так:
primaryGroupID = [ADSI]"LDAP://CN=someuser,CN=Users,DC=domain,DC=com" | Select-Object -ExpandProperty primaryGroupID
Для того, чтобы узнать, что это за группа, мы можем выполнить запрос с использованием полного SID. SID домена мы можем узнать так:
$domainSID = Get-ADDomain | Select-Object -ExpandProperty DomainSID | Select-Object -ExpandProperty Value
с использованием ADSI это будет выглядеть следующим образом:
[ADSI]"LDAP://DC=domain,DC=com" | Select-Object -Property objectSID
Однако в этом случае objectSID будет представлен в виде массива байтов, в каком виде он, собственно, и хранится в ActiveDirectory, и для дальнейшего использования нам потребуется преобразовать его в строку. Например, так.
Но вернемся к определению группы. Теперь, зная SID домена мы можем запросить объект нужной нам группы:
Get-ADGroup -Identity $($domainSID + "-" + $primaryGroupID)
или же так:
$adsisearcher = New-Object -TypeName System.DirectoryServices.DirectorySearcher $adsisearcher.Filter = "(objectSID=$($domainSID + '-' + $primaryGroupID))" $adsisearcher.FindAll()
И хотя объект группы содержит атрибут primaryGroupToken, в котором указывается Relative ID этой группы, данный атрибут является constructed-атрибутом и поэтому не может быть использован в качестве условия фильтрации.
Set
Одним из следствий назначения группы в качестве основной для пользователя или компьютера является то, что мы не сможем прекратить его членство в этой группе, пока не укажем в качестве основной какую-либо другую.
Например, если мы решили вывести пользователя из группы Domain Users, сначала нам потребуется обозначить какую-либо иную группу в качестве primary group.
В качестве основной группы могут быть указаны глобальные (Global) или универсальные (Universal) группы безопасности (Security Group). То есть, в качестве primary group мы не сможем указать локальную группу домена (Domain Local), или любую группу распространения (Distribution Group).
После того, как мы выбрали группу, которая и будет новой primary group для объекта, нам нужно узнать ее RID. Для этого мы можем воспользоваться уже упомянутым выше атрибутом primaryGroupToken объекта группы:
$groupRID = Get-ADGroup -Identity newPrimaryGroup -Property primaryGroupToken | Select-Object -ExpandProperty primaryGroupToken
Того же самого результата мы можем добиться при помощи объекта DirectorySearcher:
$adsisearcher = New-Object -TypeName System.DirectoryServices.DirectorySearcher $adsisearcher.SearchRoot = "LDAP://CN=newPrimaryGroup,OU=groups,DC=domain,DC=com" $adsisearcher.PropertiesToLoad.Add("primaryGroupToken") $groupRID = $adsisearcher.FindAll()[0].Properties.primarygrouptoken[0]
Далее, если пользователь еще не является участником этой группы, нам потребуется его добавить:
Add-ADGroupMember -Identity newPrimaryGroup -Members someuser
С использованием ADSI это будет выглядеть следующим образом:
$group = [ADSI]"LDAP://CN=newPrimaryGroup,OU=groups,DC=domain,DC=com" $user = "LDAP://CN=someuser,CN=Users,DC=domain,DC=com" $group.Add($user)
Затем укажем группу newPrimaryGroup в качестве основной для пользователя someuser:
Set-ADUser -Identity someuser -Replace @{primaryGroupID = $groupRID}
Это же действие с использованием ADSI будет выглядеть так:
$user = [ADSI]"LDAP://CN=someuser,CN=Users,DC=domain,DC=com" $user.Put("primaryGroupID", $groupRID) $user.SetInfo()
Теперь мы можем вывести пользователя someuser из группы Domain Users:
Remove-ADGroupMember -Identity "Domain Users" -Members someuser -Confirm:$false
С использованием ADSI это можно сделать следующим образом:
$group = [ADSI]"LDAP://CN=Domain Users,CN=Users,DC=domain,DC=com" $user = "LDAP://CN=someuser,CN=Users,DC=domain,DC=com" $group.Remove($user)
Страницы в социальных сетях:
Twitter: https://twitter.com/vsseth
Facebook: https://fb.com/inpowershell
VKontakte: https://vk.com/inpowershell