PowerShell 7 ile Şifre Süresi Dolmak Üzere Olan 500+ Personele Otomatik HTML E-Posta Gönderen Zamanlanmış Görev
Kurumsal Active Directory ortamlarında güvenlik politikası gereği kullanıcı parolaları 90 günde bir değiştirilmeye zorlanır. Ancak Windows'un yerleşik şifre değişim uyarısı yalnızca kullanıcı şirket ağındaki bir masaüstü bilgisayarda oturum açtığında görünür; uzaktan çalışan, VPN kullanan veya yalnızca cep telefonundan maillerine bakan personeller bu uyarıyı görmez. Sonuç: Şifresi dolan personel sisteme giremez, şifre sıfırlama çağrıları yardım masasını kilitler. Bu süreci sıfır insan müdahalesiyle çözen PowerShell 7 Şifre Uyarı Botu.
1. Mantık ve Kapsam Kriterleri
Betik her sabah saat 08:30'da çalışır ve Active Directory'yi tarar:
- Hesabı kilitli veya devre dışı (disabled) olanları atlar.
- Şifresi asla sona ermeyen (PasswordNeverExpires) servis hesaplarını hariç tutar.
- Şifresinin dolmasına 7 gün, 3 gün ve 1 gün kalan kullanıcılara kurumsal kimliğe uygun, renkli bir HTML e-posta fırlatır.
2. Üretim Seviyesinde PowerShell 7 Betiği
# ActiveDirectory Modülünü İçe Aktarma
Import-Module ActiveDirectory
$MaxPasswordAgeDays = (Get-ADDefaultDomainPasswordPolicy).MaxPasswordAge.Days
$WarningDays = @(7, 3, 1)
$SMTPServer = "smtp.holding.local"
$FromAddress = "Bilgi Islem <bilgiislem@holding.com.tr>"
$Users = Get-ADUser -Filter {Enabled -eq $true -and PasswordNeverExpires -eq $false} `
-Properties "DisplayName", "EmailAddress", "PasswordLastSet"
foreach ($User in $Users) {
if ([string]::IsNullOrEmpty($User.EmailAddress)) { continue }
$PasswordSetDate = $User.PasswordLastSet
if ($null -eq $PasswordSetDate) { continue }
$ExpiresDate = $PasswordSetDate.AddDays($MaxPasswordAgeDays)
$DaysRemaining = ($ExpiresDate - (Get-Date)).Days
if ($WarningDays -contains $DaysRemaining) {
$Subject = "UYARI: Kurumsal Şifrenizin Süresi $DaysRemaining Gün İçinde Doluyor!"
$HTMLBody = @"
<html>
<body style='font-family: Arial, sans-serif; background-color: #f4f6f8; padding: 20px;'>
<div style='max-width: 600px; background-color: #ffffff; border-radius: 8px; padding: 30px; border-left: 6px solid #e53e3e;'>
<h2 style='color: #2d3748;'>Sayın $($User.DisplayName),</h2>
<p>Şirket güvenlik politikaları gereğince Active Directory oturum şifrenizin süresi <strong>$DaysRemaining gün</strong> sonra dolacaktır.</p>
<div style='background-color: #fffaf0; border: 1px solid #feebc8; padding: 15px; border-radius: 6px; margin: 20px 0;'>
<p style='margin: 0; color: #7b341e;'><strong>Son Geçerlilik Tarihi:</strong> $($ExpiresDate.ToString('dd MMMM yyyy HH:mm'))</p>
</div>
<p>İş sürekliliğinizin aksamaması için lütfen bilgisayarınızda <strong>Ctrl + Alt + Del</strong> tuşlarına basarak <em>'Parola Değiştir'</em> adımını tamamlayınız.</p>
<p style='color: #718096; font-size: 12px; margin-top: 30px;'>Bu e-posta sistem tarafından otomatik olarak gönderilmiştir. Sorularınız için Bilgi İşlem Masası (Dahili: 1111) ile iletişime geçebilirsiniz.</p>
</div>
</body>
</html>
"@
Send-MailMessage -SmtpServer $SMTPServer -From $FromAddress -To $User.EmailAddress `
-Subject $Subject -Body $HTMLBody -BodyAsHtml -Encoding UTF8
}
}
3. Windows Task Scheduler ile Zamanlama
Betiğin kesintisiz çalışması için özel bir servis hesabı (svc_task_scheduler) atanarak Windows Task Scheduler üzerine bağlanır:
- Tetikleyici: Her gün saat 08:30.
- Program:
pwsh.exe(PowerShell 7) - Argüman:
-NoProfile -ExecutionPolicy Bypass -File C:\Scripts\Notify-PasswordExpiry.ps1
Karşılaşılan Kritik Hatalar ve Çözüm İpuçları
- Yetkisiz SMTP Röle Engeli: Şirket içi Exchange veya Postfix sunucusu bu betiği çalıştıran sunucunun IP'sini tanımıyorsa
Mailbox unavailable / Relaying deniedhatası verir. SMTP sunucusunda ilgili script sunucusunun IP'sine anonim veya kimlik doğrulamalı röle (relay) izni tanımlanmalıdır.
Mühendis Notu
Bu basit 50 satırlık otomasyon devreye alındığı ilk hafta, pazartesi sabahları şifresi kilitlendiği için arayan personel sayısını %90 oranında azalttı. Küçük bir script, yüzlerce saatlik yardım masası mesaisini kurtarır.
