Получение информации от Get-ADPrincipalGroupMembership не работает, как я надеялся

#arrays #powershell #active-directory #hashtable #group-membership

Вопрос:

У меня есть список пользователей, и мне нужно знать, каково их членство в группах Active Directory. Мне нужно, чтобы они объединились в csv-файл примерно такого типа с именем пользователя, именем группы и типом группы (безопасность распространения), но мне не очень везет. Ниже приведен сценарий Powershell, который я пытался создать и использовать.

 $Users = Get-Content -Path 'C:ScriptsListsUserDistro.txt'

Foreach ($user in $users) {

$GroupName = Get-ADPrincipalGroupMembership $user | Select-Object -Property Name
$GroupType = Get-ADPrincipalGroupMembership $user | Select-Object -Property GroupCategory

$Results = @{'Username'=$User;'Group'=$GroupType}

$obj = New-Object -TypeName PSObject -Property $Results
Write-Output $Obj | Format-table -AutoSize

 

Результат, который я получаю, выглядит так:

 Username Group                                                                                         GroupType                                                                              
-------- -----                                                                                         ---------                                                                              
psmith  {@{Name=Domain Users}, @{Name=Group1}, @{Name=Group2}, @{Name=Group3:}...} {@{GroupCategory=Security}, @{GroupCategory=Security}, @{GroupCategory=Security}, @{...

 

Проблемы, с которыми я сталкиваюсь, заключаются в следующем

  • Список усечен, групп должно быть больше, чем показано здесь
  • Мне не нужна вся эта периферийная информация @{Имя= Только название группы
  • Как я могу отсортировать это так, чтобы имя группы и тип группы совпадали?

Ответ №1:

Мне это не нравится Get-ADPrincipalGroupMembership , так что это то, что я лично использовал бы:

 $Users = Get-Content -Path 'C:ScriptsListsUserDistro.txt'

$result = foreach($user in $users)
{
    $adUsr = Get-ADUser $user
    $membership = Get-ADGroup -LDAPFilter "(member=$($user.DistinguishedName))"
    
    foreach($group in $membership)
    {
        [pscustomobject]@{
            User = $adUsr.samAccountName
            GroupName = $group.Name
            GroupType = $group.GroupCategory
        }
    }
}

$result | Format-Table -AutoSize
 

Использование Get-ADPrincipalGroupMembership будет выглядеть примерно так:

 $Users = Get-Content -Path 'C:ScriptsListsUserDistro.txt'

$result = foreach($user in $users)
{
    $membership = Get-ADPrincipalGroupMembership $user
    
    foreach($group in $membership)
    {
        [pscustomobject]@{
            User = $user
            GroupName = $group.Name
            GroupType = $group.GroupCategory
        }
    }
}

$result | Format-Table -AutoSize
 

Или с Select-Object :

 $Users = Get-Content -Path 'C:ScriptsListsUserDistro.txt'

$result = foreach($user in $users)
{
    Get-ADPrincipalGroupMembership $user |
    Select-Object @{n='User';e={$user}},
                  @{n='GroupName';e={$_.Name}},
                  @{n='GroupType';e={$_.GroupCategory}}
}

$result | Format-Table -AutoSize