İçeriğe atla
Sistem Günlüğü Teknik notlar ve Tecrübeler..
ACTIVE DIRECTORY 4 dk okuma

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

  1. Sadece lastLogonTimestamp / LastLogonDate ile karar verip hemen silmek
    Önce disable + bekleme kullanın.

  2. Server hesaplarını client ile aynı eşikte temizlemek
    Sunucular için daha yüksek eşik veya ayrı OU politikası uygulayın.

  3. 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.

Yorum yaz

Üye olmadan yorum yazabilirsin. Yorumlar onaylandıktan sonra yayınlanır.