Il visualizzatore eventi, questo “misterioso”, per molti, raccoglitore di informazioni di tutto quello che accade nel sistema operativo, dalle installazioni dei programmi, agli errori con relative schermate blu di Windows. Leggere e capirne il contenuto non è semplice, anche perché il Visualizzatore Eventi non è che offra delle grandi possibilità (comode) di salvataggio dei dati presenti. PowerShell può darci una mano per estrarre dei dati più specifici.
Aggiunto script e spiegazioni per l'estrazione completa di tutti gli eventi.
Le due aree che ci interessano di più sono Application (Applicazione) e System (Sistema), in PowerShell, nei vari comandi è necessario usare il formato inglese.
In caso non ci siano dati corrispondenti a quello che avete inserito, oppure, per qualche motivo, PowerShell non riesce ad estrarre i dati, vedrete comparire delle righe rosse.
Salvataggio in file di testo
Per salvare tutti gli eventi di Sistema in un file di testo, per farlo analizzare ad altri, si può usare questo script: Get-WinEvent -LogName system > d:\Sistema.txt
Filtro in base all’Origine
Con questo script potete ottenere tutti quegli eventi che contengono error, più altri caratteri rappresentati dai due asterischi, nell’Origine. Get-WinEvent -FilterHashtable @{ LogName='Application' ProviderName='*error*'}
Per estrapolare da System tutti gli eventi relativi agli aggiornamenti di Windows utilizziamo questo script. Get-WinEvent -FilterHashtable @{ LogName='System' ProviderName='*windowsupdate*'}
Estrazione gruppi di eventi
Per ricavare gli ultimi 100 eventi da Sistema: Get-WinEvent -LogName 'System' -MaxEvents 100 | Select-Object TimeCreated, ID, ProviderName, LevelDisplayName, Message | Format-Table -AutoSize
Per estrarre gli eventi relativi ad un determinato ID Evento (InstanceId -eq 51046), avvenuti nell’ultimo giorno (AddDays(-1)) possiamo usare questo script.
Get-EventLog system -after (get-date).AddDays(-1) | where {$_.InstanceId -eq 51046} Get-EventLog application -after (get-date).AddDays(-1) | where {$_.InstanceId -eq 301}
Cambiando il numero dell’ID evento, o dei giorni da estrarre, adattiamo la ricerca alle nostre esigenze.
Simile allo script precedente, ma senza limiti di tempo, in questo modo è possibile ottenere gli eventi relativi agli ID 6155 e 7045: Get-WinEvent -FilterHashtable @{logname="system"; id=6155,7045}
Descrizioni complete
Sino ad ora abbiamo visto una serie di script dove alcune descrizioni, o messaggi d’errore, vengono tagliate, se troppo lunghe, facendoci perdere parti importanti dell’evento.
Un metodo per avere un messaggio più completo è quello di aggiungere | Format-List
in fondo al comando.
Con Get-EventLog system -after (get-date).AddDays(-1) | where {$_.InstanceId -eq 51046} | Format-List
si vedono gli eventi dell'ultimo giorno con Id 51046.
Con Get-WinEvent -LogName System -MaxEvents 10 | Format-List
si ottiene l’elenco dettagliato degli ultimi 10 eventi di Sistema.
Estrazione dai dettagli
Per filtrare tutti gli eventi che contengono “DNS” nei dettagli si utilizza questa riga di comandi: Get-WinEvent -FilterHashtable @{LogName='System'} | Where-Object -Property Message -Match “DNS”
Estrazione per data e ora
Per ottenere 10 eventi, avvenuti tra il 19 e il 21 Ottobre, che contengono DNS nell’origine con id=1014 si ricorre a questo script: get-winevent @{ providername = '*DNS*'; id = 1014; starttime = '19/10'; endtime = '21/10' } -MaxEvents 10
Per selezionare eventi in un determinato periodo di tempo, fornendo anche un orario di inizio e fine, si ricorre a questo script: $Begin = Get-Date -Date '20/10/2023 14:00:00' $End = Get-Date -Date '20/10/2023 19:55:00' Get-EventLog –LogName Application -After $Begin -Before $End
In questo modo si ottengono tutti gli eventi, degli ultimi due giorni, il cui Livello è Errore o Avviso. $StartDate = (Get-Date) - (New-TimeSpan -Day 2) Get-WinEvent Application,System | Where-Object {($_.LevelDisplayName -eq "Errore" -or $_.LevelDisplayName -eq "Avviso") -and ($_.TimeCreated -ge $StartDate )}
Estrarre tutto il contenuto del visualizzatore eventi
Sino ad ora abbiamo visto come estrarre alcuni singoli eventi, in base a determinati filtri o ricerche che avevamo impostato noi.
Solo che mi sono trovato di fronte a un computer che presentava degli strani problemi, la cui causa non era ben definita, così mi serviva avere tutti gli eventi registrati per poterli analizzare da un altro sistema operativo.
Qualche ricerca su Internet mi ha permesso di trovare uno script, che potevo eseguire da remoto, che estrae il contenuto completo del visualizzatore eventi in quattro file separati e nominati con data e ora dell’esecuzione dello script.
Non sono io l’autore dello script, che trovate in allegato all’articolo, avrei voluto citarlo ma ho perso la pagina dove l’avevo trovato, mi sono limitato a cambiarne alcune parti per renderlo più adatto ai miei scopi.
Potete cambiare la variabile $destinationpath
e indicare un’altra destinazione per il salvataggio, se la cartella che inserite non è presente lo script la crea.
I file .evtx possono poi essere importati nel visualizzatore eventi di un altro computer per essere letti.
Conclusioni
Le possibilità di ricercare e filtrare dati dal visualizzatore eventi sono tantissime, basta fare una ricerca su Internet e si trovano una infinità di script, anche molto più complicati di quelli che ho presentato nell’articolo. Ho fatto una piccola selezione, di quelli che mi sono sembrati più semplici da capire e da modificare, per imparare a muoversi nel mondo di PowerShell.