Windows Server 2019'da oturum açma/kapama olaylarını alma
Script ne yapar:
- ✅ Başarılı/başarısız girişleri gösterir
- ✅ Oturum kapatma olaylarını izler
- ✅ RDP, konsol, network girişlerini ayırt eder
- ✅ Kaynak IP adreslerini gösterir
- ✅ Özet istatistikler sunar
- ✅ CSV'ye aktarma seçeneği
Kullanım örnekleri:
Temel kullanım (son 30 gün)
.\script.ps1
Son 7 günü göster
.\script.ps1 -GunSayisi 7
Belirli bir kullanıcı için
.\script.ps1 -KullaniciAdi "john.doe"
Son 90 gün, belirli kullanıcı
.\script.ps1 -GunSayisi 90 -KullaniciAdi "admin"
Önemli notlar:
- PowerShell'i yönetici olarak çalıştırmalısınız
- Security event log'larına erişim gereklidir
- Sistem hesapları (SYSTEM, NETWORK SERVICE vb.) otomatik filtrelenir
Script, tüm oturum aktivitelerini detaylı şekilde gösterecek ve isteğe bağlı olarak CSV formatında kaydedebilecektir.
param(
[int]$GunSayisi = 365,
[string]$KullaniciAdi = "*"
)
Write-Host "========================================" -ForegroundColor Cyan
Write-Host "Windows Server Oturum Aktivite Raporu" -ForegroundColor Cyan
Write-Host "========================================" -ForegroundColor Cyan
Write-Host ""
$BaslangicTarihi = (Get-Date).AddDays(-$GunSayisi)
Write-Host "Tarih Aralığı: $($BaslangicTarihi.ToString('dd.MM.yyyy HH:mm')) - $(Get-Date -Format 'dd.MM.yyyy HH:mm')" -ForegroundColor Yellow
Write-Host "Loglar taranıyor, lütfen bekleyin..." -ForegroundColor Yellow
Write-Host ""
# Event ID'ler:
# 4624 - Başarılı oturum açma
# 4625 - Başarısız oturum açma
# 4634 - Oturum kapatma
# 4647 - Kullanıcı tarafından oturum kapatma
# 4648 - Farklı kimlik bilgileriyle oturum açma
$EventIDs = @(4624, 4625, 4634, 4647, 4648)
try {
$Olaylar = Get-WinEvent -FilterHashtable @{
LogName = 'Security'
ID = $EventIDs
StartTime = $BaslangicTarihi
} -ErrorAction SilentlyContinue | ForEach-Object {
$Olay = $_
$KullaniciAdiBilgi = ""
$OturumTipi = ""
$Durum = ""
switch ($Olay.Id) {
4624 {
$Durum = "Başarılı Giriş"
$KullaniciAdiBilgi = $Olay.Properties[5].Value
$OturumTipi = switch ($Olay.Properties[8].Value) {
2 { "Interaktif (Konsol)" }
3 { "Network" }
4 { "Batch" }
5 { "Service" }
7 { "Unlock" }
8 { "NetworkCleartext" }
9 { "NewCredentials" }
10 { "RemoteInteractive (RDP)" }
11 { "CachedInteractive" }
default { "Diğer ($($Olay.Properties[8].Value))" }
}
}
4625 {
$Durum = "Başarısız Giriş"
$KullaniciAdiBilgi = $Olay.Properties[5].Value
$OturumTipi = "Başarısız Deneme"
}
4634 {
$Durum = "Oturum Kapatma"
$KullaniciAdiBilgi = $Olay.Properties[1].Value
$OturumTipi = "Logoff"
}
4647 {
$Durum = "Kullanıcı Çıkışı"
$KullaniciAdiBilgi = $Olay.Properties[1].Value
$OturumTipi = "User Initiated"
}
4648 {
$Durum = "Farklı Kimlik ile Giriş"
$KullaniciAdiBilgi = $Olay.Properties[5].Value
$OturumTipi = "Explicit Credentials"
}
}
if ($KullaniciAdi -ne "*" -and $KullaniciAdiBilgi -notlike "*$KullaniciAdi*") {
return
}
if ($KullaniciAdiBilgi -match '^(SYSTEM|ANONYMOUS|LOCAL SERVICE|NETWORK SERVICE)$') {
return
}
[PSCustomObject]@{
Zaman = $Olay.TimeCreated
EventID = $Olay.Id
Durum = $Durum
KullaniciAdi = $KullaniciAdiBilgi
OturumTipi = $OturumTipi
BilgisayarAdi = $Olay.MachineName
KaynakIP = if ($Olay.Properties[18].Value) { $Olay.Properties[18].Value } else { "N/A" }
}
}
if ($Olaylar) {
$Olaylar = $Olaylar | Sort-Object Zaman -Descending
Write-Host "Toplam Olay Sayısı: $($Olaylar.Count)" -ForegroundColor Green
Write-Host ""
$Olaylar | Format-Table -AutoSize @(
@{Label="Tarih/Saat"; Expression={$_.Zaman.ToString("dd.MM.yyyy HH:mm:ss")}; Width=20}
@{Label="Durum"; Expression={$_.Durum}; Width=25}
@{Label="Kullanıcı"; Expression={$_.KullaniciAdi}; Width=20}
@{Label="Oturum Tipi"; Expression={$_.OturumTipi}; Width=25}
@{Label="Kaynak IP"; Expression={$_.KaynakIP}; Width=15}
)
Write-Host "`n========================================" -ForegroundColor Cyan
Write-Host "ÖZET İSTATİSTİKLER" -ForegroundColor Cyan
Write-Host "========================================" -ForegroundColor Cyan
$Olaylar | Group-Object Durum | ForEach-Object {
Write-Host "$($_.Name): $($_.Count)" -ForegroundColor Yellow
}
Write-Host "`nEn Aktif Kullanıcılar:" -ForegroundColor Cyan
$Olaylar | Group-Object KullaniciAdi | Sort-Object Count -Descending | Select-Object -First 5 | ForEach-Object {
Write-Host " $($_.Name): $($_.Count) olay" -ForegroundColor White
}
Write-Host "`n" -NoNewline
$Cevap = Read-Host "Sonuçları CSV dosyasına kaydetmek ister misiniz? (E/H)"
if ($Cevap -eq 'E') {
$DosyaYolu = "C:\LoginActivity_$(Get-Date -Format 'yyyyMMdd_HHmmss').csv"
$Olaylar | Export-Csv -Path $DosyaYolu -NoTypeInformation -Encoding UTF8
Write-Host "Rapor kaydedildi: $DosyaYolu" -ForegroundColor Green
}
} else {
Write-Host "Belirtilen kriterlere uygun olay bulunamadı." -ForegroundColor Red
}
} catch {
Write-Host "HATA: $($_.Exception.Message)" -ForegroundColor Red
Write-Host "Not: Bu scripti yönetici olarak çalıştırmanız gerekebilir." -ForegroundColor Yellow
}
Write-Host "`nİşlem tamamlandı." -ForegroundColor Green