Кейс: пользователь по ошибке сделал внутреннюю рассылку в компании. Как найти и удалить те письма, которые пользователь отправил в определенное время на внутренние почтовые ящики коллегам?
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}