Экспорт пользовательского объекта PowerShell в CSV

Я хочу создать полный отчет о разрешении почтового ящика и экспортировать его в CSV в PowerShell.

$report = @()
$mailboxes = Get-Mailbox -ResultSize unlimited -RecipientTypeDetails sharedmailbox

foreach ($mailbox in $mailboxes)
{ 
    $permissions = Get-Mailbox $mailbox.PrimarySmtpAddress | Get-MailboxPermission | Select-Object user, accessrights
    $users = $permissions.user
    $accessRights = $permissions.accessrights
    $sendAsPermissions = Get-Mailbox $mailbox.PrimarySmtpAddress | Get-ADPermission | Where-Object {$_.extendedrights -eq "send-as"} | select -ExpandProperty user
    $sendOnBehalfPermissions = Get-Mailbox $mailbox.PrimarySmtpAddress | select -ExpandProperty grantsendonbehalfto

    $properties = @{
    Identity = $mailbox.PrimarySmtpAddress
    Users = ($permissions.user -join "`n")
    AccessRights = ($permissions.accessrights -join "`n")
    SendAs = ($sendAsPermissions -join "`n")  
    SendOnBehalf = ($sendOnBehalfPermissions -join "`n")
    }

    $mailboxObject = New-Object -TypeName psobject -Property $properties

    #$mailboxObject | select identity, users, accessrights | Export-Csv -Append -NoTypeInformation -Path c:\temp\test.csv
    $mailboxObject | select identity, users, accessrights, sendas, sendonbehalf | out-gridview
}

Сетка показывает именно то, что я хочу, но мне трудно заставить его правильно экспортировать в CSV.

Пример Out-Gridview

4 ответа

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

Вы можете получить Import-Excel модуль, который позволяет легко создавать и форматировать файлы Excel. Вы можете установить его из галереи Powershell, расположенной здесь. Это в основном предполагает, что ваши листы предназначены только для человеческих глаз, и учитывая формат, я думаю, я могу сказать с некоторой степенью уверенности, что это правда.

Сначала я начал собирать все объекты перед добавлением, что я считаю довольно распространенной ошибкой. Просто выведите объект напрямую и соберите его в переменную.

$report = @()
$mailboxes = Get-Mailbox -ResultSize unlimited -RecipientTypeDetails sharedmailbox

$collectOutput = foreach ($mailbox in $mailboxes)
{ 
  $permissions = Get-Mailbox $mailbox.PrimarySmtpAddress | Get-MailboxPermission | Select-Object user, accessrights
  $users = $permissions.user
  $accessRights = $permissions.accessrights
  $sendAsPermissions = Get-Mailbox $mailbox.PrimarySmtpAddress | Get-ADPermission | 
    Where-Object {
      $_.extendedrights -eq 'send-as'
    } | Select-Object -ExpandProperty user
  $sendOnBehalfPermissions = Get-Mailbox $mailbox.PrimarySmtpAddress | Select-Object -ExpandProperty grantsendonbehalfto

  [pscustomobject]@{
    Identity     = $mailbox.PrimarySmtpAddress
    Users        = ($permissions.user -join "`r`n")
    AccessRights = ($permissions.accessrights -join "`r`n")
    SendAs       = ($sendAsPermissions -join "`r`n")
    SendOnBehalf = ($sendOnBehalfPermissions -join "`r`n")
  }
}

Теперь я собираюсь использовать Export-Excel Командлет для создания объекта OfficeOpenXml.ExcelPackage, которым мы можем затем управлять с помощью нескольких вспомогательных функций. Я обнаружил, что это почти подражал Out-Gridview, Обтекание заголовка совсем немного, но вы можете экспериментировать с другими параметрами, пока не найдете то, что выглядит именно вам.

$sheet = $collectOutput | Export-Excel -Path 'C:\Users\username\Desktop\testing.xlsx' -PassThru -AutoSize

$sheet.Sheet1.Column(1) | Set-ExcelRange -VerticalAlignment Center
$sheet.Sheet1.Column(2) | Set-ExcelRange -WrapText
$sheet.Sheet1.Column(3) | Set-ExcelRange -WrapText
$sheet.Sheet1.Column(4) | Set-ExcelRange -WrapText

$sheet.Save()
$sheet.Dispose()

Можете ли вы попробовать это

Identity = $mailbox.PrimarySmtpAddress
Users = (@($permissions.user -join "`n") |Out-String).Trim()
AccessRights = (@($permissions.accessrights -join "`n")|Out-String).Trim()
SendAs = (@($sendAsPermissions -join "`n") |Out-String).Trim() 
SendOnBehalf =(@($sendOnBehalfPermissions -join "`n")|Out-String).Trim()

** вы можете посмотреть этот сайт ** https://learn-powershell.net/2014/01/24/avoiding-system-object-or-similar-output-when-using-export-csv/ Similar- output- when- using- export- csv/

Чтобы преобразовать объект, вы можете использовать pipe в результате выбора в ConvertTo-Csv, например так:

  $selectResult = $mailboxObject | select identity, users, accessrights, sendas, sendonbehalf
  $selectResult | out-gridview
  $selectResult | ConvertTo-Csv > .\mailbox.csv

Экспорт-CSV для этого.

Вот рабочий пример:

$o = [PSCustomObject]@{a = 1 } ,
     [PSCustomObject]@{a = 2 }

# Export     
$o | Export-Csv -Path a.csv

# check the file
Get-Content ./a.csv

Чтобы найти команды, работающие с CSV, вы можете использовать

Get-Command *csv*
Другие вопросы по тегам