Почему первый элемент, запущенный как $ i в моем списке foreach, оказывается пустым или смешивается со следующим элементом в списке? - PullRequest
0 голосов
/ 05 августа 2020

В основном это просто использует powershell для запроса членов группы и сортировки результатов. Если я выполняю одну команду за раз, она работает нормально, но когда я добавляю ее в скрипт, первая запись оказывается пустой или смешивает некоторых из первых пользователей со второй записью foreach ...

import-module activedirectory

$share = get=content "list.txt"

foreach ($i in $share){
get-adgroupmember $i | sort | select-object samaccountname,name
}

1 Ответ

0 голосов
/ 05 августа 2020

Я предполагаю, что вам нужен отчет обо всех пользовательских объектах в группе (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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...