Отчет о размере почтового ящика Office 365 с помощью PowerShell
Важно отслеживать размеры почтовых ящиков Office 365. Вы не хотите, чтобы почтовые ящики ваших пользователей достигли своего лимита на отправку и получение, чтобы избежать ошибок, таких как "Превышен лимит размера почтового ящика".
С помощью PowerShell мы можем создать отчет о размере почтового ящика Office 365, который предоставит вам всю необходимую информацию.
Скрипт PowerShell ниже экспортирует следующие данные из почтовых ящиков пользователей, общих и архивных в файл CSV:
- Отображаемое имя
- Основной адрес электронной почты
- Тип почтового ящика
- Время последнего действия пользователя
- Общий размер почтового ящика
- Размер удаленного элемента
- Количество элементов
- Количество удалённых элементов
- Предупреждение о размере
- Запретить отправку и получение квоты (максимальный размер почтового ящика)
- Размер архива (если у пользователя есть архив)
- Количество элементов архива
- Количество удаленных элементов архива
- Предупреждение о квоте архива
- Квота архива
Я могу просто поделиться сценарием с вами, но всегда полезно понять, как работает сценарий. Поэтому сначала мы пройдемся по сценарию, пока я объясняю различные опции. В конце статьи вы найдете ссылку на сценарий в моем 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
- Отчет о состоянии МИД

