none
Powershell: Export zu CSV misslingt, nur das erste Feld der Spalten wird gefüllt / zu viel Text

    Allgemeine Diskussion

  • Hallo,

    ich möchte gern besser mit Powershell klarkommen und "bastel" ein wenig herum, um die Syntax und Struktur zu lernen. Ich stelle mir Fragen welche ich dann mit Powershell versuche umzusetzen. Derzeit versuche ich, ausschließlich spezifische Events aus dem Ereignislog in eine CSV zu exportieren und nach dem Zeitstempel zu sortieren. Das funktioniert in der Console einwandfrei, der Export in eine CSV funktioniert jedoch nicht.

    Problematisch war, das die Informationen, welche ich benötige, im erweiteren Teil des Eventlogs zu finden waren, z.B. die IP-Adresse bei einem RDP Zugriff, welche ich in der CSV-Datei benötige. Die Ereignislog-Dateien kommen aus einem lokalen Verzeichnis und können mehrere sein. (Derzeit versuche ich es mit einer Datei).

    Mein Code sieht derzeit folgendermaßen aus:

    Get-WinEvent -FilterHashtable @{Path="c:\temp\random.evtx";} |Where {($_.id -eq "4624" -and $_.properties[8].value -in 2,3,10) -or ($_.id -eq "4625") -or ($_.id -eq "4800")} |%{
        $SelectorStrings = [string[]]@(
            'Event/EventData/Data[@Name="TargetUserName"]',
            'Event/EventData/Data[@Name="TargetDomainName"]',
            'Event/EventData/Data[@Name="TargetLogonId"]',
            'Event/EventData/Data[@Name="LogonType"]',
            'Event/EventData/Data[@Name="WorkstationName"]',
            'Event/EventData/Data[@Name="IpAddress"]',
            'Event/EventData/Data[@Name="IpPort"]'
        )
        $PropertySelector = [System.Diagnostics.Eventing.Reader.EventLogPropertySelector]::new($SelectorStrings)
    
        $UserName,$Domain,$LogonId,$LogonType,$ComputerName,$IPAddres,$Port = $_.GetPropertyValues($PropertySelector)
    
        New-Object psobject -Property @{
            TimeCreated  = $_.TimeCreated
            UserName     = $UserName
            Domain       = $Domain
            LogonId      = $LogonId
            LogonType    = $LogonType
            ComputerName = $ComputerName
            IPAddres     = $IPAddres
            Port         = $Port
            Message      = $_.Message
        }|export-csv -NoTypeInformation -Force -Encoding UTF8 -Path "c:\temp\exportencoding2.csv"
    }

    Das Ergebnis ist allerdings ziemlich doof: ich benötige NUR den ersten Satz aus dem Message-block, z.B. "Ein Konto wurde erfolgreich angemeldet", nicht den Rest des Beschreibungstextes in $_.Message

    Auch passt die Reihenfolge der Felder in der Ausgabe nicht, ich wollte eigentlich TimeCreated ganz vorn stehen haben.

    Beispielausgabe:

    "Domain","UserName","TimeCreated","ComputerName","LogonId","LogonType","Port","Message","IPAddres"
    "TestClient01","root","03.12.2017 11:07:26","MasterServer","145302196","3","1234","Ein Konto wurde erfolgreich angemeldet.

    Vielen Dank

    Wie kann ich $_.Message "abschneiden" nach dem ersten Satz?
    Wo kann ich die Reihenfolge anpassen?

    Freitag, 2. Februar 2018 09:58

Alle Antworten

  • Beim Message Block versuch mal ($_.Message).splitt(".") dann müsste in Message[0] der erste Satz sein.

    Fürs Sortieren : https://mcpmag.com/articles/2012/12/11/pshell-order.aspx

    Kurze Zusammenfassung aus dem Artikel (den Hash in einer Variabel und dann mit 

    $hash=[ordered]@{

      

    TimeCreated = $_.TimeCreated UserName = $UserName Domain = $Domain LogonId = $LogonId LogonType = $LogonType ComputerName = $ComputerName IPAddres = $IPAddres Port = $Port

    $zwischen = ($_.Message).splitt(".")  Message = $zwischen[0]

    }

    New-Object psobject -Property $hash

    Freitag, 2. Februar 2018 10:18
  • Wenn Export-CSV innerhalb der Schleife - dann Parameter -Append?

    Eine Hashtable ist per Default erst mal unsortiert. Es gibt auch eine sortierte Variante  - einfach ein [ordered] vor das @ setzen ...


    Best regards,

    (79,108,97,102|%{[char]$_})-join''

    Freitag, 2. Februar 2018 10:23
  • Wenn ich [ordered] davorsetzte gehts leider nicht Olaf:

    New-Object : Cannot bind parameter 'Property'. Cannot convert the "[ordered]@" value of type "System.String" to type "System.Collections.IDictionary".

    At line:15 char:35

    +     New-Object psobject -Property [ordered]@{

    +                                   ~~~~~~~~~~

        + CategoryInfo          : InvalidArgument: (:) [New-Object], ParameterBindingException

        + FullyQualifiedErrorId : CannotConvertArgumentNoMessage,Microsoft.PowerShell.Commands.NewObjectCommand

    Freitag, 2. Februar 2018 10:51
  • Oooopsi ...  mein Fehler ... vielleicht sollte ich in Zukunft doch genauer hingucken. ;-)

    Versuch mal das hier: 

    Get-WinEvent -FilterHashtable @{Path="c:\temp\random.evtx";} |
        Where-Object {($_.id -eq "4624" -and $_.properties[8].value -in 2,3,10) -or ($_.id -eq "4625") -or ($_.id -eq "4800")} |
            ForEach-Object{
                $SelectorStrings = [string[]]@(
                'Event/EventData/Data[@Name="TargetUserName"]',
                'Event/EventData/Data[@Name="TargetDomainName"]',
                'Event/EventData/Data[@Name="TargetLogonId"]',
                'Event/EventData/Data[@Name="LogonType"]',
                'Event/EventData/Data[@Name="WorkstationName"]',
                'Event/EventData/Data[@Name="IpAddress"]',
                'Event/EventData/Data[@Name="IpPort"]'
                )
                $PropertySelector = [System.Diagnostics.Eventing.Reader.EventLogPropertySelector]::new($SelectorStrings)
    
                $UserName,$Domain,$LogonId,$LogonType,$ComputerName,$IPAddres,$Port = $_.GetPropertyValues($PropertySelector)
    
                [PSCustomObject]@{
                TimeCreated  = $_.TimeCreated
                UserName     = $UserName
                Domain       = $Domain
                LogonId      = $LogonId
                LogonType    = $LogonType
                ComputerName = $ComputerName
                IPAddres     = $IPAddres
                Port         = $Port
                Message      = $_.Message
                }|
                    Export-Csv -NoTypeInformation -Force -Encoding UTF8 -Path 'c:\temp\exportencoding2.csv' -Append
            }


    Best regards,

    (79,108,97,102|%{[char]$_})-join''

    Freitag, 2. Februar 2018 11:09
  • > +     New-Object psobject -Property [ordered]@{

    Erst in eine Variable stecken oder $( ) drum herum?

    Freitag, 2. Februar 2018 11:18
  • Leider auch nicht....

    Export-Csv : Cannot process argument because the value of argument "name" is not valid. Change the value of the "name" argument and run the operation

    again.

    At line:28 char:24

    + ...          }| Export-Csv -NoTypeInformation -Force -Encoding UTF8 -Path ...

    +                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

        + CategoryInfo          : InvalidArgument: (:) [Export-Csv], PSArgumentException

        + FullyQualifiedErrorId : Argument,Microsoft.PowerShell.Commands.ExportCsvCommand

    funktioniert, wenn export-csv auskommentiert wird. jedoch ist keines der beiden Probleme (zu viel text und export csv) erledigt.

    • Bearbeitet Nasir Habab Freitag, 2. Februar 2018 11:58 typos
    Freitag, 2. Februar 2018 11:54
  • Brauchst du hier noch Hilfe? Wenn ja poste bitte mal eine kurze Beispiel - *.evtx mit entsprechenden Events drin.


    Blog: http://bytecookie.wordpress.com

    Kostenloser Powershell Code Manager v5: Link
    (u.a. Codesnippets verwalten + komplexe Scripte graphisch darstellen)

    Hilf mit und markiere hilfreiche Beiträge mit dem "Abstimmen"-Button (links) und Beiträge die eine Frage von dir beantwortet haben, als "Antwort" (unten).
    Warum das Ganze? Hier gibts die Antwort.

    Donnerstag, 8. Februar 2018 10:42
    Moderator