Как я могу использовать данные в массиве, который находится в массиве - PullRequest
0 голосов
/ 13 июня 2019

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

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

Итак, мой вопрос - как мне ссылаться на массив внутри массива, чтобы поместить получателей в экспортированный CSV. В моем текущем сценарии написаны следующие столбцы:

Метка времени сервера. Идентификатор источника. Получатели отправителя. MessageSubject

Затем в столбец получателей добавляется:

@{Recipients=System.Collections.ArrayList}

Param (
    [Parameter(Mandatory=$True)]
    [ValidateNotNull()]
    [String]$Start,

    [Parameter(Mandatory=$True)]
    [ValidateNotNull()]
    [String]$End,

    [Parameter(Mandatory=$True)]
    [ValidateNotNull()]
    [String]$Sender,

    [Parameter(Mandatory=$False)]
    [ValidateNotNull()]
    [String]$Recipient,

    [Parameter(Mandatory=$False)]
    [ValidateNotNull()]
    [String]$Subject
)

$UserCredential = Get-Credential
$Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri <HostAddress> -Authentication basic -Credential $UserCredential
Import-PSSession $Session -DisableNameChecking

$ifBlock = "0"
$tracingResults = @()

#Get-ExchangeServer | Select Name
#ForEach ($S in (Get-ExchangeServer | select -ExpandProperty name))
if (($Recipient -eq "" -And $Subject -eq "") -And ($ifBlock -eq "0" -or $ifBlock -eq "R+S"))
        {
        $ifBlock = "R+S"
        ForEach ($S in (Get-ExchangeServer | select -ExpandProperty name)){
        $Tracing = Get-MessageTrackingLog -ResultSize Unlimited -server $S -Start $Start -End $End -Sender $Sender | select Timestamp,ServerHostname,EventId,Source,Sender,Recipients,MessageSubject
         if ($tracing -eq ""){
            Write-Output ($S + " : No emails found here")
            }
         if ($Tracing -ne ""){
            $TracingObject = Get-Variable Tracing
                try{
                    $tracingResults += New-Object -TypeName PSObject -Property @{
                    Server = $S
                    Timestamp = $TracingObject.Value[0] | select Timestamp
                    EventId = $TracingObject.Value[0] | select EventId
                    Source = $TracingObject.Value[0] | select Source
                    Sender = $TracingObject.Value[0] | select Sender
                    Recipients = $TracingObject.Value[0] | select Recipients
                    MessageSubject = $TracingObject.Value[0] | select MessageSubject
                    } | Select-Object Server,Timestamp,EventId,Source,Sender,Recipients,MessageSubject
                }
                catch{}
                #Write-Output ($tracing)
            }
        }
        }

Remove-PSSession $Session
$tracingResults | Export-Csv -NoTypeInformation -Path ./trace.csv

Ответы [ 2 ]

0 голосов
/ 14 июня 2019

К сожалению, это решение не сработало и для меня, T-Me, однако я использовал этот подход для других сценариев.

Для справки, я решил эту проблему, зацикливаясь на каждом возвращенном результате, вместо того, чтобы пытаться обработать все возвращенные результаты на сервер за один раз:

ForEach ($S in (Get-ExchangeServer | select -ExpandProperty name)){
        $Tracing = Get-MessageTrackingLog -ResultSize Unlimited -server $S -Start $Start -End $End -Sender $Sender | select Timestamp,EventId,Source,Sender,Recipients,MessageSubject,MessageId,OriginalClientIp
        [string]$TracingString = $Tracing
            ForEach ($log in $Tracing){

             $tracingResults += New-Object -TypeName PSCustomObject -Property @{
                            Server = $S
                            Timestamp = $log.TimeStamp
                            EventId = $log.EventId
                            Source = $log.Source
                            Sender = $log.Sender
                            Recipients = $log.Recipients
                            MessageSubject = $log.MessageSubject
                            OriginalClientIp = $log.OriginalClientIp
                            MessageId = $log.MessageId
                            } | Select-Object Server,Timestamp,EventId,Source,Sender,Recipients,MessageSubject,MessageId,OriginalClientIp
                }
            }
        }

$tracingresults | Export-Csv -NoTypeInformation -Path ./trace.csv
0 голосов
/ 14 июня 2019

Проблема в том, что вы создали $tracingResults путь к сложному ... Однако, как вы это сделали, вам нужен PSCustomObject, а не PSObject. Вот минимально-воспроизводимый пример

 $tracingResults = @()
 1..3 | foreach {
     $tracingResults += New-Object -TypeName PSCustomObject -Property @{
                        Server = "serv$_"
                        Timestamp = "time$_"
                        EventId = "EventId$_"
                        Source = "Source$_"
                        Sender = "Sender$_"
                        Recipients = "Recipients$_"
                        MessageSubject = "MessageSubject$_"
                        } | Select-Object Server,Timestamp,EventId,Source,Sender,Recipients,MessageSubject
}
$tracingresults | convertto-csv -NoTypeInformation
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...