PowerShell ile Daha İyi Olay Günlükleri


Kurumsal bir ortamda çalışmadığım için PowerShell'in bir BT uzmanı olarak hayatınızı daha iyi hale getirebileceği fırsatları her zaman göremiyorum. Bir arkadaşım var; ona Gladys Kravitz adını verelim. Gladys ve ben sohbet ediyorduk ve Windows olay günlüklerinden bilgi çıkarmanın ne kadar zor olduğundan bahsetti. Yanlış hatırlamıyorsam Güvenlik günlüğünde başarısız oturum açma girişimlerini temsil eden 4625 olaya bakıyordu. İşte bir örnek:

Mesajı okuduğunuzda, Şirket etki alanındaki Aprils kullanıcısının Win10'da oturum açmaya çalıştığı açıkça görülüyor. Peki bu bilgiyi 100 makinedeki olay kayıtlarından nasıl elde edersiniz? Bilgiyi çıkarmak için bazı düzenli ifade voodoo'larına başvurabilirsiniz. Değerler aslında olay günlüğü kaydının bir parçasıdır. Get-Eventlog'u kullanırken replacementStrings'i görmüş olabilirsiniz. Get-WinEvent kullanıldığında bu değerler özellikler olarak saklanır.

Bu değerlerin tutarlı olduğunu varsayarak bu değerlerden özel bir nesne oluşturmak için bir işlev yazabilirsiniz. Ama her zaman büyük resmi düşünüyorum. Gladys'in asıl istediği, olay günlüğü kaydını PowerShell'de kullanabileceği yapılandırılmış bir nesneye dönüştürmenin bir yoluydu. Yedek dizelerle ilgili bu sorun, bu özel durumun ötesine geçiyor.

Kurtarma XML'i

Muhtemelen XML'i bir çözüm olarak düşünmüyorsunuz ancak bu durumda XML günü kurtarır. Get-WinEvent'ten aldığınız olay günlüğü kayıt nesnesi, XML sürümü oluşturmaya yönelik bir yöntem içerir.

 $r = get-winevent -FilterHashtable @{Logname="Security";ID=4625} -MaxEvents 1 -ComputerName Win10 [xml]$evt = $r.ToXml() 

Bu belge, olay günlüğü kaydını oluşturmak için kullanılan verileri açığa çıkaran özelliklere sahiptir.

Veri düğümü umut verici görünüyor.

Bu neredeyse bir nesneye benziyor! Bir tane yapacağım.

$evt.Event.EventData.Data | foreach-object -Begin {$h = @{}} -Process {
 $h.add($_.name,$_.'#text')
} -end { $obj = New-Object -TypeName PSObject -Property $h }

Olay günlüğü kayıtlarını daha anlamlı nesnelere dönüştürmek için bunun etrafında bir araç geliştirebilirim. Gladys için yaptığım da tam olarak buydu.

EventLogRecord'u Dönüştür

PSScriptTools modülümün en son sürümünün parçası olan Convert-EventLogRecord adlı bir işlev yazdım. İşlev, olay günlüğü girişlerini özel nesnelere dönüştürmek için tasarlanmıştır. İşlev, gösterdiğim veri özelliklerine ve ayrıca olay kimliği, günlük adı ve bilgisayar adı gibi diğer bilgilere sahip özel bir nesne oluşturur.

Artık Gladys, istediği bilgiyi istediği biçimde elde edebilecek bir PowerShell aracına sahip.

Bu mükemmel bir araç değil. Hatta bazı günlük girişlerinde fazladan veri yoktur. Veya sahip oldukları veriler yalnızca dizelerin bir listesidir. Bu durumlarda veriler RawProperties olarak depolanır.

Ancak bir kez bir kontrol komut dosyası veya başka bir araç yazabileceğimi öğrendiğimde.

Farklı günlüklerdeki farklı olayları keşfederken, olayların neye benzediğini anlarsınız. Bazen olay günlüğü verileri yararlı olmayabilir. Ancak PowerShell'in biraz çabasıyla anlamlı sonuçlar yaratabilirsiniz. Bu kodu masaüstünüzde çalıştırabilmeniz gerekir.

Get-WinEvent -FilterHashtable @{Logname ='system';ID =7040} -MaxEvent 50 |
Convert-EventlogRecord | 
Sort-Object -Property Param4,TimeCreated -Descending |
Format-Table -GroupBy @{Name="Service";Expression={$_.param4}} -Property TimeCreated,
@{Name="OriginalState";Expression = {$_.param2}},
@{Name="NewState";Expression={$_.param3}},Computername

Sonuçlar size hizmetlerin ne zaman durum değiştirdiğini gösterir.

Sonuçları biçimlendirilmiş tablolar olarak gösteriyorum. Ancak Convert-EventLogRecord işlevi işlem hattına bir nesne yazdığından istediğinizi yapabilirsiniz. İstediğiniz Get-Winevent sorgusunu veya komutunu çalıştırın, sonuçları dönüştürün ve ardından sonuçlarla ihtiyacınız olanı yapın.

Kodu Gladys'e denemesi için verdim ama artık 2.13 sürümünden itibaren PSScriptTools modülünden de alabilirsiniz. Umarım denersiniz ve ne düşündüğünüzü bana bildirirsiniz.

İlgili makaleler