Журнал событий> Фильтровать текущий журнал> XML >, где EventData содержит текст

Я пытаюсь найти в журнале событий Windows что-нибудь, где данные события содержат строку TCP Provider, error: 0 как часть более длинного сообщения об ошибке. Для этого я создал код ниже:

<QueryList>
  <Query Id="0" Path="Application">
    <Select Path="Application">*[System[Provider[@Name='MyDemo' or @Name='AnotherDemo'] and (Level=2 or Level=3)]][EventData[Data[contains(.,'TCP Provider, error: 0')]]]</Select>
  </Query>
</QueryList>

Однако это рассматривается как недопустимый запрос - я предполагаю, что оператор содержимого не распознается (так как похоже, что здесь используется специальная версия синтаксиса XPath. Кто-нибудь знает, возможно ли то, что я пытаюсь сделать? идти делать это?

Заранее спасибо,

JB

2 ответа

Решение

Вы всегда можете использовать скрипт powershell и передать XML через функцию powershell's where (поддерживает -contains -like -match):

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

Команда для его запуска (nv.cmd):

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

При дальнейшем расследовании я наткнулся на ответ на этот вопрос по переполнению стека: https://stackoverflow.com/questions/8671194/using-xpath-starts-with-or-contains-functions-to-search-windows-event-logs

Похоже, что поиск по шаблону в журнале событий невозможен.

В PowerShell:

get-winevent @{logname='application';providername='mydemo','anotherdemo';level=2,3} | 
  where { [xml]$xml = $_.toxml() 
  $xml.event.eventdata.data -match 'TCP Provider, error: 0' }

Если бы это было совпадение всей строки, это можно было бы уменьшить до:

get-winevent @{logname='application';providername='mydemo','anotherdemo';level=2,3; 
  data='TCP Provider, error: 0'}
Другие вопросы по тегам