Как экспортировать эти результаты в CSV-файл с разделителями-запятыми - PullRequest
0 голосов
/ 06 мая 2019

Я пытаюсь определить, есть ли способ переключить то, что у меня ниже, и экспортировать его в CSV-файл с разделителями-запятыми.

Сценарий работает нормально и возвращает данные, которые мне нужны, но не в удобном для использования формате.

Сценарий собирает пользователей в определенную группу и просматривает список пользователей, извлекая дополнительную информацию для каждого пользователя. Я не знаком с PowerShell, поэтому возможно, что я делаю это сложнее, чем необходимо, из-за недостатка знаний.

Import-module activedirectory

Function Process-Members($MemberList)
{
    foreach ($member in $MemberList)
    {
        Get-ADUser -Identity $member.samaccountname -Properties * | select Name, SamAccountName, Enabled, @{Name='LastLogon';Expression={[DateTime]::FromFileTime($_.LastLogon)}}
        dsquery user -samid $member.samaccountname | dsget user -memberof | dsget group -samid
    }
}

$members = Get-ADGroupMember "MyGroupName" -recursive | Select-Object name, SamAccountName

Process-Members $members

Ответы [ 2 ]

3 голосов
/ 06 мая 2019

Я удалил вашу функцию, потому что она не совсем необходима для этого процесса.Вы можете легко изменить его, чтобы использовать вашу функцию снова.Я также удалил команды dsquery и dsget, потому что в модуле ActiveDirectory есть команды, которые могут получить эту информацию.

$members = Get-ADGroupMember "MyGroupName" -recursive | Select-Object name, SamAccountName

$Output = foreach ($member in $members) {

    Get-ADUser -Identity $member.SamAccountName -Properties * |
       select Name, SamAccountName, Enabled,
       @{Name='LastLogon';Expression={[DateTime]::FromFileTime($_.LastLogon)}},
       @{n='MemberOf';e={($_.MemberOf |% {Get-ADGroup $_}).SamAccountName -join "; "}}
}

$Output | Export-Csv -Path output.csv -NoTypeInformation

Выбранное свойство MemberOf вычисляется путем возврата свойства SamAccountName из вывода Get-ADGroupи объединение результатов вместе с ;.Вы можете изменить этого присоединяемого персонажа.По умолчанию отключение объединения объединяет группы с пробелом, поэтому, если группы содержат пробелы, это может привести к путанице.% это просто псевдоним для ForEach-Object.Export-Csv используется для создания выходного файла CSV с разделителями-запятыми (output.csv).

Для всех версий PowerShell (2.0 и выше) вы можете использовать следующее:

$members = Get-ADGroupMember "MyGroupName" -recursive | Select-Object name, SamAccountName

$Output = foreach ($member in $members) {

    Get-ADUser -Identity $member.SamAccountName -Properties * |
       select Name, SamAccountName, Enabled,
       @{Name='LastLogon';Expression={[DateTime]::FromFileTime($_.LastLogon)}},
       @{n='MemberOf';e={($_.MemberOf |% {Get-ADGroup $_ | Select -Expand SamAccountName}) -join "; "}}
}

$Output | Export-Csv -Path output.csv -NoTypeInformation
0 голосов
/ 06 мая 2019

Powershell делает это очень просто.

Ваши $ members - это PSCollection, так что вы можете буквально просто передать Process-Members в Export-Csv с помощью оператора Pipe.

Process-Members $members | Export-Csv -Path {Your Desired CSV Location}

Это должно сработать.

Проверьте справочную страницу здесь: https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/export-csv?view=powershell-6

Что касается улучшения этого скрипта; по моему мнению, вы должны делать то, что имеет смысл читать с первого взгляда. Powershell предлагает всевозможные инструменты для выполнения модных трюков. Возможно, вы могли бы сделать это с изящной однострочной строкой, но если вы посмотрите на код и начнете пускать слюни, потому что невозможно сказать, что делает один линейный, это не здорово.

Лично мне не нравится объявлять функции в powershell, если я не собираюсь повторно использовать их функциональность. Я просто обработал бы ваши члены в переменную, которую вы можете затем направить в export-csv вместо создания функции. Но это не влияет на производительность, так что это всего лишь личные предпочтения.

...