PowerShell ile Exchange Mail Trafiği ve Oturum Açma İstatiklerini Raporlama
Günümüz iş ortamlarında, organizasyonların e-posta
iletişimi kritik bir öneme sahiptir ve bu iletişimi yönetmek ve kullanım
istatistiklerini takip etme ihtiyacı oluşabilir. Bu bağlamda, Exchange
sunucularında bulunan posta kutularının erişim durumlarını ve mail trafiğini
belirli kriterleriniz doğrultusunda izlemek ve raporlamak, bir Exchange
yöneticisi için önem arz etmektedir. Aşağıdaki PowerShell scriptini, posta
kutularının erişim bilgilerini ve mail trafiğini toplamak ve bu verileri
anlamlı bir rapora dönüştürmek için kullanabilirsiniz. Bu yazıda, scriptin
nasıl çalıştığını, hangi bilgileri topladığını, ve nasıl kullanıldığını
detaylı bir şekilde anlatmaya çalışacağım.
Scriptin Genel Yapısı
Script, aşağıdaki başlıkları içermektedir:
1. Gerekli PowerShell Eklentilerinin Eklenmesi
Add-PSSnapin *Exchange*
Add-PSSnapin *Exchange* PowerShell komutu, Exchange Management Shell (EMS)
modülünü eklemek için kullanılır.
2. Değişkenlerin İlk Değerlerle İnitialize Edilmesi
$global:LogonArray = @() $global:LogonNullArray = @() $progress = 0
Bu kısımda, scriptin çalışması sırasında kullanılacak olan global
değişkenlerin tanımlanması ve başlangıç değerlerinin atanması gerçekleşir.
3. Kullanıcı Bilgilerini Toplayan Fonksiyon
# Function to collect mailbox information function getMbxLastLogon ($mailboxes) { foreach ($mailbox in $mailboxes) { $progress++ $percentComplete = ($progress / $mailboxes.count) * 100 # Kullanıcı bilgilerini toplarken ilerlemeyi göster Write-Progress -PercentComplete $percentComplete -Status "Collecting user information, please wait... Progress: $([math]::Ceiling($percentComplete))%" -CurrentOperation "User: $($mailbox.SamAccountName)" -Activity "Mailbox Access" # Mailbox ve kullanıcı bilgilerini al $mailboxInfo = Get-Mailbox -Identity $mailbox.Identity $userInfo = Get-ADUser -Identity $mailboxInfo.SamAccountName -Properties * # Belirli bir tarihten itibaren gönderilen e-posta sayısını al $messagecount = (Get-TransportService | Get-MessageTrackingLog -Sender $mailboxInfo.EmailAddresses.SmtpAddress -EventId SEND -Start $tarih).count # Kullanıcı bilgilerini içeren bir nesne oluştur $userAttribute = [PsCustomObject]@{ Number = $progress SamAccountName = $mailboxInfo.SamAccountName DisplayName = $mailboxInfo.DisplayName GivenName = $userInfo.GivenName SurName = $userInfo.Surname ComputerLastLogon = $userInfo.LastLogonDate ComputerLogonCount = $userInfo.logonCount MailLastLogon = $mailbox.LastLogonTime MailCount = $messagecount } # Küresel diziyi güncelle $global:LogonArray += $userAttribute # Konsola bilgi yaz Write-Host "$($mailbox.DisplayName) has sent $messagecount emails." # İşlem tamamlandı Write-Progress -Completed -Activity "Mailbox Access Information" } $progress = 0 }
Bu fonksiyon, belirtilen posta kutularının bilgilerini toplar ve ardından
bu bilgileri bir diziye ekler ($global:LogonArray). Ayrıca, ilerleme
çubuğunu günceller ve ilgili kullanıcı bilgilerini konsola ve ilerleme
çubuğuna yazdırır.
4. Erişimi Olmayan Kullanıcı Bilgilerini Toplayan Fonksiyon
# Function to collect information for mailboxes that have never been accessed function getMbxLastLogonNull ($mailboxes) { foreach ($mailbox in $mailboxes) { $progress++ $percentComplete = ($progress / $mailboxes.count) * 100 # Kullanıcı bilgilerini toplarken ilerlemeyi göster Write-Progress -PercentComplete $percentComplete -Status "Collecting user information, please wait... Progress: $([math]::Ceiling($percentComplete))%" -CurrentOperation "User: $($mailbox.SamAccountName)" -Activity "No Mailbox Access" # Mailbox ve kullanıcı bilgilerini al $mailboxInfo = Get-Mailbox -Identity $mailbox.Identity $userInfo = Get-ADUser -Identity $mailboxInfo.SamAccountName -Properties * # Belirli bir tarihten itibaren gönderilen e-posta sayısını al $messagecount = (Get-TransportService | Get-MessageTrackingLog -Sender $mailboxInfo.EmailAddresses.SmtpAddress -EventId SEND -Start $tarih).count # Hiç erişilmemiş posta kutusu için bilgiler içeren bir nesne oluştur $userAttribute = [PsCustomObject]@{ Number = $progress SamAccountName = $mailboxInfo.SamAccountName DisplayName = $mailboxInfo.DisplayName GivenName = $userInfo.GivenName SurName = $userInfo.Surname ComputerLastLogon = $userInfo.LastLogonDate ComputerLogonCount = $userInfo.logonCount #MailLastLogon = $mailbox.LastLogonTime #MailCount = $messagecount } # Küresel null diziyi güncelle $global:LogonNullArray += $userAttribute # İşlem tamamlandı Write-Progress -Completed -Activity "Users with No Mailbox Access" } $progress = 0 }
Aynı şekilde bu fonksiyon, belirtilen posta kutularının hiç erişim
yapmamış kullanıcı bilgilerini toplar ve $global:LogonNullArray dizisine
ekler.
5. HTML ve CSS Stilleri
# HTML and CSS variables for reporting $htmlHeader = @" <style> h1 { color: #333; } h2 { color: #444; } table { font-size: 12px; border: 0px; padding: 4px; margin: 0px; border: 0; } th { background: #395870; background: linear-gradient(#49708, #293f50); color: #fff; font-size: 11px; padding: 10px 15px; vertical-align: middle; } tbody tr:nth-child(even) { background: #f0f0f2; } </style> "@
Bu blok, HTML raporunun stilini belirlemek için kullanılır. Özellikle,
başlık (h1, h2), tablo (table, th), ve tablo satırları (tbody
tr:nth-child(even)) gibi öğelerin renkleri, boyutları ve arka planları
gibi stil özelliklerini tanımlar. CSS stil özellikleri, HTML belgesine
dahil edilerek raporun görünümünü özelleştirmeye yardımcı olur.
6. Kullanıcıdan Başlangıç Tarihinin Alınması
# Kullanıcıdan tarih girişi al $tarihInput = Read-Host "Please enter the start date. (MM/DD/YYYY Example: 09/15/2023)" # Tarih formatını kontrol et if ($tarihInput -match "\d{2}/\d{2}/\d{4}") { # Doğru formatta ise $tarih değişkenine at $tarih = [datetime]::ParseExact($tarihInput, "MM/dd/yyyy", $null) Write-Host "Entered date: $($tarih.ToString('MM/dd/yyyy'))" } else { Write-Host "Invalid date format. Please enter a date in MM/DD/YYYY format." }
Bu kod bloğunda, Read-Host ile kullanıcıdan alınan tarih girişi, belirli
bir format kontrolüne tabi tutulmuş ve doğru formatta ise $tarih
değişkenine dönüştürülmüştür. Eğer kullanıcı geçerli bir tarih formatı
girmemişse, bir hata mesajı verilir.
7. Verilerin Toplandığı Organizasyonel Birim (OU)
$OU = "example.tld/Departments/Users"
Bu değişken, scriptin çalıştırılacağı organizasyonel birimi belirtir.
Buradaki alanı kendi Organizasyonel Biriminiz ile değiştiriniz.
8. Posta Kutularının Erişim Bilgilerinin Toplanması
$LogonTime = Get-Mailbox -OrganizationalUnit $OU -RecipientTypeDetails UserMailbox | Get-MailboxStatistics -WarningAction SilentlyContinue | Where-Object { $_.LastLogonTime -gt $tarih }
getMbxLastLogon $LogonTime
Bu kısımda, belirtilen tarihten sonraki erişim bilgilerine sahip posta
kutularının toplanması işlemi gerçekleştirilir.
9. Erişim Yapmamış Kullanıcı Bilgilerinin Toplanması
$LogonNull = Get-Mailbox -OrganizationalUnit $OU -RecipientTypeDetails UserMailbox | Get-MailboxStatistics -WarningAction SilentlyContinue | Where-Object { $_.LastLogonTime -eq $null }
getMbxLastLogonNull $LogonNull
Bu kısımda ise, hiç erişim yapmamış kullanıcı bilgileri toplanır.
10. HTML Raporunun Oluşturulması
$htmlbody = ($global:LogonArray | ConvertTo-Html) + "<h2>Posta kutusunu hic acmamis personeller:</h2></br >" + ($global:LogonNullArray | ConvertTo-Html) $htmlreport = ConvertTo-Html -Body $htmlbody -Head $htmlHeader -PostContent "Mailde oturum acmis kullanici sayisi $($LogonTime.count)</br > Oturum acmayan kullanici sayisi $($LogonNull.count)" $htmlreport > "<path>"
Script, topladığı verileri HTML raporuna dönüştürür ve "<path>"
dosyasına kaydeder. Burada raporun kaydedilmesini istediğiniz yolu rapor
ismi ve uzantısı ile birlikte yazınız. Örnek "C:\report.html"
Bu script, Exchange sunucularında posta kutularının erişim bilgilerini
toplamak ve bunları anlamlı bir şekilde raporlamak için hazırlanmıştır.
Umarım bu yazı, scriptin çalışma mantığını anlamanıza ve
gereksinimlerinize uygun olarak düzenlemenize yardımcı olur.
Paylaşımınız için teşekkürler. Mailbox userlerin takip edilmesi ve Exchange flow akışının gözlenlenebilmesi gibi bilgileri güzel bir şekilde veriyor.
YanıtlaSil