<img height="1" width="1" style="display:none" src="https://www.facebook.com/tr?id=1678611822423757&amp;ev=PageView&amp;noscript=1">
Defrag This

| Read. Reflect. Reboot.

Comment rechercher facilement les journaux d'événements Windows sur des centaines de serveurs avec PowerShell

Adam Bertram| August 08 2019

| monitoring, PowerShell

Depositphotos_63786223_m-2015

En matière de résolution de problèmes ou de recherche des failles de sécurité potentielles, journal des événements Windows est un très bon début. Windows fournit une liste complète de divers journaux d'événements regroupés par fournisseur, qui comportent parfois un nombre incroyable d'événements enregistrés. Cette multitude d'enregistrements rend difficile l'identification des événements. PowerShell permet de rechercher des journaux d'événements non pas sur un, mais sur des centaines de serveurs à la fois.

PowerShell est doté de deux commandes principales qui permettent d'interroger les journaux d'événements Get-EventLog et Get-WinEvent. Dans cet article, nous allons faire le point sur Get-WinEvent, qui prend en charge tous les types de journaux d'événements et propose de meilleures capacités de filtrage.

L'interrogation des événements à partir des serveurs est facile avec Get-WinEvent. L'applet de commande Get-WinEvent est dotée d'un paramètre appelé ComputerName qui vous permet de spécifier un serveur distant. Nous devrons également fournir le nom du journal d'événements à interroger en utilisant le paramètre LogName. Vous pouvez voir ci-dessous les résultats regroupés par fournisseur.

Généralement, il n'est pas utile d'identifier tous les événements d'un journal spécifique ; nous disposons donc d'options pour limiter le volume des résultats générés. Commençons par utiliser le paramètre MaxEvents. Il ne filtre pas les résultats mais limite simplement le nombre d'événements renvoyés.

PS> Get-WinEvent -ComputerName SRV1 -LogName System -MaxEvents 1

Pour restreindre le champ de ma recherche et filtrer les événements avec Get-WinEvent, je peux utiliser le paramètre FilterHashTable. Ce paramètre permet de fournir en entrée une table de hachage spécifiant différents attributs utilisés pour filtrer les événements.

Par exemple, nous pourrions filtrer les événements par niveau de gravité en utilisant la clé Level dans le paramètre FilterHashTable. Dans le cas ci-dessous, cette requête ne retournerait que les erreurs critiques et celles provenant de mon serveur SRV2.

Get-WinEvent -ComputerName SRV1 -FilterHashtable @{
    LogName = 'System'
    Level = 1,2 # 1 Critical, 2 Error, 3 Warning, 4 Information
}

Je peux également effectuer d'autres requêtes courantes dans le journal des événements en trouvant des verrouillages de compte qui, je le sais, génèrent un ID d'événement 4740 dans le journal de sécurité. Ou bien je pourrais filtrer sur le fournisseur. Vous pouvez filtrer les journaux d'événements de nombreuses manières différentes.

Get-WinEvent -FilterHashtable @{
    LogName = 'Security'
    ID = 4740
}

Get-WinEvent -FilterHashtable @{
    LogName = 'System'
    ProviderName = 'Microsoft-Windows-GroupPolicy'
}

Maintenant que je sais précisément comment interroger les événements et les filtrer, passons au degré supérieur en exécutant des requêtes sur plusieurs ordinateurs. Pour ce faire, vous devrez exécuter la commande Get-WinEvent pour chaque nom d'ordinateur distant. Nous devrons créer une boucle ForEach pour interroger tous nos serveurs.

Supposons que j'ai une liste de serveurs dans un fichier texte et que je souhaite rechercher des journaux d'événements sur tous les serveurs. Pour ce faire, je peux utiliser Get-Content pour lire le fichier texte qui retournera chaque nom de serveur. Je pourrai alors transmettre ce nom au paramètre ComputerName sur Get-WinEvent. Dans l'exemple ci-dessous, le journal d'événements System est interrogé et les cinq premiers événements sur chaque serveur défini dans le fichier texte C:\servers.txt sont renvoyés.

$servers = Get-Content -Path C:\servers.txt
foreach ($server in $servers) {
    Get-WinEvent -ComputerName $server -MaxEvents 5 -FilterHashtable @{
        LogName = 'System'
    }
}

Les événements attendus sont renvoyés, mais vous ne pouvez pas savoir de quel serveur provient l'événement. Pour remédier à cela, je peux m'assurer que la propriété MachineName est retournée avec seulement les propriétés qui m'intéressent. Je souhaite peut-être afficher l'ID de l'événement et le nom du serveur. Je peux limiter la sortie au moyen de ces propriétés en utilisant Select-Object.

$servers = Get-Content -Path C:\servers.txt
foreach ($server in $servers) {
    Get-WinEvent -ComputerName $server -MaxEvents 5 -FilterHashtable @{
        LogName = 'System'
    } | Select-Object -Property ID, MachineName
}

   Id   MachineName
   --   -----------
 7036   SRV1.techsnips.local
10016   SRV2.techsnips.local
 7036   SRV3.techsnips.local

Vous constatez qu'une fois que vous êtes en mesure de trouver le filtre approprié pour un seul ordinateur, il est facile de l'étendre à plusieurs serveurs avec une boucle ForEach. Une fois le processus exécuté, il ne vous reste qu'à gérer la sortie et l'utilisation de Select-Object ; vous pouvez créer n'importe quelle propriété que vous souhaitez voir apparaître dans votre rapport final.

Surveillance de réseau proactive – testez WhatsUp Gold gratuitement >>

Topics: monitoring, PowerShell

Leave a Reply

Your email address will not be published. Required fields are marked *

THIS POST WAS WRITTEN BY Adam Bertram

Adam Bertram is a 20-year veteran of IT. He’s currently an automation engineer, blogger, independent consultant, freelance writer, author, and trainer. Adam focuses on DevOps, system management, and automation technologies as well as various cloud platforms. He is a Microsoft Cloud and Datacenter Management MVP and efficiency nerd that enjoys teaching others a better way to leverage automation.

Free Trials

Getting started has never been easier. Download a trial today.

Download Free Trials

Contact Us

Let us know how we can help you. Focus on what matters. 

Send us a note

Subscribe to our Blog

Let’s stay in touch! Register to receive our blog updates.