Een Compleet Gids voor het Gebruik van de Get-WinEvent PowerShell Cmdlet

Windows heeft verschillende gebeurtenislogs, maar hoe kunt u ze snel ophalen? De cmdlet Get-WinEvent kan klassieke Windows-gebeurtenislogs ophalen, zoals de systeem- en toepassingslogs, logs gegenereerd door Windows Event Log-technologie en zelfs Event Tracing for Windows (ETW)-logs!

In dit artikel leert u hoe u Get-WinEvent kunt gebruiken om gebeurtenissen uit gebeurtenislogs op te halen en te filteren!

Vereisten

Om mee te doen, heeft u alleen een huidige versie van Windows 10 en PowerShell 5.1 of hoger nodig. Dit artikel maakt gebruik van Windows 10 en PowerShell 7.1.

Lijst van beschikbare logs met Get-WinEvent

Het is moeilijk om te weten welke logboekvermeldingen u nodig heeft zonder alle beschikbare logs te kennen. Met Get-WinEvent kunt u snel alle beschikbare logs weergeven met behulp van de parameter -ListLog. De parameterwaarde * vertelt Get-WinEvent om alle logs op te halen zonder te filteren. Zoals hieronder wordt weergegeven, worden alle logs opgehaald, maar worden slechts een beperkt aantal eigenschappen weergegeven met behulp van de Select-Object-cmdlet.

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

Niet alle logs zijn standaard ingeschakeld. U moet mogelijk Logboeken bekijken openen, het logboek opzoeken en met de rechtermuisknop klikken om het logboek in te schakelen voordat gebeurtenissen worden weergegeven.

Listing all available event logs.

Alle logboeken na Windows Vista worden opgeslagen als *.evtx bestanden in plaats van het oudere *.evt formaat. De eigenschap IsClassicLog geeft aan of de logboekgebeurtenissen worden gedefinieerd in een berichtbestand, *.mc formaat of in een manifest, *.xml formaat.

Een interessante eigenschap is de LogMode, die je waarschijnlijk hebt opgemerkt dat deze meestal is ingesteld op Circular.

  • Circular – Overschrijf de oudste logboekvermelding zodra deze vol is.
  • Retain – Bewaar alle gebeurtenissen totdat het logboek vol is en stop met loggen totdat er ruimte vrijkomt.
  • AutoBackup – Maak automatisch een back-up en archiveer logboeken zodra deze vol zijn.
Highlighting the LogMode property.

Tenslotte, bij het bekijken van de eigenschap LogType, zijn er verschillende soorten logboeken. Deze eigenschap dient meer als een categorisatie-eigenschap, maar informeert meestal over hoe het logboek wordt gebruikt en welke soorten gebeurtenissen worden weergegeven.

  • Administratief – Primair bedoeld voor eindgebruikers en beheerders.
  • Analytisch – Meestal een log met een hoog volume, bedoeld om programmabewerkingen te beschrijven.
  • Debug – Bedoeld voor ontwikkelaars die diep in de interne werking van het programma willen duiken.
  • Operationeel – Een gebeurtenis die tijdens de werking optreedt en nuttig is om gebeurtenissen te diagnosticeren en processen te activeren.
Highlighting the LogType property.

Evenementlogboekproviders vermelden

Nu je een goed begrip hebt van de verschillende logs en hun eigenschappen, is het handig om te begrijpen wat een Evenementlogboekprovider is. Een provider is in de terminologie van het evenementenlogboek een bron van een gebeurtenis.

Evenementlogboekproviders zijn uniek en gekoppeld aan elk logboek, zoals toepassings- of systeemlogs, en dienen als de benoemde bron waar een gebeurtenis vandaan komt.

Misschien wilt u problemen vinden bij het filteren van logs, en mogelijk bent u alleen geïnteresseerd in problemen van een bepaalde provider. Gebruik de parameter -ListProvider om weer te geven welke providers beschikbaar zijn. Zoals hieronder weergegeven, geeft * alle beschikbare providers weer en aan welke logs de providers zijn gekoppeld, zoals Windows PowerShell of Systeem.

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

Misschien wil je alleen de beschikbare providers voor een specifiek logboek weergeven, zoals System. Dit kan worden bereikt door gebeurtenissen te filteren met behulp van het Where-Object-commando met waarden van de LogLinks-eigenschap. De LogLinks-eigenschap toont de gekoppelde gebeurtenislogboeken als een lijst.

Om de gevraagde logboeken met Where-Object te filteren, gebruik je de -In-vergelijkingsoperator om alleen die gebeurtenissen te filteren waarin System voorkomt in de waarde van de LogLinks-eigenschap. Ten slotte maakt het gebruik van Format-Table -AutoSize het lezen van de uitvoer eenvoudiger, zoals hieronder getoond.

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.

Het ophalen van klassieke gebeurtenislogboeken met Get-WinEvent

De eerste stap bij het oplossen van een Windows-probleem is het ophalen van de toepassings- of systeemlogboek, wat toevallig klassieke gebeurtenislogboeken zijn. In het onderstaande voorbeeld haal je de eerste 100 gebeurtenissen op met behulp van de -MaxEvents-parameter van het toepassingsgebeurtenislogboek.

Om het lezen van de resultaten eenvoudiger te maken, selecteer je alleen de benodigde eigenschappen om de vermeldingen gemakkelijker te lezen. Anders worden de vermeldingen gegroepeerd op naam van de provider, wat het parsen van de lijst met resultaten moeilijk maakt.

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

Het vinden van moderne Windows-gebeurtenissen met Get-WinEvent

Nu je gebeurtenissen hebt opgehaald uit het klassieke toepassingslogboek, wat dacht je van resultaten uit een nieuwer Windows Event-logboek, zoals Microsoft-Windows-WindowsUpdateClient/Operational?

In tegenstelling tot een klassiek gebeurtenislogboek, zoals System, is Microsoft-Windows-WindowsUpdateClient/Operational een modern logboek, waarbij Get-WinEvent hetzelfde werkt als hieronder.

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

Wat dacht je van het krijgen van alleen de oudste gebeurtenissen? Hoewel je de resultaten in omgekeerde volgorde zou kunnen zetten met Sort-Object, gebruik de -Oldest parameter om de eerste 10 gebeurtenissen op te halen, zoals hieronder getoond.

De Get-WinEvent-opdracht doet het filteren voor jou in plaats van alle resultaten terug te geven en te sorteren, wat meestal trager is.

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.

Het ophalen van Event Tracing for Windows (ETW) -bestanden met Get-WinEvent

Misschien heb je een geëxporteerd *.evtx-bestand van een andere computer of heb je een bestaand logboek geback-upt. Je kunt die logs lezen met de Get-WinEvent-cmdlet. Als je logs moet bewaren voor auditdoeleinden, is Get-WinEvent een geweldige manier om die logs snel te doorzoeken met standaard-cmdlets binnen scripts.

Om logvermeldingen op te halen uit een *.evtx-bestand, hebt u een geëxporteerd logbestand nodig.

1. Open de Gebeurtenislogboekweergave en ga naar een logboek. In dit voorbeeld het Toepassings- en serviceslogboeken → Windows PowerShell-logboek.

Navigate to a Windows Event Viewer log.

2. Klik vervolgens op het menu-item Alle gebeurtenissen opslaan als… in het Acties-deelvenster.

Save the log file.

3. Sla het bestand op op een schijflocatie die later door het Get-WinEvent-commando kan worden opgehaald.

Choose a location to save the log file.

Nu u een logbestand hebt geëxporteerd, geeft u de locatie van het logbestand door via de parameter -Path om de gebeurtenissen te lezen. In het onderstaande voorbeeld wordt het Windows PowerShell-logboek geëxporteerd voor latere consumptie.

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.

Filteren van Windows Event Logs met Get-WinEvent

Hoewel u logs kunt filteren met de standaard Where-Object-cmdlet, biedt Get-WinEvent ingebouwde filters. Door alle resultaten terug te geven en vervolgens te filteren, wordt meer werk verricht dan nodig is. In plaats daarvan moet u altijd proberen zoveel mogelijk bij de bron te filteren.

De Get-WinEvent-cmdlet biedt drie parameters om u te helpen door duizenden gebeurtenissen te filteren, genaamd -FilterHashTable, -FilterXPath en -FilterXML. Elke parameter voert over het algemeen dezelfde taak uit, maar op een andere manier.

Filteren van gebeurtenislogboeken met FilterHashTable

De parameter -FilterHashTable filtert inhoud op basis van de overeenkomende eigenschappen, zoals LogName. In plaats van de parameter -LogName te gebruiken om te filteren op een specifiek logboek, kunt u in plaats daarvan een hash-tabel gebruiken, zoals @{'LogName' = 'Application'}, wat overeenkomt met de eigenschap LogName van het evenement.

Het onderstaande voorbeeld geeft een hash-tabel aan de parameter -FilterHashTable die alleen naar het toepassingslogboek zoekt en met een starttijd die alle gebeurtenissen na middernacht van de huidige dag omvat, retourneert Get-WinEvent snel resultaten.

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.

Vergelijk de filteringsnelheden van dezelfde opdracht hierboven met een gefilterde van via Where-Object in plaats van via de parameter -FilterHashTable op de pipeline. Zoals je kunt zien, is de opdracht die Where-Object gebruikt veel langzamer dan degene die de parameter -FilterHashTable gebruikt.

Comparing filtering with FilterHashTable and Where-Object.

Filteren van gebeurtenislogboeken met behulp van de parameter FilterXPath

Gebeurtenislogboekvermeldingen worden opgeslagen als XML-bestanden, en daarom kunt u de taal XPath, een XML-querytaal, gebruiken om door de logboekvermeldingen te filteren. Door dezelfde opdracht te gebruiken als hierboven en te vertalen naar XPath, kunt u dezelfde resultaten bereiken.

Om een XPath-query te maken, gebruikt u de filtermogelijkheid in de Windows Event Viewer, zoals hieronder wordt weergegeven.

1. Open de Event Viewer en navigeer naar een logboek, zoals het Windows Logs → Application logboek.

Opening the Windows Event Viewer.

2. Klik vervolgens op de koppeling Filter Huidige Logboek in het rechtervenster.

Choosing to Filter the Current Log.

3. Voer de parameters in waarmee u het logboek wilt filteren.

Creating a filter for the current log.

4. Klik op het XML-tabblad en kopieer het gedeelte binnen de Select-tag.

Copying the XPath command.

5. Kopieer en plak nu de gekopieerde inhoud met de parameter -FilterXPath. U kunt nu hieronder zien dat u met behulp van de XPath-syntaxis die is gevonden in de gebeurtenislogboekweergave, een query kunt maken om alleen de benodigde informatie te filteren.

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.

Dieper ingaan op het maken van XPath-query’s valt buiten het bestek van dit artikel, maar het basisformaat wordt hieronder weergegeven. Wanneer de parameter FilterXPath een datum filtert, ziet u één groot verschil: u moet een specifiekere datumnotatie gebruiken, jjjj-MM-ddTHH:mm:ss.fffZ, waarbij de datum in UTC moet worden weergegeven, wat wordt aangegeven door de schakelaar -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.

Resultaten van het filteren van het gebeurtenislogboek met FilterXML

Tenslotte is de laatste beschikbare filterparameter de parameter -FilterXML. In tegenstelling tot de parameters -FilterXPath en -FilterHashTable neemt deze parameter XML aan die vervolgens wordt gebruikt om de gebeurtenissen te filteren. De parameter -FilterXML maakt meer complexe regels mogelijk en kan, zoals hieronder wordt getoond, de vorige filtervoorbeelden repliceren.

Zoals getoond in het vorige voorbeeld, kun je een vooraf opgemaakte query ophalen uit de mogelijkheid Event Viewer → Filter Current Log. In plaats van alleen de inhoud in de Select-knoop te selecteren, gebruik je de volledige query. Er zijn geen daadwerkelijke filters gekozen, zoals opgemerkt door het * in de Select-knoop. Dit zal de algemene opmaak bieden voor het volgende voorbeeld.

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

In plaats van een éénregelige opdracht te maken, scheid eerst de XML-query en wijs de opmaak toe aan een variabele, $Query, in het onderstaande voorbeeld. Het toewijzen van de query aan een variabele zorgt voor een beter gebruiksgemak en leesbaarheid. Geef vervolgens de variabele $Query door aan de -FilterXML-parameter van Get-WinEvent.

Zoals hieronder getoond, zie je de resultaten van de complexere query die alle gebeurtenissen van die dag retourneert en opgeslagen is in het logboek 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.

Conclusie

De cmdlet Get-WinEvent maakt het eenvoudig om meerdere gebeurtenislogboekbronnen te bevragen met krachtige filtermogelijkheden. Van auditing tot probleemoplossing is de cmdlet Get-WinEvent een cruciale toevoeging aan de toolkit van elke systeembeheerder!

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