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

Active Directory'de şifre süreleri dolmadan kullanıcıları otomatik olarak uyaran PowerShell scripti
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( $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 (::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 > <h2>Şifre Değiştirme Hatırlatması</h2> </div> <div > <p>Sayın $($user.Name),</p> <p>Bu e-posta, şirket hesabınızın şifresinin <span >$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 > $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