Powershell |来自Get-WinEvent

时间:2017-01-19 20:09:48

标签: powershell

我正在运行这个(第1行很好,只是第2行,我知道不对):

$specificEvent = Get-WinEvent -FilterHashtable @{"ProviderName"="Microsoft-Windows-Security-Auditing";Id=4648} | select -First 1 
$specificEvent | ? {($_).Properties[1] -eq "whatever"}

它不起作用。并不惊讶但是有没有一种真正的方法来获取System.Collections.Generic.IList类型的属性数据?

我也可以通过这种方式访问​​相同的数据:

$specificEvent | % {
    ([xml]$_.ToXml()).Event.EventData.Data
}

但我再也不知道如何在where-object中利用它。

我还想知道是否有人知道如何在select-object中显示数据(vs foreach循环中的处理),所以当我最终得到过滤工作时,我可以显示我需要的东西。

对任何愿意帮助的人,非常感谢你!

更新: 根据下面提供的答案,我能够制作此代码。它不是完美的,但很好地完成了工作

$EventIDs = (Get-WinEvent -FilterHashtable @{
    "ProviderName"="Microsoft-Windows-Security-Auditing";
    StartTime=(get-date).AddHours(-24);
    Id=4625} | select RecordID).RecordID

Foreach ($r in $EventIDs) {
    $EvXML = $null
    [xml]$EvXML = (Get-WinEvent -LogName "Security" -FilterXPath "*[System[EventRecordID=$($r)]]").ToXML()

    $Events = $null
    $Events = For ($i=0; $i -lt $EvXML.Event.EventData.Data.Count; $i++) {
        New-Object -TypeName psobject -Property (
            [ordered]@{Name  = $EvXML.Event.EventData.Data[$i].Name
            Value = $EvXML.Event.EventData.Data[$i].'#text'}
        )
    }

    write-host ($events | ? {$_.Name -eq "TargetUserName"}).value "|" ($events | ? {$_.Name -eq "TargetDomainName"}).value "|" ($events | ? {$_.Name -eq "IPAddress"}).value ":" ($events | ? {$_.Name -eq "IPPort"}).value
}

1 个答案:

答案 0 :(得分:1)

从事件日志中提取数据时,我首先将我想要的日志转换为XML类型变量,然后将变量数据转换为对象,如下所示:

 [xml]$EvXML = (Get-WinEvent -FilterHashtable @{"ProviderName"="Microsoft-Windows-Security-Auditing";Id=4648} -MaxEvents 1).ToXML()
 $Event = For ($i=0; $i -lt $EvXML.Event.EventData.Data.Count; $i++) {
    New-Object -TypeName psobject -Property ([ordered]@{Name  = $EvXML.Event.EventData.Data[$i].Name
                                                        Value = $EvXML.Event.EventData.Data[$i].'#text'})
 }

一旦数据是一个对象数组,就像任何其他PS对象数组一样,你可以用它做任何你想做的事情。如果您需要系统数据,请将$EvXML.Event.EventData替换为$EvXML.Event.System,然后您可以关闭所需的任何字段。要查看可用于引用任何事件的内容,请参阅事件查看器中的XML视图。然后,您可以通过引用$Event[#].Name$Event[#].Value来提取和处理您想要的任何单个数据。