À partir de Windows Vista et Windows Server 2008, Microsoft a repensé l’Observateur d’événements pour utiliser un système de journalisation structuré basé sur XML. Cela signifie que vous pouvez écrire des requêtes XPath pour filtrer les événements avec précision, ce qui est bien plus puissant que le filtrage de base de l’interface graphique. Ce guide couvre la syntaxe des requêtes XPath pour l’Observateur d’événements, les modèles de requête courants, les vues personnalisées et comment utiliser les mêmes requêtes avec les outils en ligne de commande et PowerShell.
Comprendre la structure XML de l’événement
Chaque événement dans le journal d’événements Windows est stocké en XML. Comprendre cette structure est la clé pour écrire des requêtes XPath efficaces. Voici un événement typique :
<Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
<System>
<Provider Name="Microsoft-Windows-Security-Auditing" Guid="{...}" />
<EventID>4624</EventID>
<Version>2</Version>
<Level>0</Level>
<Task>12544</Task>
<Opcode>0</Opcode>
<Keywords>0x8020000000000000</Keywords>
<TimeCreated SystemTime="2024-06-15T14:30:00.000000000Z" />
<EventRecordID>123456</EventRecordID>
<Channel>Security</Channel>
<Computer>DC01.corp.example.com</Computer>
<Security UserID="S-1-5-18" />
</System>
<EventData>
<Data Name="SubjectUserSid">S-1-5-18</Data>
<Data Name="SubjectUserName">DC01$</Data>
<Data Name="TargetUserName">john.doe</Data>
<Data Name="LogonType">10</Data>
<Data Name="IpAddress">192.168.1.100</Data>
</EventData>
</Event>
La requête XPath cible les éléments au sein de cette structure XML.
Saisir des requêtes XPath dans l’Observateur d’événements
Méthode 1 : Filtrer le journal actuel
- Ouvrez l’Observateur d’événements (
eventvwr.msc) - Sélectionnez un journal (par exemple, Security)
- Dans le volet Actions, cliquez sur Filtrer le journal actuel…
- Cliquez sur l’onglet XML
- Cochez Modifier la requête manuellement
- Saisissez votre requête XPath dans l’élément
<Select>:
<QueryList>
<Query Id="0" Path="Security">
<Select Path="Security">*[System[(EventID=4624)]]</Select>
</Query>
</QueryList>
Méthode 2 : Créer une vue personnalisée
Les vues personnalisées sont des filtres enregistrés qui persistent entre les sessions :
- Dans l’Observateur d’événements, cliquez sur Créer une vue personnalisée dans le volet Actions
- Dans l’onglet XML, cochez Modifier la requête manuellement
- Saisissez votre requête
- Donnez un nom à la vue et enregistrez-la
Les vues personnalisées apparaissent sous Vues personnalisées dans le volet gauche et exécutent la requête chaque fois que vous les sélectionnez.
Requêtes XPath courantes
Filtrer par ID d’événement
*[System[(EventID=4624)]]
Plusieurs ID d’événement :
*[System[(EventID=4624 or EventID=4625 or EventID=4634)]]
Plage d’ID d’événement :
*[System[(EventID >= 4624 and EventID <= 4634)]]
Filtrer par fournisseur (source)
*[System[Provider[@Name='Microsoft-Windows-Security-Auditing']]]
Filtrer par niveau (gravité)
| Niveau | Signification |
|---|---|
| 1 | Critique |
| 2 | Erreur |
| 3 | Avertissement |
| 4 | Information |
| 0 | LogAlways (Audit) |
*[System[(Level=1 or Level=2)]]
Cela filtre uniquement les événements critiques et d’erreur.
Filtrer par temps
Dernières 24 heures (86400000 millisecondes) :
*[System[TimeCreated[timediff(@SystemTime) <= 86400000]]]
Dernière heure (3600000 millisecondes) :
*[System[TimeCreated[timediff(@SystemTime) <= 3600000]]]
Plage de dates spécifique :
*[System[TimeCreated[@SystemTime>='2024-01-01T00:00:00.000Z' and @SystemTime<='2024-01-31T23:59:59.999Z']]]
Filtrer par nom d’ordinateur
*[System[Computer='DC01.corp.example.com']]
Filtrer par utilisateur (Security UserID)
*[System[Security[@UserID='S-1-5-21-1234567890-1234567890-1234567890-1001']]]
Filtrer par champs EventData
*[EventData[Data[@Name='TargetUserName']='john.doe']]
Filtrer les événements d’ouverture de session pour un utilisateur spécifique :
*[System[(EventID=4624)] and EventData[Data[@Name='TargetUserName']='john.doe']]
Filtrer par type d’ouverture de session (10 = Bureau à distance) :
*[System[(EventID=4624)] and EventData[Data[@Name='LogonType']='10']]
Combiner plusieurs critères
Événements d’ouverture de session de sécurité pour un utilisateur depuis une IP spécifique dans les dernières 24 heures :
*[System[(EventID=4624) and TimeCreated[timediff(@SystemTime) <= 86400000]] and EventData[Data[@Name='TargetUserName']='john.doe' and Data[@Name='IpAddress']='192.168.1.100']]
Toutes les erreurs et avertissements d’une source spécifique dans les 7 derniers jours :
*[System[Provider[@Name='Microsoft-Windows-GroupPolicy'] and (Level=2 or Level=3) and TimeCreated[timediff(@SystemTime) <= 604800000]]]
Exemples pratiques de requêtes
Trouver les tentatives d’ouverture de session échouées
*[System[(EventID=4625)]]
Tentatives d’ouverture de session échouées depuis une IP spécifique :
*[System[(EventID=4625)] and EventData[Data[@Name='IpAddress']='192.168.1.50']]
Trouver les verrouillages de compte
*[System[(EventID=4740)]]
Trouver les sessions Bureau à distance (RDP)
Événements d’ouverture de session via RDP (Type d’ouverture de session 10) :
*[System[(EventID=4624)] and EventData[Data[@Name='LogonType']='10']]
Trouver les installations de services
*[System[(EventID=7045)]]
Trouver le démarrage et l’arrêt du système
*[System[(EventID=6005 or EventID=6006 or EventID=6008 or EventID=6009)]]
Trouver les erreurs de traitement de stratégie de groupe
*[System[Provider[@Name='Microsoft-Windows-GroupPolicy'] and (Level=2)]]
Utiliser wevtutil en ligne de commande
La commande wevtutil vous permet d’exécuter des requêtes XPath depuis la ligne de commande :
# Query the Security log for Event ID 4624
wevtutil qe Security /q:"*[System[(EventID=4624)]]" /c:10 /f:text
# Export matching events to a file
wevtutil qe Security /q:"*[System[(EventID=4625)]]" /f:xml > failed-logons.xml
# Count matching events
wevtutil qe Security /q:"*[System[(EventID=4624)]]" /c:999999 /f:text | find /c "Event"
Paramètres :
qe— Interroger les événements/q:— La requête XPath/c:— Nombre maximum d’événements à retourner/f:— Format de sortie (text, xml ou RenderedXml)/rd:true— Lire dans l’ordre inverse (les plus récents en premier)
Interroger des ordinateurs distants
wevtutil qe Security /q:"*[System[(EventID=4625)]]" /r:DC01.corp.example.com /u:CORP\admin /p:*
PowerShell Get-WinEvent
PowerShell fournit l’interface la plus flexible pour les requêtes du journal d’événements.
Utiliser -FilterXPath
# Failed logon attempts in the last 24 hours
Get-WinEvent -LogName Security -FilterXPath "*[System[(EventID=4625) and TimeCreated[timediff(@SystemTime) <= 86400000]]]"
# RDP logon events
Get-WinEvent -LogName Security -FilterXPath "*[System[(EventID=4624)] and EventData[Data[@Name='LogonType']='10']]"
# Limit results
Get-WinEvent -LogName Security -FilterXPath "*[System[(EventID=4624)]]" -MaxEvents 50
Utiliser -FilterHashtable (Syntaxe plus simple)
Pour les requêtes courantes, -FilterHashtable est plus facile à écrire :
# Events by ID and time
Get-WinEvent -FilterHashtable @{
LogName = 'Security'
ID = 4625
StartTime = (Get-Date).AddDays(-7)
EndTime = Get-Date
}
# Multiple Event IDs
Get-WinEvent -FilterHashtable @{
LogName = 'System'
Level = 2 # Error
ID = 7034, 7031, 7023
}
# Events from a specific provider
Get-WinEvent -FilterHashtable @{
LogName = 'Application'
ProviderName = 'MSSQLSERVER'
Level = 2
}
Formatage et exportation des résultats
# Format as table
Get-WinEvent -FilterHashtable @{LogName='Security'; ID=4625} -MaxEvents 20 |
Select-Object TimeCreated, Id, Message |
Format-Table -AutoSize
# Export to CSV
Get-WinEvent -FilterHashtable @{LogName='Security'; ID=4625} |
Select-Object TimeCreated, Id,
@{N='User';E={$_.Properties[5].Value}},
@{N='Source';E={$_.Properties[19].Value}} |
Export-Csv -Path "C:\failed-logons.csv" -NoTypeInformation
# Query remote computers
Get-WinEvent -ComputerName "DC01" -FilterHashtable @{LogName='Security'; ID=4625}
Conseils pour construire des requêtes XPath
- Commencez avec le filtre de l’interface graphique — Utilisez la boîte de dialogue Filtrer le journal actuel avec les onglets de base d’abord, puis passez à l’onglet XML pour voir la requête générée.
- Utilisez l’onglet Détails de l’Observateur d’événements — Cliquez sur n’importe quel événement et passez à l’onglet Détails > Vue XML pour voir la structure XML exacte et les noms des champs.
- Testez de manière incrémentale — Construisez les requêtes en ajoutant un critère à la fois. Commencez par
*[System[(EventID=4624)]]et ajoutez des filtres étape par étape. - Attention aux problèmes d’espace de noms — L’implémentation XPath de l’Observateur d’événements ne nécessite pas de préfixes d’espace de noms, même si les événements utilisent l’espace de noms du schéma Microsoft.
- Performance — Les requêtes sur le journal de sécurité de serveurs très sollicités peuvent être lentes. Utilisez toujours des filtres de temps pour réduire la portée.
Résumé
Les requêtes XPath dans l’Observateur d’événements Windows fournissent un filtrage précis et puissant qui va bien au-delà du filtre de base de l’interface graphique. La syntaxe de requête cible la structure XML des événements, vous permettant de filtrer par ID d’événement, fournisseur, gravité, plage de temps, utilisateur, ordinateur et champs de données personnalisés de l’événement. Utilisez l’interface graphique de l’Observateur d’événements pour l’analyse interactive, wevtutil pour le scripting en ligne de commande et PowerShell Get-WinEvent pour l’automatisation et la génération de rapports. Commencez par examiner la structure XML d’un événement, puis construisez votre requête étape par étape.