6.08.2021

Çok sayıdaki olay kaydını tarihlerine göre gruplamak

Bir bilgisayarda sistem olay günlüğünde çok sayıda diskle ilgili 51 kimlikli kaydın olduğunu gördüm. Genel bir bakışla olayların birkaç günde yoğunlaştığını farkettim.

Get-WinEvent -computer BILGISAYAR -FilterHashTable @{LogName="System";ProviderName="disk";Id=51} | Measure-Object

ile 30.000+ olay kaydı olduğu saydım, ama bunlar her güne düzgün yayılmamıştı. Tarihe göre gruplayarak bir günlük sayıya ulaşmak istedim ama 

Get-WinEvent -computer BILGISAYAR -FilterHashTable @{LogName="System";ProviderName="disk";Id=51} | Group-Object -Property TimeCreated

gibi bir sorgu işe yaramaz, çünkü TimeCreated sadece tarih değil saat, dakika ve saniye bilgilerini de içerir. Dolayısıyla en iyi ihtimalle güne göre değil, saniyeye göre sayı verebilir ki bu da isteğimizin çok daha üstünde bir çözünürlük.

Bunun yerine yeni bir alan oluşturmalı ve o alanı TimeCreated alanının sadece tarih bilgileri ile donatmalıyız. Kısa bir arama ile daha önce hiç kullanmadığım bir yöntem kullanan şu Stackowerflow gönderisine ulaştım:

Get-EventLog -Logname system -Source "Microsoft-Windows-GroupPolicy" -EntryType "Information" |
    Add-Member Day -MemberType ScriptProperty -Value { $this.TimeGenerated.ToString('dd.MM.yyyy') } -PassThru |
    Group-Object 'Day', 'Source'

Aslında bu miktarda olayı kendi bilgisayarıma aktarıp da saymak yerine yerinde yapmak daha mantıklı olurdu. Bu sebeple Invoke-Command ile yukarıdaki bilgiyi de kullanarak

Invoke-Command -ComputerName BILGISAYAR -Command { Get-WinEvent -FilterHashTable @{LogName="System";ProviderName="disk";Id=51} | Add-Member Day -MemberType ScriptProperty -Value { $this.TimeCreated.ToString("dd.MM.yyyy"} -PassThru | Group-Object "Day", "Source" -NoElement

aşağıdaki sonuca ulaştım:

Count Name               PSComputerName
----- ----               --------------
 2542 19.04.2021         BILGISAYAR
 9044 26.01.2021         BILGISAYAR
19841 25.01.2021        
BILGISAYAR

Babadan kalma yöntemlerle yapmak isteseydik

Invoke-Command -computer BILGISAYAR -command { Get-WinEvent -FilterHashtable @{LogName="System";ProviderName="disk";Id=51} | Select Id,@{N="Day";E={$_.TimeCreated.ToString("dd.MM.yyyy")}} | Group-Object 'Day' -NoElement}

gibi bir sorgu oluşturabilirdik.

Hiç yorum yok: