Bir müdürün hesabı üç ay önce şirketten ayrılmasına rağmen hâlâ etkin durumda mı? Yoksa yarın parolası dolacak ve haberi olmayan on kişi mi var? Bu tür sorulara “muhtemelen” değil kesin bir cevap vermek istiyorsanız, Active Directory’yi elle taramak yerine PowerShell’e sormanız gerekiyor.
90 Gündür Giriş Yapmayan Hesapları Bulma
Import-Module ActiveDirectory
Get-ADUser -Filter {Enabled -eq $true} -Properties LastLogonDate |
Where-Object {$_.LastLogonDate -lt (Get-Date).AddDays(-90)} |
Select-Object Name, SamAccountName, LastLogonDate |
Sort-Object LastLogonDate
LastLogonDate özelliği domain controller’lar arası replikasyon nedeniyle küçük gecikmeler gösterebilir; kritik kararlar öncesinde LastLogonTimestamp ile çapraz kontrol yapmak daha güvenli bir tercih.
Parolası Yakında Dolacak Kullanıcıları Tespit Etme
$gün = 7
Get-ADUser -Filter {Enabled -eq $true} -Properties PasswordExpired, PasswordLastSet, msDS-UserPasswordExpiryTimeComputed |
Where-Object {
$_.PasswordExpired -eq $false -and
[datetime]::FromFileTime($_."msDS-UserPasswordExpiryTimeComputed") -lt (Get-Date).AddDays($gün)
} |
Select-Object Name, SamAccountName, @{N='ParolaBitişi';E={[datetime]::FromFileTime($_."msDS-UserPasswordExpiryTimeComputed")}}
Otomatik E-posta Bildirimi ile Birleştirme
Bu sorguları elle çalıştırmak tek seferlik bir merak gidermekten öteye geçmiyor. Asıl değer, bunları haftalık bir zamanlanmış görev (Scheduled Task) haline getirip sonucu ilgili kişilere otomatik göndermekte ortaya çıkıyor:
$kullanicilar = Get-ADUser -Filter {Enabled -eq $true} -Properties LastLogonDate |
Where-Object {$_.LastLogonDate -lt (Get-Date).AddDays(-90)}
if ($kullanicilar) {
$body = $kullanicilar | ConvertTo-Html -Property Name, SamAccountName, LastLogonDate | Out-String
Send-MailMessage -From "[email protected]" -To "[email protected]" `
-Subject "90+ Gün İnaktif Hesap Raporu" -Body $body -BodyAsHtml -SmtpServer "smtp.sirket.com"
}
Tespit Etmek Yetmez, Dikkatli Aksiyon Almak Gerekir
İnaktif hesapları otomatik olarak devre dışı bırakmak cazip görünse de, tespit ile aksiyon arasına mutlaka bir onay adımı koyuyorum. Uzun izinli bir çalışanın hesabı yanlışlıkla kapatılırsa, kazandığınızdan çok daha fazla zaman kaybedersiniz:
# Önce sadece raporla, WhatIf ile test et
Get-ADUser -Filter {Enabled -eq $true} -Properties LastLogonDate |
Where-Object {$_.LastLogonDate -lt (Get-Date).AddDays(-180)} |
Disable-ADAccount -WhatIf
-WhatIf parametresi gerçekte hiçbir şeyi değiştirmeden “bu komut çalışsaydı ne olurdu” sonucunu gösteriyor — production script’lerinde test aşamasını atlamamak için elimden bırakmadığım bir alışkanlık.
Bu üç sorguyu bir araya getirdiğinizde elinizde artık haftalık olarak kendi kendini güncelleyen, gerçek bir AD hijyen rutini oluyor. İşin özeti şu: script’i bir kez doğru kurun, sonrasında iş sizi değil script sizi bilgilendirsin.
[…] mevcut hasarı ölçülebilir hale getirdim: 90 günden fazla giriş yapmamış hesapları tespit eden bir PowerShell scripti ile tam bir envanter çıkardım. Bu, “kaç hesap risk altında” sorusunu net bir […]