我正在运行这个(第 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 中利用它。
我还想知道是否有人知道如何在选择对象中显示该数据(而不是在 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
}
从事件日志中提取数据时,我所做的是首先将我想要的日志获取到 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
来提取和处理所需的任何单个数据。