Для анализа транспортных журналов при отслеживании писем в Exchange можно использовать командлет Get-MessageTrackingLog консоли Exchange Management Shell. В этой статье я перечислю примеры однострочных PowerShell команд, которые я часто использую при поиске и отслеживании маршрутизации писем в Exchange Server 2016/2013/2010 и Office 365 (Exchange Online).
Напомню, что транспортные журналы Exchange хранятся в каталоге
%ExchangeInstallPath%TransportRoles\Logs\MessageTracking
и самый эффективный и гибкий способ анализа этих журналов при трекинге сообщений в системе Exchange – именно использование командлета Get-MessageTrackingLog.
Прежде всего рассмотрите основные параметры командлета Get-MessageTrackingLog, которые можно использовать для фильтрации событий в журналах. Чаще всего используются следующие параметры команлета:
- Sender – поиск по отправителю;
- Recipients — поиск по получателю;
- Server – поиск на определенном транспортном сервере;
- Start «02/30/2019 08:00:00» -End «02/31/2019 21:00:00” — поиск за определённый промежуток времени;
- MessageSubject — поиск по теме сообщения;
- EventID – поиск по коду события сервера (как правило используются коды RECEIVE, SEND, FAIL, DSN, DELIVER, BADMAIL, RESOLVE, EXPAND, REDIRECT, TRANSFER, SUBMIT, POISONMESSAGE, DEFER);
- messageID – трекинг письма по его ID.
Если выполнить командлет
Get-MessageTrackingLog
без параметров, будут выведены все события из журналов Exchange за последние 30 дней. Хорошо, что при таком запуске командлет выводит только 1000 последних событий. Чтобы убрать ограничение на количество выводимых событий, нужно указать параметр –ResultSize Unlimited (делать этого без указания дополнительных параметров фильтрации не рекомендуется из-за возможной высокой нагрузкой на сервера).
Вы можете вывести информацию о событиях Exchange в постраничной форме с помощью команды:
Get-MessageTrackingLog | Out-Host –Paging
Чтобы представить данные в табличной форме и выровнять ширину колонок используется командлет Format-Table:
Get-MessageTrackingLog | Format-Table –AutoSize
Если в вашей организации Exchange используется несколько серверов Hub Transport, для поиска в журналах серверов нужно указывать имя сервера в качестве аргумента параметра –Server, или выполнить команду поиска для каждого сервера Hub Transport:
Get-TransportServer | Get-MessageTrackingLog
Выведем все письма за последние 12 часов (
(Get-Date).AddHours(-12)
) в которых в качестве получателя указан адресат из почтовой системы @gmail.com:
Get-MessageTrackingLog -Start (Get-Date).AddHours(-12) -ResultSize unlimited | where {[string]$_.recipients -like "*@gmail.com"}
Чтобы вывести все письма, отправленные определенным пользователем за указанный период через указанный сервер (в отчет выведем только определенные поля):
Get-MessageTrackingLog -ResultSize unlimited –Sender "[email protected]” –server msk-hub-01 -Start "03/30/2019 08:00:00" -End "04/04/2019 21:00:00" |select-object Timestamp,Sender,Recipients,MessageSubject,EventId|ft
Найдем все письма, отправленные одним пользователем другому и выгрузим результат в CSV файл:
Get-MessageTrackingLog -Sender "[email protected]" -Recipients "[email protected]" -ResultSize unlimited –server msk-hub-01| Select-Object Timestamp,Sender,{$_.recipients},MessageSubject | Export-Csv -Path "C:\ps\exchange\msg_tracking_out.csv" -Encoding Default -Delimiter ";"
Поиск по теме письма. Для вывода всех письма с темой, содержащей фразу “test”, выполните следующую команду (чтобы представить результаты поиска в отдельной табличном графическом окне с удобными возможностями сортировки, фильтрации и поиска данных можно использовать командлет out-gridview):
Get-MessageTrackingLog -MessageSubject "test" -ResultSize unlimited –server msk-hub-01| Select-Object Timestamp,Sender, {$_.recipients}, MessageSubject | out-gridview
Можно искать по конкретному идентификатору сообщения (например, вы получили его из служебных заголовков письма в Outlook):
Get-MessageTrackingLog -messageID "[email protected]" -ResultSize unlimited –server msk-hub-01| Select-Object Timestamp,Sender, {$_.recipients}, MessageSubject
Чтобы посчитать количество входящих писем за последние 7 дней для конкретного ящика, выполните:
(Get-MessageTrackingLog -EventID "RECEIVE" -Recipients "[email protected]" -ResultSize unlimited).Count
Можно вывести статистику по письмам с группировкой. Например, вы хотите увидеть, сколько писем от различных отправителей из домена mail.ru получили пользователи вашей организации за 1 день (выведем суммарное количество отправленных писем каждым внешним отправителем):
Get-MessageTrackingLog -EventId "Receive" -Start (Get-Date).AddDays(-1) -ResultSize Unlimited | Where-Object {$_.Sender -like "*@mail.ru"} | Group-Object Sender | Sort-Object Count -Descending | Format-Table *
В Office 365 есть возможность поиска по трекинг логам из веб-интерфейса Exchange Admin Center (EAC). Перейдите в раздел Mail Flow -> Message Trace. Заполните нужные поля для поиска. По сути это веб-интерфейс для командлета Get-MessageTrackingLog, позволяющий пользователю в простой форме сформировать PowerShell команду для поиска писем по журналам.
Рассмотренные выше способы помогут вам получить статистику об отправленных и полученных сообщениях в системе Exchange и диагностировать проблемы с отправкой писем.
Спасибо за статью !
Все доходчиво и полезно. Еще для новичков или для любителей Граф.интерфейсов, можно подсказать, что в галерее технета есть много готовых скриптов по поиску писем и выводу инфы. Например вот этот
При наличии нескольких серверов Exchange 2010, распределенных по ролям, еще и с ролями edge, расположенных в недоменной DMZ, командлеты не слишком удобны.
Отличным решением оказалось централизованное хранение message tracking логов в Elasticsearch.
Все верно в больших организациях Exchange поиск по логам — головная боль…
Если не сложно, опишите вкратце свою архитектуру с заворотом логов на Elasticsearch. Хочется понять с какого конца это пощупать…
Get-ExchangeServer | where {$_.isHubTransportServer -eq $true -or $_.isMailboxServer -eq $true} | Get-MessageTrackingLog ..
Get-MessageTrackingLog c моего ПК не распознан. Работает только на сервере?
Нужно ставить Exchange Management Shell или импортировать этот модуль с Exchange сервера, или работать в режиме enter-pssession.
Спасибо большое!
А как посмотреть письмо по MessageID или скачать его что бы потом открыть в Outlook
Впрямую MessageID не получится найти с помощь Search-Mailbox (https://winitpro.ru/index.php/2018/07/20/search-mailbox-poisk-i-udalenie-otdelnyx-pisem-iz-yashhikov-exchange/).
Можно по MessageID получить например тему письма:
$subject = (Get-MessageTrackingLog -MessageID xxxxxxxxxxxxxxx| Select -First 1).MessageSubject
и потом по этой теме выполнить поиск с отправкой письма в ящик
Search-Mailbox -SearchQuery 'subject:$subject' ... -TargetMailbox sec_mbx -TargetFolder "ExSearchFolder”
Большое спасибо, за быстрый ответ!
Коллеги, такой вопрос.
Команда Get-MessageTrackingLog работает отлично и показывает логи и с критериями в том числе.
Но вот, если зайти в EAC, там включить поиск, выдает следующую ошибку:
«Серверу EX.***.*** в домене ****** не удалось получить внутренний URL-адрес для серверов клиентского доступа на сайте ******/Configuration/Sites/SiteFR.
Спасибо! а как посмотреть список всех получаетелей, а то не влезают и стоит троеточие, пробовал и FL и в out-gridview, но везде так и стоит 3 точки
Можно делать | Export-Csv
Подскажите пожалуйста, раньше использовал командлет Get-MessageTrackingLog для поиска писем и все отрабатывало, сейчас надо найти письмо за прошлый месяц, а показываются письма только за последние 30 дней, само собой указываю с какой даты начать поиск, но это не помогает, в чем может быть проблема?
Set-TransportService — посмотрите какая у вас настроена глубина хранения.
+ если у вас несколько траспортных серверов, нужно искать отдельно на каждом.
Ну и вариант с тем, что кто-то почистил логи
Всем привет.
А как найти ИП отправителя конкретного письма?
Кто найти (почтовый ящик) это не проблема, но бывает так что ящик(общий) подцеплен к нескольким пользователям и они потом начинают друг на друга кидать стрелки.
Настраивайте аудит действий пользователей в общих ящиках:
https://winitpro.ru/index.php/2021/09/06/audit-dejstvij-polzovatelya-pochtovom-yashhike-exchange/
Спасибо!
у меня Get-MessageTrackingLog -Start (Get-Date).AddHours(-12) -ResultSize unlimited | where {[string]$_.recipients -like «*@gmail.com»} работает а
Get-MessageTrackingLog -Start (Get-Date).AddHours(-12) -ResultSize unlimited | where {[string]$_.recipients -like «*@gmail.com»} | out-gridview
выпадает в >>