6 votes

Journal des événements > Filtrer le journal actuel > XML > où EventData contient du texte

J'essaie de rechercher dans le journal des événements de Windows tout ce qui contient la chaîne de caractères suivante dans les données de l'événement TCP Provider, erreur : 0 dans le cadre d'un message d'erreur plus long. Pour ce faire, j'ai créé le code ci-dessous :

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

Cependant, cette requête est considérée comme invalide - je suppose que l'instruction contains n'est pas reconnue (car il semble qu'une version spéciale de la syntaxe XPath soit utilisée ici). Quelqu'un sait-il si ce que j'essaie de faire est possible / comment procéder ?

Merci d'avance,

JB

5voto

Terje Points 868

Vous pouvez toujours utiliser un script de powershell et passer le XML par la fonction where de powershell (supporte -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

Un cmd pour le lancer (nv.cmd) :

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

4voto

JohnLBevan Points 1072

En poursuivant mes recherches, je suis tombé sur une réponse à cette question sur Stack Overflow : https://stackoverflow.com/questions/8671194/using-xpath-starts-with-or-contains-functions-to-search-Windows-event-logs

Il semble donc qu'il ne soit pas possible d'effectuer des recherches par caractères génériques dans le journal des événements.

1voto

js2010 Points 143

Dans powershell :

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

S'il s'agissait d'une correspondance de chaîne entière, cela pourrait être réduit à :

get-winevent @{logname='application';providername='mydemo','anotherdemo';level=2,3; 
  data='TCP Provider, error: 0'}

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X