Get-PrimaryGroup

По мотивам темы в форуме, и просто чтобы не забыть 🙂

Скрипт получает Primary Group пользователя. В отличии от остальных групп, primary содержится не в атрибуте пользователя MemberOf, а в PrimaryGroupId. Более того, в отличии от MemberOf в котором указываются DN групп, в PrimaryGroupID указывается лишь номер группы. Узнать какая группа соответствует какому номеру можно из свойства группы PrimaryGroupToken. В итоге с использованием AD Cmdlets получается вот такая конструкция:

Function Get-PrimaryGroup ($User)
{
    $groups = @{}
    Get-QADGroup -IncludedProperties PrimaryGroupToken | foreach {$groups[$_.PrimaryGroupToken]=$_.name}
    
    Get-QADUser $User -IncludedProperties PrimaryGroupId | 
    foreach {
        $_ | Add-Member -Type "NoteProperty" -Name "PrimaryGroup" -Value ($groups[$_.primaryGroupId]) -PassThru 
    }
}

На выходе из функции будут объекты пользователей полученные с помощью Get-QADUser, но с добавленным свойством — PrimaryGroup:

[PS <40> C:\Root] Get-PrimaryGroup -User Иванов| Format-List name, prim*

Name           : Иванов Иван
PrimaryGroup   : Domain Users
PrimaryGroupId : 513


[PS <42> C:\Root] Get-PrimaryGroup -User Ив* | Format-Table name, logonname, prim*

Name             LogonName   PrimaryGroup PrimaryGroupId
----             ---------   ------------ --------------
Иванов Иван      Ivanov      Domain Users            513
Иванищенко Фёдор Ivanichenko Domain Users            513

Разумеется при большом количестве групп имеет смысл не получать таблицу соответствий PrimaryGroupToken каждый раз, а закешировать её, или применять запрос LDAP для того чтобы отбор нужной группы выполнялся уже с помощью ресурсов Active Directory.