InputObject имеет значение null - Powershell DataTable - PullRequest
0 голосов
/ 15 мая 2019

Я пытаюсь вывести массив объектов (из журналов событий) в DataTable с ожиданием передачи в SQL.

Основы:

  • Получение некоторых перенаправленных событий
  • Обработка их для извлечения необходимой информации
  • Вывод данныхтаблица

    function Get-Type 
    { 
        param($type) 
    
    $types = @( 
    'System.Boolean', 
    'System.Byte[]', 
    'System.Byte', 
    'System.Char', 
    'System.Datetime', 
    'System.Decimal', 
    'System.Double', 
    'System.Guid', 
    'System.Int16', 
    'System.Int32', 
    'System.Int64', 
    'System.Single', 
    'System.UInt16', 
    'System.UInt32', 
    'System.UInt64') 
    
        if ( $types -contains $type ) { 
            Write-Output "$type" 
        } 
        else { 
            Write-Output 'System.String' 
    
        } 
    } #Get-Type 
    
    function Out-DataTable
    { 
        [CmdletBinding()] 
        param([Parameter(Position=0, Mandatory=$true, ValueFromPipeline = $true)] [PSObject[]]$InputObject) 
    
        Begin 
        { 
            $dt = new-object Data.datatable   
            $First = $true  
        } 
        Process 
        { 
            Write-Output "test"
            foreach ($object in $InputObject) 
            { 
                $DR = $DT.NewRow()
                foreach($property in $object.PsObject.get_properties()) 
                {   
                    if ($first) 
                    {   
                        $Col =  new-object Data.DataColumn   
                        $Col.ColumnName = $property.Name.ToString()   
                        if ($property.value) 
                        { 
                            if ($property.value -isnot [System.DBNull]) { 
                                $Col.DataType = [System.Type]::GetType("$(Get-Type $property.TypeNameOfValue)") 
                             } 
                        } 
                        $DT.Columns.Add($Col) 
                    }   
                    if ($property.Gettype().IsArray) { 
                        $DR.Item($property.Name) =$property.value | ConvertTo-XML -AS String -NoTypeInformation -Depth 1 
                    }   
                   else { 
                        $DR.Item($property.Name) = $property.value 
                    } 
                }   
                $DT.Rows.Add($DR)   
                $First = $false 
            } 
        }  
    
        End 
        { 
            Write-Output @(,($dt)) 
        } 
    
    } #Out-DataTable
    
    $allEvents = Get-WinEvent -LogName ForwardedEvents | Where-Object{$_.Id -ne 111}
    
    $outEvents = @()
    $dt = $null
    
    foreach ($curEvent in $allEvents){
        $curObj = $null
        switch ($curEvent.ID) {
            4624    { 
                    $curObj = New-Object -TypeName PSObject
                    Add-Member -InputObject $curObj -MemberType NoteProperty -Name TimeCreated -Value ([datetime]$curEvent.TimeCreated)
                    Add-Member -InputObject $curObj -MemberType NoteProperty -Name Action -Value $curEvent.TaskDisplayName
                    Add-Member -InputObject $curObj -MemberType NoteProperty -Name MachineName -Value $curEvent.MachineName 
                    Add-Member -InputObject $curObj -MemberType NoteProperty -Name UserName -Value ((($curEvent.Message).Split([Environment]::NewLine)[36]).split(":")[1]).Trim()
                    Add-Member -InputObject $curObj -MemberType NoteProperty -Name LoginID -Value ((($curEvent.Message).Split([Environment]::NewLine)[40]).split(":")[1]).Trim()
                    Add-Member -InputObject $curObj -MemberType NoteProperty -Name SourceIP -Value ((($curEvent.Message).Split([Environment]::NewLine)[64]).split(":")[1]).Trim()
                    Add-Member -InputObject $curObj -MemberType NoteProperty -Name ID -Value $curEvent.Id
                    Add-Member -InputObject $curObj -MemberType NoteProperty -Name RecordID -Value $curEvent.RecordID
                    }
            4647    { 
                    $curObj = New-Object -TypeName PSObject
                    Add-Member -InputObject $curObj -MemberType NoteProperty -Name TimeCreated -Value ([datetime]$curEvent.TimeCreated)
                    Add-Member -InputObject $curObj -MemberType NoteProperty -Name Action -Value $curEvent.TaskDisplayName
                    Add-Member -InputObject $curObj -MemberType NoteProperty -Name MachineName -Value $curEvent.MachineName 
                    Add-Member -InputObject $curObj -MemberType NoteProperty -Name UserName -Value ((($curEvent.Message).Split([Environment]::NewLine)[8]).split(":")[1]).Trim()
                    Add-Member -InputObject $curObj -MemberType NoteProperty -Name LoginID -Value ((($curEvent.Message).Split([Environment]::NewLine)[12]).split(":")[1]).Trim()
                    Add-Member -InputObject $curObj -MemberType NoteProperty -Name SourceIP -Value "Not Available"
                    Add-Member -InputObject $curObj -MemberType NoteProperty -Name ID -Value $curEvent.Id
                    Add-Member -InputObject $curObj -MemberType NoteProperty -Name RecordID -Value $curEvent.RecordID
                    }
            4778    { 
                    $curObj = New-Object -TypeName PSObject
                    Add-Member -InputObject $curObj -MemberType NoteProperty -Name TimeCreated -Value ([datetime]$curEvent.TimeCreated)
                    Add-Member -InputObject $curObj -MemberType NoteProperty -Name Action -Value "Reconnect"
                    Add-Member -InputObject $curObj -MemberType NoteProperty -Name MachineName -Value $curEvent.MachineName 
                    Add-Member -InputObject $curObj -MemberType NoteProperty -Name UserName -Value ((($curEvent.Message).Split([Environment]::NewLine)[6]).split(":")[1]).Trim()
                    Add-Member -InputObject $curObj -MemberType NoteProperty -Name LoginID -Value ((($curEvent.Message).Split([Environment]::NewLine)[10]).split(":")[1]).Trim()
                    Add-Member -InputObject $curObj -MemberType NoteProperty -Name SourceIP -Value ((($curEvent.Message).Split([Environment]::NewLine)[24]).split(":")[1]).Trim()
                    Add-Member -InputObject $curObj -MemberType NoteProperty -Name ID -Value $curEvent.Id
                    Add-Member -InputObject $curObj -MemberType NoteProperty -Name RecordID -Value $curEvent.RecordID
                    }
            4800    { 
                    $curObj = New-Object -TypeName PSObject
                    Add-Member -InputObject $curObj -MemberType NoteProperty -Name TimeCreated -Value ([datetime]$curEvent.TimeCreated)
                    Add-Member -InputObject $curObj -MemberType NoteProperty -Name Action -Value "Locked"
                    Add-Member -InputObject $curObj -MemberType NoteProperty -Name MachineName -Value $curEvent.MachineName 
                    Add-Member -InputObject $curObj -MemberType NoteProperty -Name UserName -Value ((($curEvent.Message).Split([Environment]::NewLine)[8]).split(":")[1]).Trim()
                    Add-Member -InputObject $curObj -MemberType NoteProperty -Name LoginID -Value ((($curEvent.Message).Split([Environment]::NewLine)[12]).split(":")[1]).Trim()
                    Add-Member -InputObject $curObj -MemberType NoteProperty -Name SourceIP -Value "Not Available"
                    Add-Member -InputObject $curObj -MemberType NoteProperty -Name ID -Value $curEvent.Id
                    Add-Member -InputObject $curObj -MemberType NoteProperty -Name RecordID -Value $curEvent.RecordID
                    }
    
            Default { }
        }
        $outEvents += $curObj
    
    }
    
    $outEvents
    $dt = Out-DataTable -InputObject $outEvents
    

Когда я запускаю это, последний вывод $ outEvents перечисляет все объекты события с правильными деталями, но пытается передать его в Out-DataTable, возвращает:

Out-DataTable : Cannot bind argument to parameter 'InputObject' because it is null.
At \\server\scripts\Repository\Write-UserLoginEvent\Write-UserLoginEvent.ps1:140 char:38
+     $dt = Out-DataTable -InputObject $outEvents
+                                      ~~~~~~~
    + CategoryInfo          : InvalidData: (:) [Out-DataTable], ParameterBindingValidationException
    + FullyQualifiedErrorId : ParameterArgumentValidationErrorNullNotAllowed,Out-DataTable

Я перепробовал все различные методы форматирования данных и т. Д., И я не могу заставить эту функцию принимать мой массив пользовательских объектов.

Если я использую встроенную функцию, такую ​​как Get-Process, функция работает правильно и возвращает DataTable, поэтому я думаю, что это что-то специфическое для возвращаемого объекта.

РЕДАКТИРОВАТЬ: Перед тем как опубликовать это, я также переместил сегмент DataTable в цикл, чтобы попытаться напечатать каждый объект события как отдельный DataTable.Надеюсь определить, где была проблема.Сбой сразу на первом объекте.

1 Ответ

0 голосов
/ 15 мая 2019

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

Поскольку это событие форматировалось неправильно, в выходных данных было одно событие, которое не вписывалось бы в структуру DataTable, вызывая ошибку NULL.

Чтобы определить проблему, я поместил шаг Out-DataTable внутри цикла, чтобы обработать каждый объект индивидуально, и в выводе я увидел, что все объекты были успешными, кроме одного. Отслеживая это, я увидел, что не принимал во внимание этот Event ID (8001).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...