Использование XPath запускается с или содержит функции для поиска в журналах событий Windows - PullRequest
22 голосов
/ 29 декабря 2011

Отредактировав запрос фильтра XML вручную в средстве просмотра событий Windows, я могу найти события, в которых данные точно соответствуют строке:

<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>

Журнал событий выдает мне ошибку:

Указан неверный запрос

У меня неправильный синтаксис?

Ответы [ 2 ]

19 голосов
/ 29 декабря 2011

Журнал событий Windows поддерживает подмножество XPath 1.0.Он содержит только 3 функции: position, Band, timediff.

Ссылка: https://docs.microsoft.com/en-us/windows/desktop/WES/consuming-events#xpath-10-limitations

6 голосов
/ 16 октября 2015

Если вы не возражаете против двух проходов, вы всегда можете использовать сценарий 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'"
...