以下代码可用于返回ID = 100的Windows日志事件。
$Date = (Get-Date).AddDays(-30)
Get-WinEvent -FilterHashTable @{ LogName = "Microsoft-Windows-Diagnostics-Performance/Operational"; StartTime = $Date; ID = 100 } -MaxEvents 1 | Select-Object -Property TimeCreated, Id, Task, TaskDisplayName, LevelDisplayName, Message
此代码返回TaskDisplayName ='Boot Performance Monitoring'的错误
$Date = (Get-Date).AddDays(-30)
Get-WinEvent -FilterHashTable @{ LogName = "Microsoft-Windows-Diagnostics-Performance/Operational"; StartTime = $Date; TaskDisplayName = 'Boot Performance Monitoring' } | Select-Object -Property TimeCreated, Id, Task, TaskDisplayName, LevelDisplayName, Message
Get-WinEvent:未找到符合指定选择标准的事件。 在D:\ tfsws \ TG-Dev-ICSG2 \ Support \ PowerShell脚本\ Get-WinEvent-TEST.ps1:6 char:1 + Get-WinEvent -FilterHashTable @ {LogName =“ Microsoft-Windows-Diagnos ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~ + CategoryInfo:ObjectNotFound:(:) [Get-WinEvent],异常 + FullyQualifiedErrorId:NoMatchingEventsFound,Microsoft.PowerShell.Commands.GetWinEventCommand
如何使Get-WinEvent接受TaskDisplayName过滤器?
答案 0 :(得分:2)
不幸的是,由于两个原因,您不能使用-FilterHashTable
来筛选TaskDisplayName:
在Microsoft文档Get-WinEvent中,有效的FilterHashTable值为:
LogName=<String[]>
ProviderName=<String[]>
Path=<String[]>
Keywords=<Long[]>
ID=<Int32[]>
Level=<Int32[]>
StartTime=<DateTime>
EndTime=<DataTime>
UserID=<SID>
Data=<String[]>
TaskDisplayName不是-FilterHashTable
选项之一。...确定。因此,下一个选择是使用-FilterXPath
或-FilterXML
,这使我们可以访问一些更底层的过滤器。为简单起见,我将使用-FilterXPath
。为了找到要过滤的正确键,您必须转到事件的详细信息选项卡。这是一个示例事件:
<Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
<System>
<Provider Name="Microsoft-Windows-Diagnostics-Performance" Guid="{CFC18EC0-96B1-4EBA-961B-622CAEE05B0A}" />
<EventID>100</EventID>
<Version>2</Version>
<Level>2</Level>
<Task>4002</Task>
<Opcode>34</Opcode>
<Keywords>0x8000000000010000</Keywords>
<TimeCreated SystemTime="2018-05-23T21:09:42.047563100Z" />
<EventRecordID>8</EventRecordID>
<Correlation ActivityID="{F774E0CC-F2D9-0006-E0FA-74F7D9F2D301}" />
<Execution ProcessID="3876" ThreadID="4980" />
<Channel>Microsoft-Windows-Diagnostics-Performance/Operational</Channel>
<Computer>D4700.adcfcu.connectfirstcu.com</Computer>
<Security UserID="S-1-5-19" />
</System>
<EventData>
<Data Name="BootTsVersion">2</Data>
<Data Name="BootStartTime">2018-05-23T21:06:49.733345200Z</Data>
..........
<Data Name="UserLogonWaitDuration">9415</Data>
</EventData>
</Event>
将其扩展时,会发现没有 TaskDisplayName
。这是因为TaskDisplayName == Task Category
。好的...让我们寻找Task Category
...也没有Task Category
。这是因为类别实际上是数字存储在事件中,然后使用Event Category String映射到正确的描述中。这就是为什么您不能基于TaskDisplayName
或Task Category
进行过滤的原因。相反,您将不得不过滤Task
号,在本例中为 4002
。并且,如果您使用StartDate
,即TimeCreated
,则可以计算出30天为2592000000毫秒,那么您的代码将变为:
Get-WinEvent -LogName "Microsoft-Windows-Diagnostics-Performance/Operational" -FilterXPath "*[System[Task=4002 and TimeCreated[timediff(@SystemTime) <= 2592000000]]]" | Select-Object -Property TimeCreated, Id, Task, TaskDisplayName, LevelDisplayName, Message
答案 1 :(得分:1)
如Documentation中所述,-FilterHashTable
仅允许过滤器的子集:
您可以做的是使用-FilterXML
参数创建FilterXML。
您可以使用eventvwr.msc
创建合适的XML(查找和示例事件,从详细信息视图中获取任务编号,配置协议过滤器,切换到“ XML”标签,然后复制内容)。
结果将是这样的:
$Filter = @'
<QueryList>
<Query Id="0" Path="Microsoft-Windows-Diagnostics-Performance/Operational">
<Select Path="Microsoft-Windows-Diagnostics-Performance/Operational">*[System[(EventID=100) and (Task=4002)]]</Select>
</Query>
</QueryList>
'@
Get-WinEvent -FilterXml $Filter
但是, TaskDisplayName不是有效的属性,您必须弄清楚“引导性能监视”的Task
号是什么。
请注意,任务4002
不是您要查找的任务。这只是我的事件日志中唯一可用的数字。 ;)
另外,也可以不使用,但不推荐使用(一般规则:左过滤器),可以使用sample命令并添加一个Where-Object
过滤器。
$FitlerHashTable = @{
LogName = "Microsoft-Windows-Diagnostics-Performance/Operational"
StartTime = $Date
ID = 100
}
Get-WinEvent -FilterHashTable $FitlerHashTable -MaxEvents 1 |
Where-Object { $_.Task -eq 4002 } |
Select-Object -Property TimeCreated, Id, Task, TaskDisplayName, LevelDisplayName, Message