Eenvoudig zoeken in Windows event logs op honderden servers met PowerShell

Bij het oplossen van problemen of het onderzoeken van mogelijke beveiligingsinbreuken is een Windows event log geweldige plek om te beginnen. Windows biedt een uitgebreide lijst met verschillende event logs gegroepeerd per provider, ieder met een soms duizelingwekkende aantal events erin. Met al deze gebeurtenissen die worden vastgelegd, is het moeilijk om erachter te komen wat er aan de hand is. Een manier om gebeurtenislogboeken op niet één maar honderden servers tegelijk te doorzoeken, is met PowerShell.

PowerShell heeft twee commands waarmee u event logs kunt opvragen met de naam Get-EventLog en Get-WinEvent. In dit artikel gaan we ons concentreren op Get-WinEvent omdat het alle soorten event logs ondersteunt en betere filtermogelijkheden heeft.

Het opvragen van gebeurtenissen vanaf servers is eenvoudig met Get-WinEvent. De cmdlet Get-WinEvent heeft een parameter met de naam ComputerName waarmee u een externe server kunt opgeven. We moeten ook de naam van het gebeurtenislogboek opgeven voor query's met de parameter LogName. U kunt hieronder zien dat de uitvoer is gegroepeerd door de provider.

We willen meestal niet alle gebeurtenissen in een bepaald logboek vinden, dus we hebben opties om die uitvoer te beperken. Ten eerste kunnen we de parameter MaxEvents gebruiken. Dit filtert niet de resultaten, maar beperkt alleen het aantal geretourneerde gebeurtenissen.

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

Om te bepalen wat ik zoek, is een manier om gebeurtenissen te filteren met Get-WinEvent door de parameter FilterHashTable te gebruiken. Met deze parameter kunt u een hashtabel opgeven als invoer met verschillende kenmerken waarop gebeurtenissen moeten worden gefilterd.

We kunnen bijvoorbeeld gebeurtenissen filteren op urgentie met behulp van de toets 'Level' in de parameter FilterHashTable. In het onderstaande geval retourneert deze query alleen kritieke en fouten van mijn SRV2-server.

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

Ik kan ook enkele andere veelvoorkomende event log query's uitvoeren door accountvergrendelingen te vinden waarvan ik weet dat ze een event id van 4740 genereren in de security log. Of ik zou kunnen filteren op de provider. Er zijn veel verschillende manieren waarop u gebeurtenislogboeken kunt filteren.

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

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

Nu ik een goed idee heb van hoe ik gebeurtenissen kan opvragen en filteren, kunnen we dit uitbreiden naar het uitvoeren van query's op meerdere computers. Hiervoor moet u de opdracht Get-WinEvent uitvoeren voor elke naam van de externe computer. We zullen voor elk een loop om al onze servers op te vragen.

Stel dat ik een lijst met servers in een tekstbestand heb en ik wil zoeken naar event logs voor alle servers. Om dat te doen, kan ik Get-Content gebruiken om het tekstbestand te lezen dat elke servernaam retourneert, waar ik die naam vervolgens kan doorgeven aan de computernaam parameter op Get-WinEvent. In het onderstaande voorbeeld wordt een query uitgevoerd op het systeemgebeurtenislogboek dat de eerste vijf gebeurtenissen retourneert op elke server die is gedefinieerd in het tekstbestand C:\servers.txt.

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


Dit retourneert de verwachte gebeurtenissen, maar u kunt niet zien van welke server het event afkomstig is. Om dit te verhelpen, kan ik ervoor zorgen dat de eigenschap MachineName wordt geretourneerd met alleen de eigenschappen die ik belangrijk vind. Misschien wil ik de gebeurtenis-id en de server zien naam. Ik kan de uitvoer van deze eigenschappen beperken met behulp van 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

Als u eenmaal in staat bent om het juiste filter voor een enkele computer te bedenken, kunt u het eenvoudig uitbreiden naar meerdere servers met een foreach lus. Zodra u dit doet, dan hoeft u alleen nog de uitvoer en het gebruik van Select-Object aan te pakken; u kunt elke specifieke eigenschap maken die u in uw eindrapport wilt zien.

Tags

Comments
Comments are disabled in preview mode.