Active Directory’de Uzun Süre Pasif Kalan Kullanıcıları Mail Yoluyla Raporlama

Merhabalar Active Directory’ de uzun zamandır aktif olmayan hesabına giriş yapmayan kullanıcılar olabiliyor, küçük işletmelerde tespit etmek çok zor olmayabiliyor. Fakat 500-1000 ve üzeri kullanıcı olduğunda bunları takip etmesi sanıldığı kadar kolay olmayabiliyor.

Bunun için sizlere vereceğim kodlar ile mail yoluyla 30 gündür aktif olmayan kullanıcıların raporlamasını alacaksınız.

Şimdi gelelim kodlara:

# Active Directory modülünü yükle
Import-Module ActiveDirectory

# İnaktif kullanıcıları bulmak için gün sayısını ayarlayın
$inactiveDays = 30
$date = (Get-Date).AddDays(-$inactiveDays)

# İnaktif kullanıcıları alın ve son bağlantı tarihine göre sıralayın
$inactiveUsers = Get-ADUser -Filter {LastLogonDate -lt $date} -Properties LastLogonDate, DistinguishedName |
Select-Object Name, SamAccountName, LastLogonDate, DistinguishedName |
Sort-Object LastLogonDate -Descending

# Eğer hiç kullanıcı bulunmazsa, uyarı ver
if ($inactiveUsers.Count -eq 0) {
Write-Host "30 günden fazla süredir oturum açmamış kullanıcı bulunamadı."
exit
}

# Toplam kullanıcı sayısını belirle
$totalUsers = $inactiveUsers.Count

# Kaç gündür etkin olmadığını hesaplayan fonksiyon
function Get-DaysInactive {
param (
[datetime]$LastLogonDate
)
return ((Get-Date) - $LastLogonDate).Days
}

# OU bilgisini çıkartan fonksiyon
function Get-OU {
param (
[string]$DistinguishedName
)
# DistinguishedName'den OU kısmını ayırmak için ',' karakterine göre ayırma ve ilk OU öğesini almak
$ouParts = $DistinguishedName -split ',' | Where-Object { $_ -like "OU=*" }
$ou = $ouParts -join ', ' # OU bilgisini oluştur
return $ou
}

# HTML formatına çevir ve meta etiket ile UTF-8 kodlaması belirt
$htmlReport = "<html><head><meta charset='UTF-8'><style>
table {
width: 80%;
border-collapse: collapse;
font-family: Arial, sans-serif;
margin: 0 auto; /* Tabloyu ortala */
}
th, td {
border: 1px solid #dddddd;
text-align: left;
padding: 8px;
}
th {
background-color: #d9eaf7; /* Açık mavi başlık arka plan rengi */
}
tr:nth-child(even) {
background-color: #f2f9ff; /* Açık mavi satır arka plan rengi */
}
tr:nth-child(odd) {
background-color: #ffffff; /* Beyaz satır arka plan rengi */
}
h1 {
text-align: center; /* Başlığı ortala */
}
p {
text-align: center; /* Toplam kullanıcı sayısını ortala */
font-size: 24px; /* Toplam kullanıcı sayısını büyüt */
}
.body-text {
font-size: 12pt; /* E-posta içeriğinde 12 punto yazı büyüklüğü */
line-height: 1.5; /* Satır yüksekliğini artır */
}
.small-text {
font-size: 12pt; /* Küçük metin boyutu */
}
</style></head><body><h1>KIVANÇ - Etkin Olmayan AD Kullanıcıları Raporu</h1><p><strong>30 Gündür Etkin Olmayan Kullanıcı Sayısı:</strong> $totalUsers</p>"

# Kullanıcıları tabloya ekle
$htmlReport += "<table><tr><th>Kullanıcı</th><th>Kullanıcı Adı</th><th>AD Klasörü</th><th>Son Giriş Tarihi</th><th>Etkin Olunmayan Gün Sayısı</th></tr>"

foreach ($user in $inactiveUsers) {
$daysInactive = Get-DaysInactive -LastLogonDate $user.LastLogonDate
$ou = Get-OU -DistinguishedName $user.DistinguishedName
# Tarihi gün ay yıl formatında yaz
$formattedLastLogonDate = $user.LastLogonDate.ToString("dd MMM yyyy")
$htmlReport += "<tr><td>$($user.Name)</td><td>$($user.SamAccountName)</td><td>$ou</td><td>$formattedLastLogonDate</td><td>$daysInactive</td></tr>"
}

$htmlReport += "</table></body></html>"

# Geçici dosya yolu
$htmlFilePath = "C:\temp\inactive_users_report.html"

# HTML içeriğini UTF-8 kodlamasıyla geçici dosyaya yaz
$htmlReport | Out-File -FilePath $htmlFilePath -Encoding UTF8

# SMTP sunucusu ayarları
$smtpServer = "10.1.0.3"
$smtpPort = 25
$from = "bt.tarama@kivanc.com"
$to = "bt.destek@kivanc.com" # Tek bir alıcı e-posta adresi
$subject = "Etkin Olmayan AD Kullanıcıları Raporu"

# E-posta gönderme işlemi
try {
if (Test-Path $htmlFilePath) {
# Attachment nesnesi oluştur
$attachment = New-Object System.Net.Mail.Attachment($htmlFilePath)
# E-posta gönder
$mailMessage = New-Object system.net.mail.mailmessage
$mailMessage.From = $from
$mailMessage.To.Add($to) # Tek bir alıcı e-posta adresi
$mailMessage.Subject = $subject
$mailMessage.Body = @"
Merhabalar,

30 Gündür Etkin Olmayan AD Kullanıcıları Raporu ektedir.

i̇yi çalışmalar.
"@
$mailMessage.IsBodyHtml = $true
$mailMessage.Attachments.Add($attachment)

# SMTP istemcisi oluştur ve e-postayı gönder
$smtpClient = New-Object Net.Mail.SmtpClient($smtpServer, $smtpPort)
$smtpClient.Send($mailMessage)

# E-posta gönderimi tamamlandıktan sonra dosya nesnesini serbest bırak
$mailMessage.Dispose()
$attachment.Dispose()

Write-Host "E-posta başarıyla gönderildi."
} else {
Write-Host "Dosya bulunamadı: $htmlFilePath"
}
} catch {
Write-Host "E-posta gönderme işlemi başarısız oldu. Hata: $_"
} finally {
# Dosyanın erişilebilir olduğundan emin olana kadar bekle
$maxRetries = 10
$retryInterval = 5 # saniye
$retryCount = 0

while ($retryCount -lt $maxRetries) {
try {
if (Test-Path $htmlFilePath) {
# Dosya işleminden sonra dosya kapama ve serbest bırakma
[System.GC]::Collect() # Çöp toplama işlemi başlat
[System.GC]::WaitForPendingFinalizers() # Çöp toplama işlemlerinin tamamlanmasını bekle
Remove-Item $htmlFilePath -Force
Write-Host "Geçici dosya başarıyla silindi."
break
}
} catch {
Write-Host "Dosya silme işlemi başarısız oldu. Hata: $_. Yeniden deneme..."
Start-Sleep -Seconds $retryInterval
$retryCount++
}
}

if ($retryCount -eq $maxRetries) {
Write-Host "Geçici dosya silme işlemi başarısız oldu. Dosya hala kullanımda olabilir."
}
}

Evet kodlar bu şekilde burada SMTP ayarlarını kendi bilgilerinize göre dolduruyorsunuz.

Bu kodları çalıştırmadan önce DC Server’ da C:\ dizinine temp adında bir klasör oluşturmanız gerekiyor, oluşturmaz iseniz hata verecektir.

Bu klasörün amacı oraya geçici bir html dosyası atıp oradan html formatında bir mail göndermesi için, mail gönderdikten sonra otomatik kendisi silecektir.

Daha sonra DC Server’ da PowerShell‘i yönetici olarak çalıştırıyoruz ve düzenlediğiniz kodları oraya yapıştırıyorsunuz, herhangi bir hatalı işlem olduğunda size uyarı mesajı verecektir.

Evet gördüğünüz gibi başarıyla gönderildi yazıyor ve gönderdikten sonra geçici dosya başarıyla silindi.

Şimdi nasıl bir mail geliyor bize onu görelim.

Alıcı mail adresine gelen mail bu şekilde bir de son olarak ekteki html dosyasının ekran çıktısını sizlere göstereceğim.

Evet gördüğünüz gibi tabloyu özel olarak tasarladım bazı bilgileri bulanıklaştırmak zorundayım. Evet size anlatacaklarım bu kadar, gayet başarılı bir şekilde bizlere rapor veriyor. Siz dilerseniz bunu görev zamanlayıcısı ile otomatik günlük, haftalık ya da aylık olacak şekilde otomatik raporlama yapmasını sağlayabilirsiniz.

Umarım faydalı olmuştur takıldığınız yerde sorabilirsiniz.

Yorum

Henüz yorum yok. Neden tartışmaya başlamıyorsunuz?

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir