Получение статистики сообщений в MS Exchange

Тематические термины: Exchange , Powershell .

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

Графическая оболочка

Стоит сразу предупредить — метод не удобен для большого числа писем. Его стоит применять для общего ознакомления работы со статистикой или с применением фильтров.

Открываем Консоль управления Exchange — переходим в Инструменты Проводник журнала отслеживания :

Проводник журнала отслеживания в консоли управления Exchange

Ждем или прерываем проверку обновлений и переходим на экран приветствия:

Переход к экрану приветствия в Exchange Troubleshooting Assistant

В открывшемся окне выставляем фильтры и кликаем по Далее .

Используемые фильтры

Чтобы сократить вывод и отсечь ненужную информацию, используем фильтры.

  • Получатели — кому были адресованы сообщения. Вводится адрес электронной почты
  • Отправитель — кто отправил электронное письмо. Email-адрес.
  • Сервер — в инфраструктуре с несколькими Exchange серверами можно выбрать конкретный. Имя сервера.
  • Код события — ограничивает вывод для сообщений с определенным кодом ответа сервера. Варианты:
    1. RECEIVE — принятые сервером сообщения.
    2. SEND — отправленные сервером сообщения.
    3. FAIL — сообщения, при доставке которых возникла ошибка.
    4. DSN — сообщения-отчеты о недоставке.
    5. DELIVER — доставленные в локальный почтовый ящик.
    6. BADMAIL — сообщения, которые не могут быть ни доставлены, ни возвращены.
    7. RESOLVE — для получателя в Active Directory найден другой адрес.
    8. EXPAND — от разрешенных групп рассылки.
    9. REDIRECT — отправленные другим получателям.
    10. TRANSFER — перемещенные в сообщения с ветвлением.
    11. SUBMIT — успешная передача службе транспорта.
    12. POISONMESSAGE — с источником события — идентификатор о сбое.
    13. DEFER — с отложенной доставкой.
  • ИД сообщения — если известен конкретный идентификатор письма.
  • Тема .
  • Ссылка — поиск сообщений по полю Reference. Чаще всего, оно пустое, но может содержаться информация, например, InternalMessageId.
  • Начало — дата и время, от которого искать письма. Если не указано, поиск от самого первого, которое есть в журнале.
  • Окончание — дата и время, до которого ищем письма. Если не указано, поиск до последнего, которое есть в журнале.

Использование Powershell

Для работы из командной строки или написания скриптов, можно использовать Powershell командлет Get-MessageTrackingLog . Примеры его использования лучше всего посмотреть в графической оболочке — при формировании запроса с фильтрами, система выводит аналогичную команду на Powershell.

Простой запрос для отображения входящих сообщений:

Get-MessageTrackingLog -EventID «RECEIVE» -Start «2017/10/20 13:27:00» -End «2017/10/31 13:37:00»

* данная команда выведен сообщения за период от Start до End .

Мы можем увидеть ПРЕДУПРЕЖДЕНИЕ: Доступно больше результатов, чем показано в настоящий момент. Для их просмотра увеличьте значение параметра ResultSize. Это означает, что выведены не все результаты. Чтобы получить все данные, добавляем в конце команды -ResultSize unlimited .

Примеры использования Get-MessageTrackingLog

1. Для входящих

Получить количество входящих сообщений:

(Get-MessageTrackingLog -EventID «RECEIVE» -ResultSize unlimited).Count

Входящие сообщения, которые пришли через определенный коннектор:

Get-MessageTrackingLog -EventID «RECEIVE» -ResultSize unlimited | Where {$_.ConnectorId -eq «Интернет»}

Поиск входящего письма для определенного получателя за определенный период, где тема сообщения содержит слово «вопрос»:

Get-MessageTrackingLog -EventID «RECEIVE» -Start «2017/10/20 00:00:00» -End «2017/10/21 00:00:00» -Recipients «master@remontka.com» -MessageSubject «вопрос»

Список сообщений, с поиском отправителя по домену:

Get-MessageTrackingLog -EventID «RECEIVE» -Start «2017/10/20 00:00:00» -End «2017/10/21 00:00:00» -ResultSize unlimited | Where {$_.Sender -like «*@mail.ru»}

2. Для исходящих

Количество отправленных писем:

(Get-MessageTrackingLog -EventID «SEND» -ResultSize unlimited).Count

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

(Get-MessageTrackingLog -EventID «SEND» -ResultSize unlimited | Where {$_.ConnectorId -eq «Наружу»}).Count

Список отправленных писем за определенный период:

Get-MessageTrackingLog -EventID «SEND» -Start «2017/10/20 00:00:00» -End «2017/10/21 00:00:00» -ResultSize unlimited

Список сообщений от определенного отправителя:

Get-MessageTrackingLog -EventID «SEND» -Start «2017/10/20 00:00:00» -End «2017/10/21 00:00:00» -Sender «master@remontka.com»

Поиск сообщения, отправленного определенному получателю:

Get-MessageTrackingLog -EventID «SEND» -Start «2017/10/20 00:00:00» -End «2017/10/21 00:00:00» -Recipients «master@remontka.com»

Поиск письма, отправленного на определенный домен:

Get-MessageTrackingLog -EventID «SEND» -ResultSize unlimited | where {$_.Recipients -like «*@mail.ru»}

3. Разное

Список коннекторов, через которые проходят письма:

Get-MessageTrackingLog | Select ConnectorId -unique

Пример скрипта для получения статистики по часам

Попробуем посмотреть, в какие часы приходит максимальное число писем:

$username = «remontkalogin»
$password = cat C:Scriptspassword.txt | convertto-securestring

$cred = new-object -typename System.Management.Automation.PSCredential -argumentlist $username, $password
$session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri http://exchange_server.remontka.local/powershell -Credential $cred
Import-PSSession $session

$hourStaticsArr = @{}

Get-MessageTrackingLog -EventID «RECEIVE» -ResultSize unlimited | Where {$_.ConnectorId -match «Интернет»} | ForEach-Object {
$hour = $_.Timestamp.Hour
$hourStaticsArr[$hour]++
}

$hourStaticsArr

* в двух словах, сначала мы подключаемся к серверу Exchange (в качестве пароля используем строку из файла, который заранее создан командой read-host -assecurestring | convertfrom-securestring | out-file C:Scriptspassword.txt ). Затем получаем статистику входящих сообщений, вытаскиваем для каждого дату и час. После увеличиваем на единицу значение массива, в качестве ключа которого используем время (часы).

На работу скрипта может уйти несколько минут. Пример ответа:

Name Value
—- ——
23 2403
22 2108
21 1699
20 1557
19 1407
18 1426
17 2042
16 2576
15 2574
14 2363
13 3036

Чтение логов

В данной инструкции мы много пользователись командлетом Get-MessageTrackingLog. Так как его основное назначение — чтение логов, рассмотрим несколько полезных примеров получения информации из журнала Exchange.

1. Сообщения за последние 24 часа:

Get-MessageTrackingLog -Start (Get-Date).AddHours(-24)

2. Сообщения, где получатель с доменов gmail.com:

Get-MessageTrackingLog -ResultSize unlimited | where {[string]$_.recipients -like «*@gmail.com»}

3. Сообщения за час с подробным выводом информации:

Get-MessageTrackingLog -Start (Get-Date).AddHours(-1) | fl

4. Поиск всех возможных сообщений по конкретному отправителю:

Get-MessageTrackingLog -ResultSize unlimited | where {[string]$_.sender -like «dmitriy@remontka.com»}

5. Все сообщения за 4 часа с выводом идентификаторов:

Get-MessageTrackingLog -ResultSize unlimited -Start (Get-Date).AddHours(-4) | select-object MessageId, Timestamp, EventId, Source, Sender, Recipients, MessageSubject | ft

6. Получаем подробную информацию о сообщении по его идентификатору:

Get-MessageTrackingLog -MessageId 1e48be2d29f04ce78a95f455405a94a5@remontka.com | fl

EnglishRussianUkrainian