我制作了一个如下所示的 powershell 脚本,但由于我无法将其保存为 .evtx 格式。我想要相同的 wevtutil 等效程序(使用 wevtutil epl)。请帮忙!
$ErrorTime=Get-WinEvent -FilterHashtable @{
Logname = 'Application'
ID = 1000
ProviderName = 'Application Error'
} -MaxEvents 1 | select Select-Object -Expand TimeCreated
$Start_Time = ($ErrorTime).addhours(-2)
$End_Time = ($ErrorTime).addhours(2)
Get-WinEvent -FilterHashtable @{
Logname='Application','System','Security' 'Setup'
StartTime=$Start_Time
EndTime =$End_Time}
只是告诉您脚本正在做什么。它获取上次发生应用程序错误 1000 的时间戳,在该时间戳上加减两个小时,然后在这两个时间之间查询应用程序系统安全性和设置。
我需要这样的东西
wevtutil epl 应用程序,其中时间 >= $Start_Time 且时间 <= $End_Time
请帮忙。
答案1
您可以使用 XPath 进行特定事件查询,并借助许多事件工具(Event MMC、Powershell 和 Wevtutil)。在其他情况下,我熟悉 XML 结构、SCOM 管理包、HTML 等,但我发现 XPath 有点难以做到恰到好处。需要记住的几点是:
- 您需要使用世界时间进行查询,因为这是事件子系统记录时间的方式。时间也需要格式化为可排序的 ISO 8601,例如2016-01-10T18:47:34。
- 您需要将查询的时间括在单引号中,并且还需要为 powershell 转义这些引号,因为 powershell 将未转义的单引号内的内容视为文字,这意味着除非转义,否则单引号内的变量不会被扩展。
- 其他时候我使用 XPath,它需要大于/小于,如 > ; / < ; 但在这里不起作用。只有实际的 > < 符号才有效。
- Xpath 查询的开头包含“System”,这并不指事件日志类型,而是指事件 XML 的系统分支(下面的屏幕截图为来自应用程序日志的事件)
样本
$time1 = ((get-date).toUniversalTime()).addHours(-22)
$time2 = ((get-date).toUniversalTime()).addHours(-24)
$newest = get-date($time1) -f s
$oldest = get-date($time2) -f s
$newest
$oldest
foreach ($logName in "Application Security System Setup".split(" ")) {
WEVTUTIL.EXE EPL $logName "C:\temp\my$logName.evtx" "/q:*[System[TimeCreated[@SystemTime<=`'$newest`' and @SystemTime>=`'$oldest`']]]" /ow:true
}