PowerShell ile Office 365 Posta Kutusu Boyutu Raporu


Office 365 Posta Kutusu boyutlarınızı takip etmek önemlidir. “Posta kutusu boyut sınırı aşıldı” gibi hataları önlemek için kullanıcılarınızın posta kutularının gönderme ve alma kotalarına ulaşmasını istemezsiniz.

PowerShell'in yardımıyla size ihtiyacınız olan tüm bilgileri veren bir Office 365 Posta Kutusu Boyutu Raporu oluşturabiliriz.

Aşağıdaki PowerShell betiği, aşağıdaki verileri kullanıcı, paylaşılan ve arşiv posta kutularından bir CSV dosyasına aktarır:

  • Ekran adı
  • Birincil E-postaadresleri
  • Posta kutusu türü
  • Son kullanıcının işlem zamanı
  • Toplam posta kutusu boyutu
  • Silinen öğe boyutu
  • Öğe Sayısı
  • Silinen Öğe Sayısı
  • Sorun Uyarı Boyutu
  • Gönderme Almayı Yasakla Kotası (maksimum posta kutusu boyutu)
  • Arşiv boyutu (kullanıcının bir arşivi varsa)
  • Arşiv Öğesi Sayısı
  • Arşiv Silinen Öğe Sayısı
  • Arşiv uyarı kotası
  • Arşiv kotası

Senaryoyu sizinle paylaşabilirim ancak bir senaryonun nasıl çalıştığını anlamak her zaman iyidir. Ben farklı seçenekleri açıklarken ilk olarak senaryoyu inceleyeceğiz. Yazının sonunda Github'umda betiğin bağlantısını bulacaksınız.

Office 365 Posta Kutusu Boyutu Raporu nasıl kullanılır?

Office 365 Posta Kutusu boyutu raporu komut dosyası birkaç farklı parametreyle çalıştırılabilir. Kimlik doğrulama için her zaman e-posta adresinizi -adminUPN parametresiyle sağlamanız gerekir. Başka parametre olmadan komut dosyası aşağıdakileri içeren bir rapor oluşturur:

  • Paylaşılan posta kutuları
  • Posta kutularını arşivle
  • Raporu komut dosyası kök konumunda saklayın ( .\mailboxsizereport-sep-23-2021.csv)
.\MailboxSizeReport.ps1 -adminUPN john@contoso.com

Paylaşılan Posta Kutuları

Paylaşılan posta kutuları için birkaç seçeneğiniz vardır. Varsayılan olarak dahil edilirler ancak bunları raporun dışında bırakabilir veya -sharedMailboxes parametresiyle yalnızca paylaşılan posta kutularını alabilirsiniz:

# Get only the shared mailboxes
.\MailboxSizeReport.ps1 -adminUPN john@contoso.com -sharedMailboxes only

# Get only the user mailboxes
.\MailboxSizeReport.ps1 -adminUPN john@contoso.com -sharedMailboxes no

# (Default) Get user and shared mailboxes
.\MailboxSizeReport.ps1 -adminUPN john@contoso.com -sharedMailboxes include

Posta Kutularını Arşivle

Varsayılan olarak, kullanıcının bir arşiv posta kutusu varsa, arşiv posta kutularının istatistiklerini de topluyoruz. Arşiv posta kutularını istemiyorsanız (komut dosyasını biraz yavaşlatırlar), -archive:$false parametresini kullanın:

# Don't get the archive mailboxes
.\MailboxSizeReport.ps1 -adminUPN john@contoso.com -archive:$false

CSV Dışa Aktarma Yolu

-csvpath parametresiyle bir çıktı dosyası ve yolu tanımlayabilirsiniz.

# Define path for CSV file
.\MailboxSizeReport.ps1 -adminUPN john@contoso.com -csvpath c:\temp\mailboxsizereport.csv

Posta Kutusu Boyutu Raporu Komut Dosyası

Office 365 posta kutusu boyutunu elde etmek için öncelikle Exchange Online'a bağlanmamız gerekiyor. Daha sonra raporun tamamını oluşturmak için hem posta kutusu özelliklerine hem de posta kutusu istatistiklerine ihtiyacımız var.

Betik için Exchange Online v2 Modülünü kullandım. Yeni Exchange Online modülünün avantajı MFA ve SSON'u desteklemesidir. Bu şekilde yalnızca e-posta adresinizi girmeniz yeterlidir ve herhangi bir kullanıcı etkileşimi olmadan Exchange Online'a bağlanabiliriz.

Komut dosyasının diğer bilgisayarlarda kullanımını kolaylaştırmak için Exchange Çevrimiçi Yönetim modülü için bir onay işareti ve kullanılamadığında onu yükleme seçeneği ekledim. Birden fazla bağlantıyı önlemek için mevcut bir Exchange Online bağlantısını da kontrol ederiz.

Kodun bir örneğini bu makalede bulabilirsiniz.

PowerShell ile Posta Kutusu Boyutunu Alın

Posta kutusu istatistiklerini almak için öncelikle tüm posta kutularını toplamamız gerekir. PowerShell'deki Get-Mailbox cmdlet'i tüm posta kutusu özelliklerini döndürürken Get-MailboxStatistics, posta kutusu kullanımıyla ilgili bilgileri döndürür.

Öncelikle raporumuz için istediğimiz tüm posta kutularını alıyoruz

Function Get-Mailboxes {
  <#
    .SYNOPSIS
        Get all the mailboxes for the report
  #>
  process {
    switch ($sharedMailboxes)
    {
      "include" {$mailboxTypes = "UserMailbox,SharedMailbox"}
      "only" {$mailboxTypes = "SharedMailbox"}
      "no" {$mailboxTypes = "UserMailbox"}
    }

    Get-EXOMailbox -ResultSize unlimited  -RecipientTypeDetails $mailboxTypes -Properties IssueWarningQuota, ProhibitSendReceiveQuota, ArchiveQuota, ArchiveWarningQuota, ArchiveDatabase | 
      select UserPrincipalName, DisplayName, PrimarySMTPAddress, RecipientType, IssueWarningQuota, ProhibitSendReceiveQuota, ArchiveQuota, ArchiveWarningQuota, ArchiveDatabase
  }
}

SharedMailboxes parametresine dayanarak bunları dahil etmek isteyip istemediğimizi belirleriz. Get-EXOMailbox cmdlet'inden birkaç ekstra özellik almamız gerekiyor:

  • SorunUyarıKota
  • YasaklaGönderAl Kota
  • ArşivKota
  • ArşivUyarıKota
  • ArşivVeritabanı

ArchiveDatabase özelliği ile kullanıcı mailinin aynı zamanda arşiv mail kutusunun olup olmadığını tespit edebiliriz. Seçimi kullanarak yalnızca posta kutusu raporunda ihtiyacımız olan alanları döndürürüz.

PowerShell'de Get-Mailbox İstatistikleri

Her posta kutusu için posta kutusu istatistiklerini alacağız. Artık kullanıcıların arşiv posta kutularını da dahil etmek istiyoruz. Bunun için Get-EXOMailboxStatistics cmdlet'ini iki kere çalıştırmamız gerekecek. Bir kez normal posta kutusu için, bir kez de arşiv posta kutusu için.

Şimdi ikincisinin çok daha yavaş olduğunu fark ettim. Nedenini tam olarak bilmiyorum ama arşiv posta kutusundan istatistik istemek normal posta kutusundan belirgin şekilde daha uzun sürüyor.

Normal posta kutusu için PowerShell'de aşağıdaki cmdlet'i kullanabiliriz:

# Get mailbox size
$mailboxSize = Get-EXOMailboxStatistics-Identity $_.UserPrincipalName | Select TotalItemSize,TotalDeletedItemSize,ItemCount,DeletedItemCount,LastUserActionTime

Arşiv posta kutusu için öncelikle arşiv posta kutusunu isteyip istemediğimizi ve ardından ArchiveDatabase özelliğinin ayarlanıp ayarlanmadığını kontrol ederiz:

# Get archive size if it exists and is requested
$archiveSize = 0

if ($archive.IsPresent -and ($_.ArchiveDatabase -ne $null)) {
        $result = Get-EXOMailboxStatistics -UserPrincipalName $_.UserPrincipalName -Archive | Select ItemCount,DeletedItemCount,@{Name = "TotalArchiveSize"; Expression = {$_.TotalItemSize.ToString().Split("(")[0]}}
        if ($result -ne $null) {
          $archiveSize = ConvertTo-Gb -size $result.TotalArchiveSize
        }else{
          $archiveSize = 0
        }
}  

Arşivi olmayan posta kutuları için archiveSize'ı 0'a ayarladık ve archiveResult'u sıfırladık.

Tüm veriler bir PSCustomObject'e konur ve bu da onu daha sonra kolayca bir CSV dosyasına aktarmamızı sağlar.

Function Get-MailboxStats {
  <#
    .SYNOPSIS
        Get the mailbox size and quota
  #>
  process {
    $mailboxes = Get-Mailboxes
    $i = 0

    $mailboxes | ForEach-Object {

      # Get mailbox size     
      $mailboxSize = Get-EXOMailboxStatistics-identity $_.UserPrincipalName | Select-Object TotalItemSize,TotalDeletedItemSize,ItemCount,DeletedItemCount,LastUserActionTime

      if ($null -ne $mailboxSize) {
      
        # Get archive size if it exists and is requested
        $archiveSize = 0
        $archiveResult = $null

        if ($archive.IsPresent -and ($null -ne $_.ArchiveDatabase)) {
          $archiveResult = Get-EXOMailboxStatistics -UserPrincipalName $_.UserPrincipalName -Archive | Select-Object ItemCount,DeletedItemCount,@{Name = "TotalArchiveSize"; Expression = {$_.TotalItemSize.ToString().Split("(")[0]}}
          if ($null -ne $archiveResult) {
            $archiveSize = ConvertTo-Gb -size $archiveResult.TotalArchiveSize
          }
        }

        write-host $mailboxSize.TotalDeletedItemSize
    
        [pscustomobject]@{
          "Display Name" = $_.DisplayName
          "Email Address" = $_.PrimarySMTPAddress
          "Mailbox Type" = $_.RecipientTypeDetails
          "Last User Action Time" = $mailboxSize.LastUserActionTime
          "Total Size (GB)" = ConvertTo-Gb -size $mailboxSize.TotalItemSize.ToString().Split("(")[0]
          "Deleted Items Size (GB)" = ConvertTo-Gb -size $mailboxSize.TotalDeletedItemSize.ToString().Split("(")[0]
          "Item Count" = $mailboxSize.ItemCount
          "Deleted Items Count" = $mailboxSize.DeletedItemCount
          "Mailbox Warning Quota (GB)" = ($_.IssueWarningQuota.ToString().Split("(")[0]).Split(" GB") | Select-Object -First 1
          "Max Mailbox Size (GB)" = ($_.ProhibitSendReceiveQuota.ToString().Split("(")[0]).Split(" GB") | Select-Object -First 1
          "Mailbox Free Space (GB)" = (($_.ProhibitSendReceiveQuota.ToString().Split("(")[0]).Split(" GB") | Select-Object -First 1) - (ConvertTo-Gb -size $mailboxSize.TotalItemSize.ToString().Split("(")[0])
          "Archive Size (GB)" = $(if($null -ne $archiveResult) {ConvertTo-Gb -size $archiveResult.TotalArchiveSize} else {'-'})
          "Archive Items Count" = $(if($null -ne $archiveResult) {$archiveResult.ItemCount} else {'-'}) 
          "Archive Mailbox Free Space (GB)*" = $(if($null -ne $archiveResult) {(ConvertTo-Gb -size $_.ArchiveQuota.ToString().Split("(")[0]) - $archiveSize} else {'-'})
          "Archive Deleted Items Count" = $(if($null -ne $archiveResult) {$archiveResult.DeletedItemCount} else {'-'})
          "Archive Warning Quota (GB)" = $(if($null -ne $archiveResult) {($_.ArchiveWarningQuota.ToString().Split("(")[0]).Split(" GB") | Select-Object -First 1} else {'-'})
          "Archive Quota (GB)" = $(if($null -ne $archiveResult) {(ConvertTo-Gb -size $_.ArchiveQuota.ToString().Split("(")[0])} else {'-'})
        }

        $currentUser = $_.DisplayName
        Write-Progress -Activity "Collecting mailbox status" -Status "Current Count: $i" -PercentComplete (($i / $mailboxes.Count) * 100) -CurrentOperation "Processing mailbox: $currentUser"
        $i++;
      }
    }
  }
}

Tüm boyutları GB'ye dönüştürdüğümüzü fark etmişsinizdir. Bunun nedeni Get-MailboxStatistics'in boyutu, boyuta bağlı olarak KB, MB veya GB cinsinden döndürmesidir. Ancak bir raporda tek bir birimin olması çok daha uygundur.

Yani aşağıdaki fonksiyonla tüm boyutları GB'ye dönüştürebilir ve bunları iki ondalık sayıya yuvarlayabiliriz:

Function ConvertTo-Gb {
  <#
    .SYNOPSIS
        Convert mailbox size to Gb for uniform reporting.
  #>
  param(
    [Parameter(
      Mandatory = $true
    )]
    [string]$size
  )
  process {
    if ($size -ne $null) {
      $value = $size.Split(" ")

      switch($value[1]) {
        "GB" {$sizeInGb = ($value[0])}
        "MB" {$sizeInGb = ($value[0] / 1024)}
        "KB" {$sizeInGb = ($value[0] / 1024 / 1024)}
        "B"  {$sizeInGb = 0}
      }

      return [Math]::Round($sizeInGb,2,[MidPointRounding]::AwayFromZero)
    }
  }
}

Komut Dosyasının Tamamını İndirin

Komut dosyasının tamamını GitHub sayfamdan indirebilirsiniz. İlk önce küçük bir posta kutusu setinde test etmenizi öneririm. Örneğin, satır 122'deki (Get-EXOMailboxes) ResultSize değerini sınırsızdan 10'a değiştirin.

# Change this line
Get-EXOMailbox -ResultSize unlimited -RecipientTypeDetails $mailboxTypes -Properties IssueWarningQuota, ProhibitSendReceiveQuota, ArchiveQuota, ArchiveWarningQuota, ArchiveDatabase | 
      select UserPrincipalName, DisplayName, PrimarySMTPAddress, RecipientType, RecipientTypeDetails, IssueWarningQuota, ProhibitSendReceiveQuota, ArchiveQuota, ArchiveWarningQuota, ArchiveDatabase

# To 
Get-EXOMailbox -ResultSize 10 -RecipientTypeDetails $mailboxTypes -Properties IssueWarningQuota, ProhibitSendReceiveQuota, ArchiveQuota, ArchiveWarningQuota, ArchiveDatabase | 
      select UserPrincipalName, DisplayName, PrimarySMTPAddress, RecipientType, RecipientTypeDetails, IssueWarningQuota, ProhibitSendReceiveQuota, ArchiveQuota, ArchiveWarningQuota, ArchiveDatabase

Kapanış

Bu betiği PowerShell komut satırınızdan kolayca çalıştırmak için profilinize betiği işaret eden bir takma ad ekleyebilirsiniz. Bu makaledeki PowerShell profilinizi ayarlama veya genel olarak PowerShell komut dosyalarının nasıl çalıştırılacağı hakkındaki her şeyi okuyun.

Umarım bu betiği faydalı bulursunuz. Herhangi bir sorunuz varsa aşağıya bir yorum bırakmanız yeterli.

Aşağıdaki PowerShell rapor komut dosyalarından birini de beğenebilirsiniz:

  • Posta kutusu izinleri raporu
  • OneDrive boyut raporu
  • MFA Durum raporu

İlgili makaleler