Un guide complet pour utiliser l’applet de commande Get-WinEvent de PowerShell

Windows dispose de plusieurs journaux d’événements différents, mais comment les récupérer rapidement ? La cmdlet Get-WinEvent peut récupérer les journaux d’événements Windows classiques tels que les journaux Système et Application, les journaux générés par la technologie de journalisation des événements Windows, et même les journaux de suivi des événements pour Windows (ETW) !

Dans cet article, apprenez comment exploiter Get-WinEvent pour récupérer et filtrer les événements à partir des journaux d’événements !

Prérequis

Pour suivre, vous avez seulement besoin d’une version actuelle de Windows 10 et de PowerShell 5.1 et supérieur. Cet article utilise Windows 10 et PowerShell 7.1.

Liste des journaux disponibles avec Get-WinEvent

Il est difficile de savoir quels entrées de journal vous pourriez avoir besoin sans connaître tous les journaux disponibles. Avec Get-WinEvent, vous pouvez lister tous les journaux disponibles rapidement en utilisant le paramètre -ListLog. La valeur * du paramètre indique à Get-WinEvent de lister tous les journaux sans filtre. Comme illustré ci-dessous, tous les journaux sont récupérés, mais seulement un ensemble limité de propriétés est affiché en utilisant le cmdlet Select-Object.

Get-WinEvent -ListLog * | Select-Object LogName, RecordCount, IsClassicLog, IsEnabled, LogMode, LogType | Format-Table -AutoSize

Tous les journaux ne sont pas activés par défaut. Vous devrez peut-être ouvrir l’Observateur d’événements, localiser le journal, et cliquer avec le bouton droit pour Activer le journal avant que les événements ne s’affichent.

Listing all available event logs.

Tous les journaux après Windows Vista sont enregistrés en tant que fichiers *.evtx au lieu du format plus ancien *.evt. La propriété IsClassicLog indique si les événements du journal sont définis dans un fichier Fichier de message, format *.mc, ou dans un manifeste, format *.xml.

Une propriété intéressante est LogMode, que vous avez peut-être remarqué est généralement définie sur Circular.

  • Circular – Écrase la plus ancienne entrée de journal une fois pleine.
  • Retain – Conserve tous les événements jusqu’à ce que le journal soit plein et cesse l’enregistrement jusqu’à ce qu’il soit libéré.
  • AutoBackup – Sauvegarde automatique et archivage des journaux d’événements une fois pleins.
Highlighting the LogMode property.

Enfin, en regardant la propriété LogType, il existe plusieurs types de journaux. Cette propriété sert davantage de propriété de catégorisation, mais elle informe généralement sur la façon dont le journal est utilisé et les types d’événements affichés.

  • Administratif – Principalement destiné aux utilisateurs finaux et aux utilisateurs administratifs.
  • Analytique – Généralement, un journal à volume élevé, destiné à décrire les opérations du programme.
  • Débogage – Destiné aux développeurs ayant besoin d’une plongée approfondie dans les internes du programme.
  • Opérationnel – Un événement qui se produit pendant le fonctionnement et est utile pour diagnostiquer les occurrences et déclencher des processus.
Highlighting the LogType property.

Listing des fournisseurs de journaux d’événements

Maintenant que vous avez une compréhension solide des différents journaux et de leurs propriétés, il est utile de comprendre ce qu’est un Fournisseur de journaux d’événements. Un fournisseur, dans la terminologie des journaux d’événements, est une source d’événements.

Les fournisseurs de journaux d’événements sont uniques et liés à chaque journal, tels que les journaux d’application ou de système, et serviront de source nommée où un événement se produit.

Peut-être souhaitez-vous trouver des problèmes lors du filtrage des journaux, et vous pourriez être intéressé uniquement par les problèmes d’un fournisseur particulier. Pour répertorier les fournisseurs disponibles, utilisez le paramètre -ListProvider. Comme indiqué ci-dessous, le * répertorie tous les fournisseurs disponibles et les journaux auxquels les fournisseurs sont liés, tels que Windows PowerShell ou System.

Get-WinEvent -ListProvider * | Format-Table -Autosize
Listing event log providers.

Peut-être souhaitez-vous uniquement répertorier les fournisseurs disponibles pour un journal particulier, tel que System. Pour ce faire, vous pouvez filtrer les événements en utilisant la commande Where-Object en utilisant les valeurs de la propriété LogLinks. La propriété LogLinks affiche les journaux d’événements liés sous forme de liste.

Pour filtrer les journaux demandés avec Where-Object, utilisez l’opérateur de comparaison -In pour filtrer uniquement les événements avec System dans la valeur de la propriété LogLinks. Enfin, l’utilisation de Format-Table -AutoSize facilite la lecture de la sortie, comme indiqué ci-dessous.

Get-WinEvent -ListProvider * | Where-Object { 'System' -In ($_ | Select-Object -ExpandProperty Loglinks | Select-Object -ExpandProperty Logname) } | Format-Table -AutoSize
Filtering event log providers to a specific log.

Récupération des journaux d’événements classiques avec Get-WinEvent

La première étape pour résoudre un problème Windows est de récupérer le journal d’événements de l’Application ou du Système, qui sont des journaux d’événements classiques. Dans l’exemple ci-dessous, vous récupérerez les 100 premiers événements à l’aide du paramètre -MaxEvents du journal d’événements de l’Application.

Pour faciliter la lecture des résultats, sélectionnez uniquement les propriétés nécessaires à une lecture plus facile des entrées. Sinon, les entrées sont regroupées par le nom du fournisseur, ce qui rend l’analyse de la liste des résultats difficile.

Get-WinEvent -LogName 'Application' -MaxEvents 100 | Select-Object TimeCreated, ID, ProviderName, LevelDisplayName, Message | Format-Table -AutoSize
Returning events from the Application log.

Trouver les événements Windows modernes avec Get-WinEvent

Maintenant que vous avez récupéré des événements du journal d’application classique, que diriez-vous des résultats d’un journal d’événements Windows plus récent, tel que Microsoft-Windows-WindowsUpdateClient/Operational?

Contrairement à un journal d’événements classique, tel que System, le journal Microsoft-Windows-WindowsUpdateClient/Operational est un journal moderne, avec Get-WinEvent fonctionnant de la même manière que ci-dessous.

Get-WinEvent -LogName 'Microsoft-Windows-WindowsUpdateClient/Operational' -MaxEvents 10 | Select-Object TimeCreated, ID, ProviderName, LevelDisplayName, Message | Format-Table -AutoSize
Returning Windows Event Log records.

Et obtenir seulement les événements les plus anciens ? Bien que vous puissiez inverser l’ordre des résultats avec Sort-Object, utilisez le paramètre -Oldest pour récupérer les 10 premiers événements, comme indiqué ci-dessous.

La commande Get-WinEvent effectue le filtrage pour vous au lieu de renvoyer tous les résultats et de les trier, ce qui est généralement plus lent.

Get-WinEvent -LogName 'Microsoft-Windows-WindowsUpdateClient/Operational' -Oldest -MaxEvents 10 | Select-Object TimeCreated, ID, ProviderName, LevelDisplayName, Message | Format-Table -AutoSize
Returning only the oldest events in a Windows Event Log.

Récupération des fichiers de traçage des événements Windows (ETW) avec Get-WinEvent

Peut-être avez-vous un fichier exporté *.evtx d’un autre ordinateur ou avez-vous sauvegardé un journal existant. Vous pouvez lire ces journaux avec la cmdlet Get-WinEvent. Si vous devez conserver des journaux à des fins d’audit, Get-WinEvent est un excellent moyen d’interroger rapidement ces journaux avec des cmdlets standard dans des scripts.

Pour démontrer la récupération des entrées de journal à partir d’un fichier *.evtx, vous avez besoin d’un fichier journal exporté.

1. Ouvrez le Visualiseur d’événements et naviguez jusqu’à un journal. Dans cet exemple, le journal Applications et Services → Windows PowerShell.

Navigate to a Windows Event Viewer log.

2. Ensuite, cliquez sur l’élément de menu Enregistrer tous les événements sous… dans le volet Actions.

Save the log file.

3. Enregistrez le fichier dans un emplacement de disque pour qu’il soit récupéré par la commande Get-WinEvent.

Choose a location to save the log file.

Maintenant que vous avez exporté un fichier journal, passez l’emplacement du fichier journal via le paramètre -Path pour lire les événements. Dans l’exemple ci-dessous, le journal Windows PowerShell est exporté pour une consommation ultérieure.

Get-WinEvent -Path 'C:\Articles\WindowsPowerShell.evtx' -MaxEvents 10 | Select-Object TimeCreated, ID, ProviderName, LevelDisplayName, Message | Format-Table -AutoSize
Retrieving specific events from the exported event file.

Filtrer les journaux d’événements Windows à l’aide de Get-WinEvent

Bien que vous puissiez filtrer les journaux avec la commande standard Where-Object, Get-WinEvent offre des filtres intégrés. En retournant tous les résultats puis en filtrant, plus de travail est effectué que nécessaire. Au lieu de cela, vous devriez toujours essayer de filtrer à la source autant que possible.

La commande Get-WinEvent fournit trois paramètres pour vous aider à filtrer à travers des milliers d’événements appelés -FilterHashTable, -FilterXPath, et -FilterXML. Chaque paramètre accomplit généralement la même tâche mais de manière différente.

Filtrage des journaux d’événements avec FilterHashTable

Le paramètre -FilterHashTable filtre le contenu en fonction des propriétés correspondantes, telles que LogName. Au lieu d’utiliser le paramètre -LogName pour filtrer par un journal spécifique, vous pouvez plutôt utiliser une table de hachage, telle que @{'LogName' = 'Application'}, qui correspondrait à la propriété d’événement LogName.

L’exemple ci-dessous fournit une table de hachage au paramètre -FilterHashTable qui recherche uniquement le journal Application et avec une heure de début correspondant à tous les événements après minuit du jour en cours, Get-WinEvent retourne rapidement des résultats.

Get-WinEvent -FilterHashTable @{'LogName' = 'Application'; 'StartTime' = (Get-Date -Hour 0 -Minute 0 -Second 0)} | Select-Object TimeCreated, ID, ProviderName, LevelDisplayName, Message | Format-Table -AutoSize
Filtering events with the FilterHashTable parameter.

Comparez les vitesses de filtrage de la même commande ci-dessus à celle filtrée via Where-Object plutôt que via le paramètre -FilterHashTable sur le pipeline. Comme vous pouvez le voir, la commande utilisant Where-Object est beaucoup plus lente que celle utilisant le paramètre -FilterHashTable.

Comparing filtering with FilterHashTable and Where-Object.

Filtrage des journaux d’événements à l’aide du paramètre FilterXPath

Les entrées de journal d’événements sont stockées sous forme de fichiers XML, et donc vous pouvez utiliser le langage XPath, un langage de requête XML, pour filtrer les entrées de journal. En effectuant la même commande utilisée ci-dessus et en la traduisant en XPath, vous pouvez obtenir les mêmes résultats.

Pour créer une requête XPath, utilisez la capacité de filtrage dans l’Observateur d’événements Windows, comme illustré ci-dessous.

1. Ouvrez le Observateur d’événements et accédez à un journal, tel que le journal Windows Logs → Application.

Opening the Windows Event Viewer.

2. Ensuite, cliquez sur le lien Filtrer le journal actuel dans le volet de droite.

Choosing to Filter the Current Log.

3. Entrez les paramètres que vous souhaitez utiliser pour filtrer le journal.

Creating a filter for the current log.

4. Cliquez sur l’onglet XML et copiez la section contenue dans la balise Sélectionner.

Copying the XPath command.

5. Maintenant, copiez et collez le contenu copié avec le paramètre -FilterXPath. Vous pouvez maintenant voir ci-dessous qu’en utilisant la syntaxe XPath trouvée à partir de l’observateur de journal d’événements, vous pouvez construire une requête pour filtrer uniquement les informations nécessaires.

Get-WinEvent -LogName 'Application' -FilterXPath "*[System[(Level=1  or Level=3)]]" | Select-Object TimeCreated, ID, ProviderName, LevelDisplayName, Message | Format-Table -AutoSize
Demonstrating the use of the FilterXPath parameter.

Plonger dans la façon de créer des requêtes XPath est hors de portée pour cet article, mais le format de base est indiqué ci-dessous. Lorsque le paramètre FilterXPath filtre une date, vous verrez une grande différence : vous devez utiliser un format de date plus spécifique, yyyy-MM-ddTHH:mm:ss.fffZ, que la date doit être renvoyée en UTC, ce qui est indiqué par le commutateur -AsUTC.

Get-WinEvent -LogName 'Application' -FilterXPath "*[System[TimeCreated[@SystemTime >= '$(Get-Date -Hour 0 -Minute 0 -Second 0 -Millisecond 0 -Format "yyyy-MM-ddTHH:mm:ss.fffZ" -AsUTC)']]]" | Select-Object TimeCreated, ID, ProviderName, LevelDisplayName, Message | Format-Table -AutoSize
Filtering events using XPath.

Filtrer les résultats du journal d’événements avec FilterXML

Enfin, le dernier paramètre de filtrage disponible est le paramètre -FilterXML. Contrairement aux paramètres -FilterXPath et -FilterHashTable, ce paramètre prend XML qui est ensuite utilisé pour filtrer les événements. Le paramètre -FilterXML permet des règles plus complexes, et comme le montre l’exemple ci-dessous, peut reproduire les exemples de filtrage précédents.

Comme indiqué dans l’exemple précédent, vous pouvez récupérer une requête pré-formatée à partir de la capacité Observateur d’événements → Filtrer le journal actuel. Au lieu de sélectionner uniquement le contenu dans le nœud Sélectionner, vous utiliserez l’intégralité de la requête. Aucun filtre réel n’est choisi, comme indiqué par le * dans le nœud Sélectionner. Cela fournira la balise générale pour l’exemple suivant.

Selecting the entire XML query from Filter Current Log in the Event Viewer.

Au lieu de créer une commande d’une seule ligne, séparez d’abord la requête XML et attribuez la balise à une variable, $Query, dans l’exemple ci-dessous. Attribuer la requête à une variable permet une meilleure facilité d’utilisation et de lisibilité. Ensuite, transmettez la variable $Query au paramètre -FilterXML de Get-WinEvent.

Comme indiqué ci-dessous, vous voyez les résultats de la requête plus complexe renvoyant tous les événements de cette journée et stockés dans le journal Application.

$Query = "<QueryList>
  <Query Id='0' Path='Application'>
    <Select Path='Application'>*[System[TimeCreated[@SystemTime >= '$(Get-Date -Hour 0 -Minute 0 -Second 0 -Millisecond 0 -Format "yyyy-MM-ddTHH:mm:ss.fffZ" -AsUTC)']]]</Select>
  </Query>
</QueryList>"

Get-WinEvent -FilterXML $Query | Select-Object TimeCreated, ID, ProviderName, LevelDisplayName, Message | Format-Table -AutoSize
Showing how FilterXML works.

Conclusion

La cmdlet Get-WinEvent facilite la tâche de requête de multiples sources de journaux d’événements avec de puissantes capacités de filtrage. De l’audit à la résolution de problèmes, la cmdlet Get-WinEvent est un ajout crucial à la trousse à outils de tout administrateur système !

Source:
https://adamtheautomator.com/get-winevent/