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.


Please click to access the English article.

Yorumlar

  1. 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

Yorum Gönder

Bu blogdaki popüler yayınlar

Reporting Exchange Mail Traffic and Login Statistics with PowerShell

Exchange Server 2016/2019 Sertifika Yenileme

Bulk Resetting Active Directory User Passwords