Exchange 2019. Поиск и удаление писем в ящиках Exchange Server

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

https://winitpro.ru/index.php/2018/07/20/search-mailbox-poisk-i-udalenie-otdelnyx-pisem-iz-yashhikov-exchange/ – Поиск и удаление писем в ящиках Exchange Server (Microsoft 365) с помощью PowerShell

Добавили роли учетке от которой будем искать и удалять письма:

New-ManagementRoleAssignment -User MailServerAdmin -Role "Mailbox Import Export"
New-ManagementRoleAssignment -User MailServerAdmin -Role "Mailbox Search”

Делаем таблицу, чтобы увидеть сколько писем пришло по указанным параметрам для сравнения:

https://www.alitajran.com/search-and-delete-email-from-exchange-user-mailbox/ – Search and delete email from Exchange user mailbox

Get-MessageTrackingLog -Start "11/20/2024 00:00:00" -End "11/20/2024 01:00:00" -Sender "sender@maildomain.ru" -Recipients "receiver1@maildomain.ru" -ResultSize Unlimited | Format-Table -AutoSize

Делаем поиск командлетом с параметром -EstimateResultOnly чтобы увидеть только количество возвращаемых писем:

Search-Mailbox -Identity "receiver1@maildomain.ru" -SearchQuery {from:sender@maildomain.ru AND received:"11/20/2024 00:00:00..11/20/2024 01:00:00"} -EstimateResultOnly

Видим, что оказывается писем “0”. Почему? Потому что время в логах сервера UTC, то есть, 2024-11-20 01:00 это 2024-11-19 22:00, значит -3 часа. Корректируем запрос:

Search-Mailbox -Identity "receiver1@maildomain.ru" -SearchQuery {from:sender@maildomain.ru AND received:"19/11/2024 21:00:00..19/11/2024 21:59:59"} -EstimateResultOnly

Количество писем 3, то что нужно.

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

Search-Mailbox -Identity "receiver1@maildomain.ru" -SearchQuery {from:sender@maildomain.ru AND received:"19/11/2024 21:00:00..19/11/2024 21:59:59"} -TargetMailbox adminmailbox@maildomain.ru -TargetFolder "Query20241119"

Убедились, что выгружены именно те письма, которые надо удалить.

Удаляем письма в одном ящике:

Search-Mailbox -Identity "receiver1@maildomain.ru" -SearchQuery {from:sender@maildomain.ru AND received:"19/11/2024 21:00:00..19/11/2024 21:59:59"} -DeleteContent –Force

Удалили 3 письма.

Убедились что в ящике пользователя их больше нет.

Теперь нужно пройти по всем ящикам и сделать операцию удаления.

Распространенный везде способ:

Get-Mailbox | Search-Mailbox -SearchQuery {from:sender@maildomain.ru AND received:"19/11/2024 21:00:00..19/11/2024 21:59:59"} -EstimateResultOnly

не работает, выдает ошибку:

Не удается привязать объект ввода к любым параметрам команды, так как команда не принимает входные данные конвейера, либо входные данные и их свойства не со
впадают с любыми из параметров, принимающих входные данные конвейера.
CategoryInfo : InvalidArgument: (Сервер Баз Данных:PSObject) [Search-Mailbox], ParameterBindingException
FullyQualifiedErrorId : InputObjectNotBound,Search-Mailbox
PSComputerName : EXCH01

Нужно действовать по другому, сначала выгрузить список всех почтовых ящиков в CSV, затем удалять из каждого письма вышеуказанной командой:

https://www.alitajran.com/search-and-delete-messages-from-exchange-user-mailboxes/ – Search and delete messages from Exchange user mailboxes

Выгрузили список всех почтовых ящиков в CSV файл:

Get-Mailbox -ResultSize Unlimited | Select-Object DisplayName, SamAccountName, PrimarySmtpAddress | Sort-Object PrimarySmtpAddress | Export-Csv "c:\123\user_mailboxes_20241120.csv" -NoTypeInformation -Encoding UTF8

Проверили что список корректный:

Import-Csv "C:\123\user_mailboxes_20241120.csv"

Запускаем поиск и удаление писем по параметрам во всех ящиках из списка:

Import-Csv "C:\123\user_mailboxes_20241120.csv" | ForEach-Object {Search-Mailbox $_.PrimarySmtpAddress -SearchQuery {from:sender@maildomain.ru AND received:"19/11/2024 21:00:00..19/11/2024 21:59:59"}
-DeleteContent –Force}

Оставьте ответ

Ваш адрес email не будет опубликован.

70 ÷ = 10