#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