Una guida completa all’uso del cmdlet PowerShell Get-WinEvent

Windows ha diversi registri eventi diversi, ma come si fa a recuperarli rapidamente? Il cmdlet Get-WinEvent può recuperare i registri eventi classici di Windows come i registri di sistema e di applicazione, i registri generati dalla tecnologia di registrazione eventi di Windows e persino i registri di Event Tracing for Windows (ETW)!

In questo articolo, imparerai come sfruttare Get-WinEvent per recuperare e filtrare gli eventi dai registri eventi!

Prerequisiti

Per seguire l’esempio, hai solo bisogno di una versione aggiornata di Windows 10 e di PowerShell 5.1 e superiori. Questo articolo utilizza Windows 10 e PowerShell 7.1.

Elenco dei registri disponibili con Get-WinEvent

È difficile sapere quali voci di registro potresti avere bisogno senza conoscere tutti i registri disponibili. Con Get-WinEvent, puoi elencare tutti i registri disponibili rapidamente utilizzando il parametro -ListLog. Il valore * del parametro dice a Get-WinEvent di elencare tutti i registri senza filtri. Come mostrato di seguito, vengono recuperati tutti i registri, ma viene mostrato solo un insieme limitato di proprietà utilizzando il cmdlet Select-Object.

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

Non tutti i registri sono abilitati per impostazione predefinita. Potrebbe essere necessario aprire Visualizzatore eventi, individuare il registro e fare clic con il pulsante destro del mouse per abilitare il registro prima che gli eventi vengano visualizzati.

Listing all available event logs.

Tutti i log successivi a Windows Vista vengono salvati come file *.evtx anziché nel formato più vecchio *.evt. La proprietà IsClassicLog indica se gli eventi di log sono definiti in un formato File dei messaggi, *.mc, o in un formato manifesto, *.xml.

Una proprietà interessante è LogMode, che probabilmente avrai notato è solitamente impostato su Circular.

  • Circular – Sovrascrive la voce di log più vecchia una volta che è piena.
  • Retain – Conserva tutti gli eventi fino a quando il log è pieno e smette di registrare fino a quando non viene liberato spazio.
  • AutoBackup – Esegue automaticamente il backup e l’archiviazione dei log degli eventi una volta che sono pieni.
Highlighting the LogMode property.

Infine, osservando la proprietà LogType, ci sono diversi tipi di log. Questa proprietà serve più come una proprietà di categorizzazione, ma di solito indica come viene utilizzato il log e i tipi di eventi mostrati.

  • Amministrativo – Principalmente destinato agli utenti finali e agli utenti amministrativi.
  • Analitico – Tipicamente, un registro ad alto volume, destinato a descrivere le operazioni del programma.
  • Debug – Pensato per sviluppatori che hanno bisogno di approfondire le interne del programma.
  • Operativo – Un evento che si verifica durante il funzionamento ed è utile per diagnosticare gli eventi e avviare processi.
Highlighting the LogType property.

Elenco dei provider di log degli eventi

Ora che hai una comprensione solida dei diversi log e delle loro proprietà, aiuta a capire cosa sia un Fornitore di Log degli Eventi. Un fornitore, nel linguaggio dei log degli eventi, è una fonte di un evento.

I fornitori di log degli eventi sono unici e collegati a ciascun log, come ad esempio i log dell’Applicazione o del Sistema, e serviranno come la fonte nominata da cui un evento origina.

Forse vorresti individuare problemi filtrando i log e potresti essere interessato solo ai problemi di un determinato fornitore. Per elencare quali fornitori sono disponibili, utilizza il parametro -ListProvider. Come mostrato di seguito, il * elenca tutti i fornitori disponibili e a quali log sono collegati, come ad esempio Windows PowerShell o System.

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

Forse potresti voler elencare solo i fornitori disponibili per un particolare registro, come System. Per farlo, potresti filtrare gli eventi utilizzando il comando Where-Object utilizzando i valori della proprietà LogLinks. La proprietà LogLinks mostra i registri eventi collegati come una lista.

Per filtrare i registri richiesti con Where-Object, utilizza l’-In operatore di confronto per filtrare solo quegli eventi con System nel valore della proprietà LogLinks. Infine, l’uso di Format-Table -AutoSize rende più facile la lettura dell’output, come mostrato di seguito.

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.

Recupero dei Log Eventi Classici con Get-WinEvent

Il primo passo nel risolvere un problema di Windows è recuperare il registro Application o System, che sono i Log Eventi Classici. Nell’esempio mostrato di seguito, recupererai i primi 100 eventi utilizzando il parametro -MaxEvents del registro eventi Application.

Per rendere più facile la lettura dei risultati, seleziona solo le proprietà necessarie per leggere le voci più facilmente. Altrimenti, le voci sono raggruppate per il nome del provider, il che rende difficile analizzare l’elenco dei risultati.

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

Trovare gli eventi di Windows moderni con Get-WinEvent

Ora che hai recuperato gli eventi dal classico registro dell’applicazione, cosa ne pensi dei risultati di un registro eventi di Windows più recente, come Microsoft-Windows-WindowsUpdateClient/Operational?

A differenza di un registro eventi classico, come System, il registro Microsoft-Windows-WindowsUpdateClient/Operational è un registro moderno, con Get-WinEvent che funziona allo stesso modo come sotto.

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

Che ne dici di ottenere solo gli eventi più vecchi? Anche se potresti invertire l’ordine dei risultati con Sort-Object, utilizza il parametro -Oldest per recuperare i primi 10 eventi, come mostrato di seguito.

Il comando Get-WinEvent filtra per te invece di restituire tutti i risultati e ordinare, il che è tipicamente più lento.

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.

Recupero dei file Event Tracing for Windows (ETW) con Get-WinEvent

Forse hai un file esportato *.evtx da un altro computer o hai fatto il backup di un registro esistente. Puoi leggere quei log con il cmdlet Get-WinEvent. Se hai bisogno di conservare i log per scopi di audit, Get-WinEvent è un ottimo modo per interrogare quei log con cmdlet standard all’interno degli script rapidamente.

Per dimostrare il recupero delle voci di registro da un file *.evtx, è necessario un file di registro esportato.

1. Apri il Visualizzatore eventi e vai a un registro. In questo esempio, il registro Registri applicazioni e servizi → Windows PowerShell.

Navigate to a Windows Event Viewer log.

2. Successivamente, fai clic su Salva tutti gli eventi con nome… nell’elemento di menu Azioni.

Save the log file.

3. Salva il file in una posizione del disco da recuperare tramite il comando Get-WinEvent.

Choose a location to save the log file.

Ora che hai esportato un file di registro, passa la posizione del file di registro tramite il parametro -Path per leggere gli eventi. Nell’esempio mostrato di seguito, il registro di Windows PowerShell viene esportato per un consumo successivo.

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.

Filtraggio dei Registri Eventi di Windows Utilizzando Get-WinEvent

Anche se potresti filtrare i registri con il cmdlet standard Where-Object, Get-WinEvent offre filtri incorporati. Restituendo tutti i risultati e filtrando successivamente, si compie più lavoro del necessario. Invece, dovresti sempre cercare di filtrare il più possibile alla fonte.

Il cmdlet Get-WinEvent fornisce tre parametri per aiutarti a filtrare tra migliaia di eventi chiamati -FilterHashTable, -FilterXPath e -FilterXML. In generale, ogni parametro svolge la stessa attività in modo diverso.

Filtraggio dei Registri Eventi con FilterHashTable

Il parametro -FilterHashTable filtra i contenuti in base alle proprietà corrispondenti, come LogName. Invece di utilizzare il parametro -LogName per filtrare per un log specifico, è possibile utilizzare un hash table, come @{'LogName' = 'Application'}, che corrisponderebbe alla proprietà dell’evento LogName.

L’esempio mostrato di seguito fornisce un hash table al parametro -FilterHashTable che cerca solo il log dell’applicazione e con un tempo di inizio che è tutti gli eventi successivi a mezzanotte del giorno corrente, Get-WinEvent restituisce rapidamente i risultati.

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.

Confronta le velocità di filtraggio del comando sopra con uno filtrato tramite Where-Object invece che tramite il parametro -FilterHashTable nella pipeline. Come puoi vedere, il comando che utilizza Where-Object è molto più lento di quello che utilizza il parametro -FilterHashTable.

Comparing filtering with FilterHashTable and Where-Object.

Filtraggio dei log eventi utilizzando il parametro FilterXPath

Le voci del registro eventi sono memorizzate come file XML, e quindi puoi utilizzare il linguaggio XPath, un linguaggio di interrogazione XML, per filtrare le voci del registro. Eseguendo lo stesso comando utilizzato sopra e traducendo in XPath, è possibile ottenere gli stessi risultati.

Per creare una query XPath, utilizza la funzionalità di filtraggio nell’Event Viewer di Windows, come mostrato di seguito.

1. Apri il Visualizzatore eventi e passa a un registro, come il registro Log di Windows → Applicazione.

Opening the Windows Event Viewer.

2. Successivamente, fare clic sul collegamento Filtra registro corrente nel riquadro di destra.

Choosing to Filter the Current Log.

3. Immettere i parametri che si desidera utilizzare per filtrare il registro.

Creating a filter for the current log.

4. Fare clic sulla scheda XML e copiare la sezione contenuta all’interno del tag Seleziona.

Copying the XPath command.

5. Ora, copiare e incollare il contenuto copiato con il parametro -FilterXPath. Ora è possibile vedere di seguito che utilizzando la sintassi XPath trovata dall’osservatore del registro eventi, è possibile creare una query per filtrare solo le informazioni necessarie.

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.

Approfondire come creare query XPath è fuori dal campo di applicazione di questo articolo, ma il formato di base è mostrato di seguito. Quando il parametro FilterXPath filtra una data, vedrai una grande differenza: è necessario utilizzare un formato data più specifico, yyyy-MM-ddTHH:mm:ss.fffZ, che la data deve essere restituita in UTC, come indicato dallo switch -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.

Filtraggio dei risultati del registro eventi con FilterXML

Infine, l’ultimo parametro di filtraggio disponibile è il parametro -FilterXML. A differenza dei parametri -FilterXPath e -FilterHashTable, questo parametro prende XML che viene quindi utilizzato per filtrare gli eventi. Il parametro -FilterXML consente regole più complesse e, come mostrato di seguito, può replicare gli esempi di filtraggio precedenti.

Come mostrato nell’esempio precedente, è possibile recuperare una query preformattata dalla funzionalità Visualizzatore eventi → Filtra log corrente. Invece di selezionare solo il contenuto nel nodo Select, utilizzerai l’intera query. Non sono stati effettuati filtri effettivi, come indicato dal simbolo * nel nodo Select. Questo fornirà il markup generale per il prossimo esempio.

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

Prima di creare un comando su una sola riga, separa innanzitutto la query XML e assegna il markup a una variabile, $Query, nell’esempio qui sotto. Assegnare la query a una variabile migliora la facilità d’uso e la leggibilità. Successivamente, passa la variabile $Query al parametro -FilterXML di Get-WinEvent.

Come mostrato di seguito, vedrai i risultati della query più complessa che restituisce tutti gli eventi di quella giornata e archiviati nel log 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

Il cmdlet Get-WinEvent semplifica la ricerca di più fonti di log eventi con potenti capacità di filtraggio. Dall’auditing alla risoluzione dei problemi, il cmdlet Get-WinEvent è un’aggiunta cruciale per qualsiasi toolkit degli amministratori di sistema!

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