- Konu sahibi
- #1
İlk olarak
PowerShell’i mümkünse Yönetici olarak açın. Özellikle güvenlik günlüğü gibi korunan günlüklerde yönetici yetkisi olmadan erişim hatası alabilirsiniz. Önce sunucuda bulunan günlükleri ve kayıt sayılarını görün:
Çıktıdaki
Örneğin Sistem günlüğündeki en yeni 20 olayı görmek için şu komutu çalıştırın:
Sonuçtaki alanlar şu şekilde yorumlanır:
Belirli bir günlükte yalnızca hata ve kritik olayları almak için
Bu örnek son 24 saatteki Sistem günlüğünde
Belirli bir olay kimliğini incelemek için kimliği filtreye ekleyin:
Olay kimliği tek başına yeterli değildir. Aynı kimlik farklı sağlayıcılarda veya farklı işletim sistemi sürümlerinde farklı açıklamalarla görülebilir. Bu nedenle
Aynı ağdaki ve uzaktan olay günlüğü sorgulamasına izin veren bir sunucuyu
Yetki gerekiyorsa kimlik bilgilerini güvenli biçimde isteyerek kullanın:
Komut erişim, RPC veya günlük okuma hatası verirse önce sunucu adının çözümlendiğini, hedef sunucunun erişilebilir olduğunu ve kullandığınız hesabın ilgili günlükleri okuyabildiğini kontrol edin. Parolayı komut satırına düz metin olarak yazmayın. Uzak sorgu yapılandırması engelliyse, sunucuda komutu yerel olarak çalıştırmak veya kurumun izin verdiği PowerShell uzaktan yönetim yöntemini kullanmak gerekir.
Olayları daha sonra paylaşmak veya karşılaştırmak için nesneleri CSV dosyasına aktarın. Özellikle
Dosyanın oluştuğunu ve kayıt sayısını kontrol edin:
İlk komut
Windows PowerShell 5.1’de klasik
Ancak yeni Windows olay günlüğü teknolojisi ve ayrıntılı filtreleme için tercih edilmesi gereken cmdlet Get-WinEvent’tir.
Get-WinEvent cmdlet’ini kullanın. Bu cmdlet ile yerel Windows sunucusundaki günlükleri listeleyebilir, System, Application veya Security gibi belirli bir günlükten olayları çekebilir, hata ve uyarıları filtreleyip CSV dosyasına kaydedebilirsiniz. Uzak bir sunucuyu sorgulayacaksanız sunucu adını ve gerekli yetkileri komuta eklemeniz gerekir.Günlük adlarını listeleme
PowerShell’i mümkünse Yönetici olarak açın. Özellikle güvenlik günlüğü gibi korunan günlüklerde yönetici yetkisi olmadan erişim hatası alabilirsiniz. Önce sunucuda bulunan günlükleri ve kayıt sayılarını görün:
Kod:
Get-WinEvent -ListLog * |
Where-Object { $null -ne $_.RecordCount } |
Select-Object LogName, RecordCount, IsEnabled, LogMode
Çıktıdaki
LogName değeri, sonraki komutlarda kullanılacak gerçek günlük adıdır. RecordCount değeri sıfırsa veya boşsa bu durum günlükte okunabilir bir kayıt bulunmadığını gösterir; sunucuda hiçbir olay yaşanmadığını kanıtlamaz. Günlük devre dışı olabilir, kayıtlar temizlenmiş olabilir veya olaylar başka bir günlükte tutuluyor olabilir.Son olayları görüntüleme
Örneğin Sistem günlüğündeki en yeni 20 olayı görmek için şu komutu çalıştırın:
Kod:
Get-WinEvent -LogName System -MaxEvents 20 |
Select-Object TimeCreated, Id, LevelDisplayName, ProviderName, Message
Sonuçtaki alanlar şu şekilde yorumlanır:
TimeCreated olayın zamanını, Id olay kimliğini, LevelDisplayName önem seviyesini, ProviderName olayı üreten bileşeni, Message ise olayın açıklamasını gösterir. Bir olayın Error veya Critical seviyesinde olması incelenmesi gerektiğini gösterir; tek başına sunucunun arızalı olduğunu veya olayın kök neden olduğunu kanıtlamaz. Aynı zaman aralığındaki hizmet, disk, ağ ve uygulama olaylarıyla birlikte değerlendirin.Hata ve uyarıları filtreleme
Belirli bir günlükte yalnızca hata ve kritik olayları almak için
FilterHashtable kullanabilirsiniz:
Kod:
Get-WinEvent -FilterHashtable @{
LogName = 'System'
Level = 1, 2
StartTime = (Get-Date).AddHours(-24)
} |
Select-Object TimeCreated, Id, LevelDisplayName, ProviderName, Message
Bu örnek son 24 saatteki Sistem günlüğünde
Level değeri 1 veya 2 olan olayları getirir. Windows olay seviyelerinde 1 kritik, 2 hata anlamına gelir. Sonuç yoksa son 24 saatte bu seviyelerde olay bulunmadığı anlaşılır; bu, tüm servislerin sağlıklı olduğunu kesin olarak göstermez. Uygulama sorununu araştırıyorsanız aynı sorguyu Application günlüğünde de çalıştırın.Belirli bir olay kimliğini incelemek için kimliği filtreye ekleyin:
Kod:
Get-WinEvent -FilterHashtable @{
LogName = 'System'
Id = 7036
StartTime = (Get-Date).AddDays(-1)
} | Select-Object TimeCreated, Id, ProviderName, Message
Olay kimliği tek başına yeterli değildir. Aynı kimlik farklı sağlayıcılarda veya farklı işletim sistemi sürümlerinde farklı açıklamalarla görülebilir. Bu nedenle
ProviderName, olay zamanı ve tam Message bilgisini birlikte saklayın.Uzak Windows sunucusunun günlüklerini görüntüleme
Aynı ağdaki ve uzaktan olay günlüğü sorgulamasına izin veren bir sunucuyu
-ComputerName ile sorgulayabilirsiniz:
Kod:
Get-WinEvent -ComputerName 'SRV01' -LogName System -MaxEvents 50 |
Select-Object TimeCreated, Id, LevelDisplayName, ProviderName, Message
Yetki gerekiyorsa kimlik bilgilerini güvenli biçimde isteyerek kullanın:
Kod:
$Credential = Get-Credential
Get-WinEvent -ComputerName 'SRV01' -Credential $Credential -LogName Application -MaxEvents 50 |
Select-Object TimeCreated, Id, LevelDisplayName, ProviderName, Message
Komut erişim, RPC veya günlük okuma hatası verirse önce sunucu adının çözümlendiğini, hedef sunucunun erişilebilir olduğunu ve kullandığınız hesabın ilgili günlükleri okuyabildiğini kontrol edin. Parolayı komut satırına düz metin olarak yazmayın. Uzak sorgu yapılandırması engelliyse, sunucuda komutu yerel olarak çalıştırmak veya kurumun izin verdiği PowerShell uzaktan yönetim yöntemini kullanmak gerekir.
Çıktıyı dosyaya kaydetme
Olayları daha sonra paylaşmak veya karşılaştırmak için nesneleri CSV dosyasına aktarın. Özellikle
Message alanı uzun olabileceği için önce gerekli alanları seçin:
Kod:
$Events = Get-WinEvent -FilterHashtable @{
LogName = 'System'
Level = 1, 2
StartTime = (Get-Date).AddHours(-24)
} | Select-Object TimeCreated, Id, LevelDisplayName, ProviderName, Message
$Events | Export-Csv -Path 'C:\Temp\System-errors-last-24h.csv' -NoTypeInformation -Encoding UTF8
Dosyanın oluştuğunu ve kayıt sayısını kontrol edin:
Kod:
Test-Path 'C:\Temp\System-errors-last-24h.csv'
$Events.Count
İlk komut
True döndürürse dosya oluşturulmuştur. Kayıt sayısı sıfırsa CSV’nin boş olması beklenir; filtreyi genişletmeden önce doğru günlük adını, tarih aralığını ve seviyeyi kontrol edin. Dışarıya göndermeden önce kullanıcı adları, bilgisayar adları, dosya yolları ve hata iletilerindeki hassas bilgileri inceleyin.Eski Windows PowerShell sürümünde alternatif
Windows PowerShell 5.1’de klasik
Application, System ve Security günlüklerini Get-EventLog ile de okuyabilirsiniz:
Kod:
Get-EventLog -LogName System -Newest 20 |
Select-Object TimeGenerated, EventID, EntryType, Source, Message
Ancak yeni Windows olay günlüğü teknolojisi ve ayrıntılı filtreleme için tercih edilmesi gereken cmdlet Get-WinEvent’tir.
Get-Event ise Windows Olay Görüntüleyicisi günlüklerini okumaz; yalnızca geçerli PowerShell oturumunun olay kuyruğuyla ilgilidir.