Я предполагаю, что вам нужен отчет обо всех пользовательских объектах в группе (Get-ADGroupMember
может возвращать пользователей, компьютеры или группы) и хотите, чтобы свойства SamAccountName и Name этих пользователей были результат.
Поскольку ваш код также не возвращает имя самого общего ресурса, не было бы никакого способа сказать, какие пользователи являются членами какой группы, так что это объяснило бы, что вы имеете в виду под " смешивает некоторых из первых пользователей со второй записью foreach ".
Кроме того, как указано в комментариях, у вас могут быть пустые строки или ведущие / завершающие пробелы вокруг (некоторых) элементов в текстовом файле .
Попробуйте:
# read the group names from the file.
# skip empty lines and make sure the names are not surrounded by whitespace
$groups = (Get-Content -Path "list.txt" | Where-Object { $_ -match '\S' }).Trim()
$result = foreach ($group in $groups) {
Get-ADGroupMember -Identity $group -Recursive |
Where-Object {$_.objectClass -eq 'user'} |
Select-Object @{Name = 'Group'; Expression = {$group}}, SamAccountName, Name |
Sort-Object Name
}
# output on screen
$result | Format-List
# output to csv file
$result | Export-Csv -Path 'D:\Test\Groups.csv' -NoTypeInformation
Что касается вывода, вы бы хотели, чтобы он был отформатирован по-другому. Вы можете проявить столько творчества, сколько захотите, если у вас есть объекты, хранящиеся в переменной $result
.
Что-то вроде:
# group the results by the Group (share) property
# and output the usernames beneath that group name
$result | Group-Object Group | Sort-Object Name | ForEach-Object {
# output the group (share) name with a dash line beneath it
"{0}`r`n{1}" -f $_.Name, ('-' * $_.Name.Length)
# next output the usernames
foreach ($user in $_.Group) {
'{0}, {1}' -f $user.SamAccountName, $user.Name
}
# output an empty divider line
''
}
Конечно, вы также можете захватить этот результат и отобразить позже или сохранить как текстовый файл
$final = $result | Group-Object Group | Sort-Object Name | ForEach-Object { .. }
# show on screen
$final
# save as file
$final | Set-Content -Path 'D:\Test\GroupsFinal.txt'
Результат будет выглядеть примерно так:
ShareGroup1
-----------
jdoe, John Doe
hbloggs, Henry Bloggs
ShareGroup2
-----------
ppicasso, Pablo Picasso