sergey vasin

The IT blog

Primary Group в Active Directory

leave a comment »

Когда мы хотим получить информацию о членстве в группах определенного пользователя или компьютера, мы можем воспользоваться командлетами 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


Реклама

Written by Сергей Васин

Сентябрь 18, 2017 в 11:23

Опубликовано в Active Directory, PowerShell

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s