我正在运行这个(第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
}
答案 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
来提取和处理您想要的任何单个数据。