如何在PowerShell中使用Get-WinEvent返回TaskDisplayName ='Boot Performance Monitoring'的已过滤事件日志条目

时间:2018-08-01 17:08:30

标签: powershell get-winevent

以下代码可用于返回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过滤器?

2 个答案:

答案 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映射到正确的描述中。这就是为什么您不能基于TaskDisplayNameTask 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仅允许过滤器的子集:

  • LogName =
  • ProviderName =
  • 路径=
  • 关键字=
  • ID =
  • 等级=
  • StartTime =
  • EndTime =
  • UserID =
  • 数据=
  • * =

您可以做的是使用-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