Заметки · 26.04.2023

От нуля до квоты

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

Из коробки функционал получения размера притаился в разделе «Использование почтового ящика«, а динамики можно добиться только с помощью обновления веб-страницы.

Чтобы узнать объём почтового ящика на сервере Exchange без путешествий по веб-страницам и иметь представление об его изменениях обратимся к магии PowerShell:

[System.Console]::Title = "Размер почтового ящика Exchange"
$server = "MAIL" # <== Указывается имя почтового сервера

# Предупреждение про модуль ActiveDirectory #
Write-Host "Для работы скрипта требуется модуль RSAT-AD-PowerShell!" -ForegroundColor Yellow
Write-Host
Sleep(5)

# Поиск модуля ActiveDirectoryObjectPicker #
if (Get-InstalledModule ActiveDirectoryObjectPicker -ErrorAction SilentlyContinue)
{
    Write-Host "Импорт модуля ActiveDirectoryObjectPicker..." -ForegroundColor Yellow
    Import-Module -Name ActiveDirectoryObjectPicker
}
else
{
    Write-Host "Установка модуля ActiveDirectoryObjectPicker..." -ForegroundColor Yellow
    Install-Module -Name ActiveDirectoryObjectPicker -Scope CurrentUser
}

# Проверка доступности сервера #
$testping = Test-Connection -Quiet -Count 1 -ComputerName $server
if ($testping)
{
   # Подключение к почтовому серверу Exchange #
   Write-Host "Идёт подключение к серверу $server..." -ForegroundColor Yellow
   $session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri http://$server/PowerShell/ -Authentication Kerberos
   Import-PSSession $session
   clear
    
   # Получение UPN с помощью ActiveDirectoryObjectPicker #
   Write-Host "Ожидание пользовательских данных..." -ForegroundColor Yellow
   $upn = (Show-ActiveDirectoryObjectPicker -AllowedLocations EnterpriseDomain -DefaultObjectTypes Users -DefaultLocations EnterpriseDomain).Upn
   $mailuser = ($upn -Split '@')[0]
	
    # Если ActiveDirectoryObjectPicker вернул какие-то данные - выводим сообщение #
    if ($mailuser)
    {
        $username = (Get-ADUser $mailuser).Name
        $email = Get-ADUser $mailuser -Properties EmailAddress | select -ExpandProperty EmailAddress
        # Если у пользователя обнаружен почтовый ящик #
        if ($email)
        {
            clear
            Write-Host "Выбран пользователь: $username" -ForegroundColor Cyan
            Write-Host "Почтовый ящик: $email" -ForegroundColor Cyan
            Write-Host
            Write-Host "Размер почтового ящика $email составляет:" -ForegroundColor Cyan
            while($true)
            {
                sleep(10)
                $mailbox = (Get-MailboxStatistics $mailuser | Select-Object -ExpandProperty TotalItemSize).Value
                Write-Host "$mailbox" -ForegroundColor Green
            }
        }
        else { clear; Write-Host "У пользователя $mailuser не обнаружен почтовый ящик..." -ForegroundColor Red; Read-Host }
    }
}
else { Write-Host "Сервер $server не отвечает..." -ForegroundColor Red; Read-Host }

Всё, что требуется — заменить название сервера в переменной $server.

Во время первого запуска будет установлен модуль ActiveDirectoryObjectPicker для текущего пользователя. Для работы скрипта в системе должен быть установлен модуль RSAT-AD-PowerShell!

Скрипт писался исключительно для применения в рамках домена Active Directory и последующей компиляции в exe c помощью PS2EXE.

Все посты про Exchange можно найти по этому тегу.