Active Directory’de Atıl Bilgisayar Hesaplarını Temizleme
Bu yazıda, uzun süredir domain’e logon olmamış bilgisayar hesaplarını nasıl tespit edeceğinizi, güvenli şekilde disable edeceğinizi ve gerekirse sileceğinizi adım adım anlatıyorum. Amaç: AD’yi şişiren stale computer object’leri kontrollü biçimde temizlemek.
Ne zaman gerekir?
Aşağıdaki durumlarda stale computer account temizliği faydalıdır:
- Eski VDI / golden image makineleri domain’de kalmışsa
- Yenilenen notebook’lar için eski hesaplar kapanmamışsa
- Güvenlik denetiminde “unused computer accounts” bulgusu geldiyse
- Kerberos / secure channel tarafında gereksiz noise oluşuyorsa
Production’da önce rapor alın, sonra disable edin, en az 30–60 gün bekleyip sonra silin. Doğrudan silmek recovery’yi zorlaştırır.
Ön koşullar
- Domain Admin veya Computer objects üzerinde yeterli yetki
- RSAT / Active Directory PowerShell modülü
- Tercihen bir yönetim sunucusundan (PAW) çalıştırma
Import-Module ActiveDirectory
Get-Module ActiveDirectory
1) Eşik belirleme
Pratik bir başlangıç eşiği: 90 gündür. Daha agresif ortamlarda 60 gün, daha temkinli ortamlarda 180 gün kullanılabilir.
$DaysInactive = 90
$Cutoff = (Get-Date).AddDays(-$DaysInactive)
$Cutoff
2) Atıl bilgisayar hesaplarını listeleme
LastLogonDate alanı, DC’ler arasında replicated approximate bir değerdir. Raporlama için yeterlidir; tek DC’ye özel lastLogon kadar kesin değildir.
$DaysInactive = 90
$Cutoff = (Get-Date).AddDays(-$DaysInactive)
$StaleComputers = Get-ADComputer -Filter {
Enabled -eq $true -and LastLogonDate -lt $Cutoff
} -Properties LastLogonDate, OperatingSystem, Description, WhenCreated |
Select-Object Name,
DNSHostName,
OperatingSystem,
LastLogonDate,
WhenCreated,
DistinguishedName |
Sort-Object LastLogonDate
$StaleComputers | Format-Table -AutoSize
$StaleComputers | Export-Csv "C:TempStaleComputers_$($DaysInactive)d.csv" -NoTypeInformation -Encoding UTF8
Hiç logon görmemiş hesaplar
Bazı hesaplarda LastLogonDate boş olabilir (hiç başarılı logon olmamış veya attribute dolmamış):
$NeverLoggedOn = Get-ADComputer -Filter {
Enabled -eq $true -and -not LastLogonDate
} -Properties LastLogonDate, WhenCreated |
Where-Object { $_.WhenCreated -lt (Get-Date).AddDays(-30) }
$NeverLoggedOn | Select-Object Name, WhenCreated, DistinguishedName
3) Güvenli temizleme stratejisi
| Adım | İşlem | Bekleme |
|---|---|---|
| 1 | CSV rapor + sahip onayı | – |
| 2 | Hesabı Disable et + Description güncelle | 30–60 gün |
| 3 | Hâlâ ihtiyaç yoksa Delete | – |
Cluster, SCOME, backup proxy, domain join template gibi özel hesapları listeden çıkarın. Description / naming convention ile exclude list tutun.
Örnek exclude:
$Exclude = @(
'*VDI*',
'*TEMPLATE*',
'*CLUSTER*',
'*BACKUP*'
)
$Filtered = $StaleComputers | Where-Object {
$name = $_.Name
-not ($Exclude | Where-Object { $name -like $_ })
}
4) Toplu disable (önerilen ara adım)
$Ticket = 'CHG012345'
$Stamp = Get-Date -Format 'yyyy-MM-dd'
foreach ($Computer in $Filtered) {
$OldDesc = (Get-ADComputer $Computer.DistinguishedName -Properties Description).Description
$NewDesc = "[STALE-DISABLED $Stamp / $Ticket] $OldDesc"
Set-ADComputer -Identity $Computer.DistinguishedName -Enabled $false -Description $NewDesc
Write-Host "Disabled: $($Computer.Name)"
}
5) Disable edilenleri belirli süre sonra silme
Sadece daha önce sizin işaretlediğiniz hesapları hedefleyin:
$Ticket = 'CHG012345'
$ToDelete = Get-ADComputer -Filter {
Enabled -eq $false -and Description -like "*STALE-DISABLED*$Ticket*"
} -Properties Description, LastLogonDate
$ToDelete | Select-Object Name, LastLogonDate, Description
# Onay sonrası:
# $ToDelete | Remove-ADComputer -Confirm:$false
6) Scheduled report (opsiyonel)
Haftalık mail/rapor için Task Scheduler + aşağıdaki script yeterlidir:
$DaysInactive = 90
$Cutoff = (Get-Date).AddDays(-$DaysInactive)
$Path = "C:ReportsADStaleComputers_$(Get-Date -Format yyyyMMdd).csv"
Get-ADComputer -Filter { Enabled -eq $true -and LastLogonDate -lt $Cutoff } `
-Properties LastLogonDate, OperatingSystem |
Select-Object Name, OperatingSystem, LastLogonDate, DistinguishedName |
Sort-Object LastLogonDate |
Export-Csv $Path -NoTypeInformation -Encoding UTF8
Write-Output "Report saved: $Path"
Sık yapılan hatalar
-
Sadece
lastLogonTimestamp/LastLogonDateile karar verip hemen silmek
Önce disable + bekleme kullanın. -
Server hesaplarını client ile aynı eşikte temizlemek
Sunucular için daha yüksek eşik veya ayrı OU politikası uygulayın. -
Exclude listesini atlamak
Özellikle cluster ve yönetim hesaplarında geri dönüş maliyeti yüksektir.
Sonuç
Stale computer temizliği bir kerelik “sil-geç” işi değildir; rapor → onay → disable → bekle → sil döngüsüyle yürütülmelidir. Bu yaklaşım hem AD hijyenini sağlar hem de yanlışlıkla kritik hesap silme riskini düşürür.
İstersen bir sonraki yazıda aynı senaryoyu Entra ID / hybrid join cihazları için de ele alabilirim.