Поиск по сайту:

Отчет о размере почтового ящика Office 365 с помощью PowerShell


Важно отслеживать размеры почтовых ящиков Office 365. Вы не хотите, чтобы почтовые ящики ваших пользователей достигли своего лимита на отправку и получение, чтобы избежать ошибок, таких как "Превышен лимит размера почтового ящика".

С помощью PowerShell мы можем создать отчет о размере почтового ящика Office 365, который предоставит вам всю необходимую информацию.

Скрипт PowerShell ниже экспортирует следующие данные из почтовых ящиков пользователей, общих и архивных в файл CSV:

  • Отображаемое имя
  • Основной адрес электронной почты
  • Тип почтового ящика
  • Время последнего действия пользователя
  • Общий размер почтового ящика
  • Размер удаленного элемента
  • Количество элементов
  • Количество удалённых элементов
  • Предупреждение о размере
  • Запретить отправку и получение квоты (максимальный размер почтового ящика)
  • Размер архива (если у пользователя есть архив)
  • Количество элементов архива
  • Количество удаленных элементов архива
  • Предупреждение о квоте архива
  • Квота архива

Экспорт отчета о размере почтового ящика Office 365

Я могу просто поделиться сценарием с вами, но всегда полезно понять, как работает сценарий. Поэтому сначала мы пройдемся по сценарию, пока я объясняю различные опции. В конце статьи вы найдете ссылку на сценарий в моем Github.

Как использовать отчет о размере почтового ящика Office 365

Скрипт отчета о размере почтового ящика Office 365 можно запустить с несколькими различными параметрами. Вы всегда должны указать свой адрес электронной почты для аутентификации с помощью параметра -adminUPN. Без каких-либо дополнительных параметров скрипт сгенерирует отчет с:

  • Совместные почтовые ящики
  • Архивные почтовые ящики
  • Сохраните отчет в корневом каталоге скрипта ( .\mailboxsizereport-sep-23-2021.csv)
.\MailboxSizeReport.ps1 -adminUPN john@contoso.com

Совместные почтовые ящики

У вас есть несколько вариантов для общих почтовых ящиков. По умолчанию они включены, но вы можете исключить их из отчета или получить только общие почтовые ящики с помощью параметра -sharedMailboxes:

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

Архивные почтовые ящики

По умолчанию мы также собираем статистику архивных почтовых ящиков, если у пользователя есть архивный почтовый ящик. Если вы не хотите, чтобы архивные почтовые ящики использовались (они немного замедляют выполнение скрипта), используйте параметр -archive:$false:

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

Путь экспорта CSV

Вы можете определить файл вывода и путь с помощью параметра -csvpath.

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

Скрипт отчета о размере почтового ящика

Чтобы получить размер почтового ящика Office 365, сначала необходимо подключиться к Exchange Online. Затем нам нужны как свойства почтового ящика, так и статистика почтового ящика для создания полного отчета.

Я использовал модуль Exchange Online v2 для скрипта. Преимуществом нового модуля Exchange Online является поддержка MFA и SSON. Таким образом, вам нужно ввести только ваш адрес электронной почты, и мы можем подключиться к Exchange Online без какого-либо взаимодействия с пользователем.

Чтобы сделать сценарий более удобным для использования на других компьютерах, я добавил проверку модуля управления Exchange Online и возможность его установки, если он недоступен. Мы также проверяем наличие существующего подключения к Exchange Online, чтобы предотвратить множественные подключения.

Вы можете найти образец кода здесь, в этой статье.

Получить размер почтового ящика с помощью PowerShell

Чтобы получить статистику почтовых ящиков, сначала необходимо собрать все почтовые ящики. Команда Get-Mailbox в PowerShell возвращает все свойства почтовых ящиков, тогда как команда Get-MailboxStatistics возвращает информацию о использовании почтовых ящиков.

Сначала мы получаем все почтовые ящики, которые нам нужны для нашего отчета.

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 мы определяем, хотим ли мы включить их или нет. Из командлета Get-EXOMailbox нам нужно получить несколько дополнительных свойств:

  • Квота предупреждений по проблемам
  • Запретить квоту на отправку и получение
  • ArchiveQuota
  • Предупреждение о квоте архива
  • ArchiveDatabase

С помощью свойства ArchiveDatabase мы можем определить, есть ли у пользователя почта также архивный почтовый ящик. Используя оператор select, мы возвращаем только те поля, которые нам нужны в отчете о почтовом ящике.

Получить-статистику почтового ящика в PowerShell

Для каждого почтового ящика мы собираемся получить статистику почтового ящика. Теперь мы также хотим включить архивный почтовый ящик пользователей. Для этого нам нужно будет дважды выполнить командлет Get-EXOMailboxStatistics. Один раз для обычного почтового ящика и один раз для архивного почтового ящика.

Теперь я заметил, что последний работает намного медленнее. Я не знаю точно почему, но запрос статистики из архивного почтового ящика занимает заметно больше времени, чем из обычного почтового ящика.

Для обычного почтового ящика мы можем просто использовать следующий командлет в PowerShell:

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

Для архивного почтового ящика мы сначала проверяем, нужен ли нам архивный почтовый ящик, а затем, установлено ли свойство ArchiveDatabase:

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
        }
}  

Для почтовых ящиков без архива мы устанавливаем archiveSize равным 0 и сбрасываем archiveResult.

Все данные помещаются в PSCustomObject, что позволяет нам легко экспортировать их позже в файл CSV.

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++;
      }
    }
  }
}

Вы могли заметить, что мы конвертируем все размеры в ГБ. Причина этого в том, что команда Get-MailboxStatistics возвращает размер в КБ, МБ или ГБ, в зависимости от объема. Но в отчете гораздо удобнее использовать единую единицу.

Итак, с помощью функции ниже мы можем преобразовать все размеры в ГБ и округлить их до двух знаков после запятой:

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)
    }
  }
}

Скачайте полный сценарий

Вы можете скачать полный скрипт с моей страницы на GitHub. Я рекомендую сначала протестировать его на небольшом наборе почтовых ящиков. Измените ResultSize в строке 122 (Get-EXOMailboxes) с unlimited на 10, например.

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

Завершение

Чтобы легко запустить этот скрипт из командной строки PowerShell, вы можете добавить псевдоним в свой профиль, указывающий на скрипт. Ознакомьтесь со всеми вопросами настройки вашего профиля PowerShell в этой статье или с тем, как запускать PowerShell скрипты в целом в этой статье.

Надеюсь, вы найдете этот скрипт полезным. Если у вас есть вопросы, просто оставьте комментарий ниже.

Вам также могут понравиться один из следующих скриптов отчетов PowerShell:

  • Отчет о разрешениях почтового ящика
  • Отчет о размере OneDrive
  • Отчет о состоянии МИД