Я пытаюсь найти в журнале событий Windows что-нибудь, где данные события содержат строку Поставщик TCP, ошибка: 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>
Однако это рассматривается как недопустимый запрос - я предполагаю, что оператор contains не распознается (поскольку похоже, что здесь используется специальная версия синтаксиса XPath. Кто-нибудь знает, возможно ли то, что я пытаюсь сделать, / как делать это?
Заранее спасибо,
JB
В ходе дальнейшего расследования я нашел ответ на этот вопрос в Stack Overflow: https://stackoverflow.com/questions/8671194/using-xpath-starts-with-or-contains-functions-to-search-windows-event-logs
Таким образом, похоже, что поиск с использованием подстановочных знаков в журнале событий невозможен.
Вы всегда можете использовать сценарий powershell и передать XML через функцию powershell 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'"
В 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'}