# PowerShell ile Active Directory Yönetimi: Tek Komutla İnaktif Hesapları ve Süresi Dolan Parolaları Tespit Etme

- Bağlantı: https://musti.org/powershell/powershell-ad-inaktif-hesaplar-sureli-parolalar/
- Yayımlanma: 2026-09-21T21:38:26+03:00
- Yazar: mmutlu

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 "it-raporlar@sirket.com" -To "yonetici@sirket.com" `
            -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.
