Active Directory’de şifre süreleri dolmadan kullanıcıları otomatik olarak uyaran PowerShell scripti

PowerShell

Active Directory’de şifre süreleri dolmadan kullanıcıları otomatik olarak uyaran bir PowerShell script

Bu script şunları yapar:

  1. Active Directory’den şifresi dolmak üzere olan kullanıcıları tespit eder
  2. Şifresi belirli gün aralıklarında (14, 7, 3, 1 gün) dolacak kullanıcılara özelleştirilmiş e-posta gönderir
  3. Tüm işlemleri günlük dosyasına (log) kaydeder
  4. HTML formatında profesyonel bir e-posta şablonu kullanır

Kullanmadan önce aşağıdaki değişkenleri kendi ortamınıza göre ayarlamanız gerekir:

  • $smtpServer – SMTP sunucu adresiniz
  • $smtpPort – SMTP port numarası
  • $smtpFrom – Gönderen e-posta adresi
  • $domain – Şirket domain adınız
  • Şifre politikası bilgilerini güncelleyin (HTML içindeki listeyi)

Bu script’i Windows Görev Zamanlayıcı’da günlük olarak çalışacak şekilde aşağıdaki şekilde ayarlayabilirsiniz:

  1. PowerShell script’i .ps1 uzantısıyla kaydedin
  2. Görev Zamanlayıcı’yı açın ve yeni bir görev oluşturun
  3. Program/script olarak powershell.exe yazın
  4. Argümanlar bölümüne -ExecutionPolicy Bypass -File "C:\Scripts\PasswordNotification\PasswordExpiryNotification.ps1" yazın
# Active Directory Şifre Uyarı Sistemi
# Bu script, şifresi yakın zamanda dolacak kullanıcılara otomatik e-posta gönderir

# Gerekli modülü içe aktarma
Import-Module ActiveDirectory

# Günlük dosyası oluşturma
$LogFile = "C:\Scripts\PasswordNotification\PasswordExpiryLog_$(Get-Date -Format 'yyyyMMdd').log"
$ScriptDir = "C:\Scripts\PasswordNotification"

# Script klasörü kontrolü
if (!(Test-Path $ScriptDir)) {
    New-Item -ItemType Directory -Path $ScriptDir -Force
}

# Loglama fonksiyonu
function Write-Log {
    param(
        [Parameter(Mandatory=$true)]
        [string]$Message
    )
    
    $TimeStamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
    "$TimeStamp - $Message" | Out-File -FilePath $LogFile -Append
}

Write-Log "Script başlatıldı."

# E-posta ayarları - Kendi SMTP sunucunuza göre düzenleyin
$smtpServer = "smtp.sirketiniz.com"
$smtpPort = 25
$smtpFrom = "it@sirketiniz.com"
$emailSubject = "Önemli Bildirim: Şifreniz yakında sona erecek"
$emailSignature = @"
<p>Saygılarımızla,<br>
IT Departmanı<br>
<strong>Şirketiniz A.Ş.</strong><br>
Tel: +90 212 555 55 55</p>
"@

# Domain bilgileri
$domain = "sirketiniz.com"

# Şifre politikası bilgilerini al
$passwordPolicy = Get-ADDefaultDomainPasswordPolicy
$maxPasswordAge = $passwordPolicy.MaxPasswordAge.Days

# Uyarı yapılacak gün aralıkları
$warningDays = @(14, 7, 3, 1)

# Bugünün tarihini al
$today = Get-Date

Write-Log "Şifre politikası bilgisi alındı. Maksimum şifre yaşı: $maxPasswordAge gün."

# Tüm etkin kullanıcıları al (devre dışı kullanıcılar hariç)
try {
    $users = Get-ADUser -Filter {Enabled -eq $true -and PasswordNeverExpires -eq $false} -Properties Name, EmailAddress, PasswordLastSet, PasswordNeverExpires
    Write-Log "Active Directory'den $($users.Count) aktif kullanıcı alındı."
}
catch {
    Write-Log "Hata: Active Directory'den kullanıcılar alınamadı: $_"
    exit
}

# Her bir kullanıcı için kontrol et
foreach ($user in $users) {
    # Kullanıcının e-posta adresi yoksa atla
    if ([string]::IsNullOrEmpty($user.EmailAddress)) {
        Write-Log "Kullanıcı $($user.Name) için e-posta adresi bulunamadı, atlanıyor."
        continue
    }
    
    # Şifre son değiştirilme tarihi yoksa atla
    if (-not $user.PasswordLastSet) {
        Write-Log "Kullanıcı $($user.Name) için şifre değişiklik tarihi bulunamadı, atlanıyor."
        continue
    }
    
    # Şifre son değişikliğinden bu yana geçen süreyi hesapla
    $passwordSetDate = $user.PasswordLastSet
    $expireDate = $passwordSetDate.AddDays($maxPasswordAge)
    $daysToExpire = (New-TimeSpan -Start $today -End $expireDate).Days
    
    # Belirlenen uyarı günlerinden birinde ise e-posta gönder
    if ($warningDays -contains $daysToExpire) {
        Write-Log "Kullanıcı $($user.Name) için şifre $daysToExpire gün içinde dolacak, bildirim gönderiliyor."
        
        $emailBody = @"
<html>
<head>
    <style>
        body { font-family: Arial, sans-serif; }
        .header { background-color: #0056b3; color: white; padding: 10px; }
        .content { padding: 20px; }
        .footer { font-size: 12px; color: #666; border-top: 1px solid #eee; padding-top: 10px; }
        .highlight { color: red; font-weight: bold; }
    </style>
</head>
<body>
    <div class="header">
        <h2>Şifre Değiştirme Hatırlatması</h2>
    </div>
    <div class="content">
        <p>Sayın $($user.Name),</p>
        <p>Bu e-posta, şirket hesabınızın şifresinin <span class="highlight">$daysToExpire gün içinde</span> sona ereceğini bildirmek için gönderilmiştir.</p>
        <p>Lütfen, erişim kesintisi yaşamamak için şifrenizi en kısa sürede değiştirin.</p>
        
        <h3>Şifre Değiştirme İşlemi:</h3>
        <ol>
            <li>Windows bilgisayarınızda <strong>CTRL+ALT+DEL</strong> tuş kombinasyonunu kullanın</li>
            <li>"Şifre Değiştir" seçeneğini tıklayın</li>
            <li>Mevcut şifrenizi ve yeni şifrenizi girin</li>
        </ol>
        
        <p><strong>Şifre Politikası Hatırlatması:</strong></p>
        <ul>
            <li>En az 8 karakter uzunluğunda olmalı</li>
            <li>Büyük harf, küçük harf, rakam ve özel karakter içermeli</li>
            <li>Son 5 şifrenizden farklı olmalı</li>
        </ul>
        
        <p>Herhangi bir sorunuz veya yardıma ihtiyacınız olursa, lütfen IT Yardım Masası ile iletişime geçin.</p>
    </div>
    <div class="footer">
        $emailSignature
    </div>
</body>
</html>
"@
        
        try {
            # E-posta gönderme
            $smtp = New-Object Net.Mail.SmtpClient($smtpServer, $smtpPort)
            $msg = New-Object Net.Mail.MailMessage
            $msg.From = $smtpFrom
            $msg.To.Add($user.EmailAddress)
            $msg.Subject = $emailSubject
            $msg.Body = $emailBody
            $msg.IsBodyHtml = $true
            
            $smtp.Send($msg)
            Write-Log "E-posta başarıyla gönderildi: $($user.EmailAddress)"
        }
        catch {
            Write-Log "E-posta gönderimi başarısız: $($user.EmailAddress), Hata: $_"
        }
    }
}

Write-Log "Script tamamlandı."

# Çıktıyı göster
Write-Host "Şifre uyarı gönderimi tamamlandı. Lütfen logları kontrol edin: $LogFile" -ForegroundColor Green