web-dev-qa-db-ja.com

XPathの使用は、Windowsイベントログを検索するための関数で始まります。

WindowsイベントビューアでXMLフィルタクエリを手動で編集することにより、データが文字列と完全に一致するイベントを見つけることができます。

<QueryList>
  <Query Id="0" Path="Application">
    <Select Path="Application">*[EventData[Data and (Data="Session end: imzcjflrrsq1sfdk3okc4jpf")]]</Select>
  </Query>
</QueryList>

今、私は部分的な一致をしたい:

<QueryList>
  <Query Id="0" Path="Application">
    <Select Path="Application">*[EventData[Data and (Data[starts-with(.,"Session")])]]</Select>
  </Query>
</QueryList>

イベントログにエラーが表示されます:

指定されたクエリは無効です

構文が間違っていますか?

22
Keith Walton

Windowsイベントログは、XPath1.0のサブセットをサポートします。 positionBandtimediffの3つの関数のみが含まれています。

参照: https://docs.Microsoft.com/en-us/windows/desktop/WES/sumption-events#xpath-10-limitations

20

2つのパスを気にしない場合は、いつでもPowerShellスクリプトを使用して、データを再フィルタリングできます。その-where演算子は-like-match、および-containsをサポートしています。

nv.ps1

$Query = @"
  <QueryList>
    <Query Id="0" Path="System">
      <Select Path="System">
        *[System[(EventID=20001)]]
      </Select>
    </Query>
  </QueryList>
"@

$events = Get-WinEvent -FilterXml $Query
ForEach ($Event in $Events) {
    # Convert the event to XML
    $eventXML = [xml]$Event.ToXml()
    Add-Member -InputObject $Event -MemberType NoteProperty -Force -Name  DriverVersion -Value $eventXML.Event.UserData.InstallDeviceID.DriverVersion
    Add-Member -InputObject $Event -MemberType NoteProperty -Force -Name  DriverDescription -Value $eventXML.Event.UserData.InstallDeviceID.DriverDescription
    Add-Member -InputObject $Event -MemberType NoteProperty -Force -Name  Data -Value $eventXML.Event.EventData.Data
}
$Events | Select TimeCreated, Id, DriverDescription, DriverVersion, ProviderName, @{Name="MessageData";Expression={$_.Message + $_.Data}} | Where {$_.DriverDescription -match "NVIDIA GeForce GTX*"} | Out-GridView
pause

それを起動するためのcmd(nv.cmd):

powershell.exe -executionpolicy bypass "& '.\nv.ps1'"
6
Richard Sandoz

データ内のセッション*を検索するための簡単なPowerShell。データが配列であったとしても、これは機能するはずです。

get-winevent application | where { $xml = [xml]$_.toxml() 
  $xml.event.eventdata.data -like 'session*' } | select -first 3


   ProviderName: Microsoft-Windows-Winlogon

TimeCreated                     Id LevelDisplayName Message
-----------                     -- ---------------- -------
2/22/2020 11:05:30 AM         6000 Information      The winlogon notification subscriber <SessionEnv> was unavailable to handle a notification event.
2/22/2020 11:05:30 AM         6003 Information      The winlogon notification subscriber <SessionEnv> was unavailable to handle a critical notification event.
2/21/2020 6:28:38 PM          6000 Information      The winlogon notification subscriber <SessionEnv> was unavailable to handle a notification event.


$xml.event.eventdata.data # the last one

SessionEnv

精度が必要ない場合は、データフィールドが頻繁に表示されるメッセージとの照合が簡単です。

get-winevent application | where message -match session
0
js2010