Иногда требуется массово удалить письма из ящиков пользователей Exchange. К примеру, если прошла какая-то несанкционированная рассылка. Сегодня рассмотрим процесс удаления писем из ящиков всех пользователей Exchange от определённого отправителя.
Потребуются права:
- Mailbox Import Export
- Mailbox Search
Для начала требуется остановить источник спама, который нагрузил нашу почту. Если это внутренний сервис, то остановить его и прекратить спам. Если спам внешний, то настроить антиспам.
Очистка очереди
При рассылках большого объёма часть писем ещё не доставлена, требуется очистить очереди сообщений на почтовых серверах.
Remove-Message -Server server1 -Filter "FromAddress -eq 'evil@example.com'" -WithNDR $false Remove-Message -Server server2 -Filter "FromAddress -eq 'evil@example.com'" -WithNDR $false
Очистка ящиков
После очистки очередей удалим доставленные письма из ящиков пользователей.
Первый способ
Можно использовать командлет Search-Mailbox, за один запуск можно удалить до 10000 писем.
WARNING: The Search-Mailbox cmdlet returns up to 10000 results per mailbox if a search query is specified. To return more than 10000 results, use the New-MailboxSearch cmdlet or the In-Place eDiscovery & Hold console in the Exchange Administration Center.
Пример удаления из всех ящиков:
Get-Mailbox –ResultSize unlimited | Search-Mailbox -SearchQuery 'from:"evil@example.com"' –DeleteContent –Force -confirm:$false
Пример удаления из одного ящика:
Search-Mailbox -Identity v.pupkin -SearchQuery 'from:"evil@example.com"' –DeleteContent –Force -confirm:$false
-SearchQuery позволяет формировать сложный поиск:
-SearchQuery {Subject:"RE:Ненужное письмо" OR body:"лишний текст"}
-SearchQuery 'hasattachment:true AND Size >20971520' -SearchQuery 'from:"evil@example.com" AND to:"v.pupkin@example.com"' -SearchQuery 'isread:false' -SearchQuery 'size>200000' -SearchQuery 'attachment:"virus.pdf"' -SearchQuery 'attachment -like:"*.zip"' -SearchQuery sent:22/02/2022 -SearchQuery {Received:20/06/2020..22/02/2022}
-SearchQuery {Received:> $('07/07/2021')}
Обойти ограничение на 10000 писем можно циклом, например:
for ($i = 1; $i -lt 10; $i++) {Get-Mailbox v.pupkin | Search-Mailbox -SearchQuery 'from:"evil@example.com"' -DeleteContent -Force}
Второй способ
Когда объёмы писем очень большие, приходится использовать другой командлет New-ComplianceSearch, за один запуск можно удалить до 10 писем из 50000 ящиков.
Создаём поиск сообщений, соответствующих требованиям для всех ящиков:
New-ComplianceSearch -Name "ContentSearch_for_delete" -ExchangeLocation all -ContentMatchQuery "from:evil@example.com"
Для одного ящика:
New-ComplianceSearch -Name "ContentSearch_for_delete" -ExchangeLocation v.pupkin@example.com -ContentMatchQuery "from:evil@example.com"
Посмотрим что нашлось:
Get-ComplianceSearch -Identity "ContentSearch_for_delete" | FL name,items,size,jobprogress,status
Name : ContentSearch_for_delete
Items : 0
Size : 0
JobProgress : 0
Status : NotStarted
Поиск не запущен, запустим:
Start-ComplianceSearch -Identity "ContentSearch_for_delete" Get-ComplianceSearch -Identity "ContentSearch_for_delete" | FL name,items,size,jobprogress,status
Name : ContentSearch_for_delete
Items : 0
Size : 0
JobProgress : 0
Status : InProgress
Поиск в процессе работы, подождём:
Get-ComplianceSearch -Identity "ContentSearch_for_delete" | FL name,items,size,jobprogress,status
Name : ContentSearch_for_delete
Items : 72212
Size : 937644300
JobProgress : 100
Status : Completed
Дожидаемся статуса Completed и прогресса 100%.
Get-ComplianceSearch -Identity "ContentSearch_for_delete" | Format-List
Создаём действие (удаление) для результатов поиска:
New-ComplianceSearchAction -SearchName ContentSearch_for_delete -Purge
В действии к названию добавляется постфикс "_Purge".
Посмотрим:
Get-ComplianceSearchAction -Identity "ContentSearch_for_delete_Purge" | Format-List
После очистки удаляем поиск:
Remove-ComplianceSearch -Identity "ContentSearch_for_delete"
Ссылки
Источник:
Если вам понравилась статья, то ставьте 👍🏻 каналу. Пишите комментарии, задавайте вопросы, подписывайтесь.