Поиск и удаление писем в ящиках Exchange Server (Microsoft 365) с помощью PowerShell
В Exchange Server вы можете использовать PowerShell командлеты Search-Mailbox или New-ComplianceSearch (доступен в новых версиях Exchange Server и в Exchange Online/Microsoft 365) для поиска и удаления писем из ящиков пользователей. Например, пользователь случайно разослал приватные данные коллегам в организации и не успел отозвать сообщение в Outlook. Департамент защиты информации требует, чтобы вы, как администратор Exchange, удалили случайно отправленное приватное письмо из всех ящиков пользователей в вашей организации/тенанте Exchange
Статья применима к on-prem Exchange Server 2019/2016/2013 и 2010, а также к облачному Exchange Online (Microsoft 365).
Предоставить права для поиска по ящикам Exchange
Подключитесь к своему on-prem Exchange серверу с помощью PowerShell.
Учетной записи администратора, который выполняет поиск и удаление элементов нужно назначить следующие роли:
- Mailbox Import Export
- Mailbox Search
Вы можете назначить роли через EAC или с помощью следующих команд PowerShell:
New-ManagementRoleAssignment -User itpro -Role "Mailbox Import Export"
New-ManagementRoleAssignment -User itpro -Role "Mailbox Search”
В Exchange Online нужно назначить следующие роли:
Add-RoleGroupMember "Discovery Management" -member [email protected]
New-RoleGroup "Mailbox Import-Export Management" -Roles "Mailbox Import Export"
Add-RoleGroupMember "Mailbox Import-Export Management" -Member [email protected]
Добавьте свою учетную запись в eDiscovery Admins в Microsoft 365 Compliance Center
После назначения ролей нужно перезапустить сеанс PowerShell.
Search-Mailbox: поиск и удаление писем в ящиках Exchange
Для поиска писем в ящиках пользователей можете использовать веб-интерфейс Exchange Admin Center (EAC) или PowerShell командлет Search-Mailbox. Эта команда позволяет найти письма в ящиках пользователей по определенных критериями, скопировать найденные элементы в другой ящик или удалить их
Для поиска в ящике пользователя писем с определенной темой выполните команду:Search-Mailbox -Identity vasia -SearchQuery 'Subject:"Годовой отчет"'
Для поиска по всем ящикам в организации, воспользуйтесь командой:Get-Mailbox -ResultSize unlimited | Search-Mailbox -SearchQuery 'Subject:"Годовой отчет"'
WARNING: On July 1, 2020, the Search-Mailbox cmdlet is being retired and Microsoft Support will no longer provide assistance. See https://go.microsoft.com/fwlink/?linkid=2113221 to learn more. 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.
Microsoft рекомендует использовать для поиска более быстрые командлеты
New-ComplianceSearch
и
New-ComplianceSearchAction
(рассмотрены ниже).
Чтобы скопировать результаты поиска в определенный ящик и папку, используйте параметры TargetMailbox и TargetFolder. Это позволит вам после окончания поиска вручную просмотреть найденные письма в вашем Outlook. Допустим, нам нужно выполнить поиск писем по списку пользователей (содержится в текстовом файле users.txt) и скопировать найденные письма в папку определённого ящика, выполните:
get-content users.txt | Get-Mailbox -ResultSize unlimited | Search-Mailbox -SearchQuery 'Subject:"Годовой отчет"' -TargetMailbox sec_mbx -TargetFolder "ExSearchFolder”
Параметр –LogOnly -LogLevel Full означает, что нужно выполнить только оценку результатов поиска, не копируя результаты поиска в целевой ящик и не удаляя элементы. При использовании этого аргумента на указанный целевой ящик будет отправлен отчет с результатами поиска. Отчет представляет собой заархивированный csv-файл, в котором перечислен список ящиков, соответствующих критериям поиска.
Вы можете оценить результаты поиска (общее количество и размер писем) с помощью параметра –EstimateResultOnly. При использовании этого параметра не нужно указывать целевой ящик и папку.
Get-Mailbox | Search-Mailbox -SearchQuery 'Subject:"report"' -EstimateResultOnly|select Identity,ResultItemsCount,ResultItemsSize| Where-Object ResultItemsCount -gt 0
Чтобы удалить найденные письма нужно использовать параметр –DeleteContent. Чтобы убрать запросы на подтверждение удаления информации, добавьте параметр –Force.
Удалим все письма от пользователя vasia во всех ящиках на определенном почтовом сервере Exchange:
Get-Mailbox –Server msk-mdb1 –ResultSize unlimited | Search-Mailbox -SearchQuery 'from:"[email protected]"' –DeleteContent –Force
Перед удалением писем из ящиков с помощью ключа
-DeleteContent
настоятельно рекомендуем ознакомиться с найденными по указанным критериям поиск письмам с помощью аргументов
-EstimateResultOnly
или
–LogOnly
.
Чтобы выполнить поиск только по удаленным элементам, добавьте параметр –SearchDumpsterOnly (чтобы исключить поиск по удаленным элементам, добавьте параметр
-SearchDumpster:$false
) . Если нужно исключить архив ящика, используйте параметр –DoNotIncludeArchive.
Командлет Search-Mailbox может вернуть максимум 10000 элементов. Если найдено большее количество элементов, появится ошибка:
Sending data to a remote command failed with the following error message: The total data received from the remote client exceeded allowed maximum. Allowed maximum is 524288000.
Поэтому, чтобы удалить большее количество элементов нужно запустить командлет Search-Mailbox несколько раз, либо разбивать ящик на группы по почтовым базам или серверам.
Get-Mailbox -Database mskdb | Search-Mailbox –SearchQuery 'from:[email protected]' -DeleteContent –Force
Другая проблема Search-Mailbox – низкая производительность. Поиск по большой организации может выполняться несколько суток. В современных версиях Exchange и Microsoft 365 для поиска писем в ящиках лучше использовать командлет New-ComplianceSearch (рассмотрен ниже).
Примеры запросов SearchQuery для поиска писем в ящиках Exchange
Рассмотрим примеры запросов на поиск почтовых элементов с помощью параметра SearchQuery. Параметр SearchQuery обрабатывает запросы на языке KQL (Keyword Query Language) — https://docs.microsoft.com/en-us/sharepoint/dev/general-development/keyword-query-language-kql-syntax-reference.
Найти и удалить все письма с ключевым слово “Секрет” в теме от всех пользователей не из вашего домена:
Search-Mailbox -Identity vasia -SearchQuery 'Subject:"Секрет" and from”winitpro.ru”' -DeleteContent
С помощью логических операторов OR и AND вы можете комбинировать более сложные условия поиска писем.
Найти и удалить все письма с вложениями размером более 20Мб:
Search-Mailbox -Identity vasia -SearchQuery 'hasattachment:true AND Size >20971520' –DeleteContent
Совет. Размер писем указывается в байтах, причем учитывается размер всего письма, а не только вложения. Можно указывать размер в мегабайтах, в этом случае используется такой синтаксис:
-SearchQuery {Size -gt 20MB}
.
Можно одновременно искать по тексту в заголовке и в теме письма. Например, чтобы найти и удалить письма, у которых в теме письма содержится фраза «Новый Год» или в тексте письма есть фраза «покупка коньяка»:
Search-Mailbox vasia -SearchQuery {Subject:"RE:Новый Год" OR body:"покупка коньяка"} -DeleteContent -Force
Можно искать в ящиках определенные элементы, с помощью аргумента Kind. Например:
Собрания:
-SearchQuery "Kind:meetings"
Контакты:
-SearchQuery "Kind:contacts"
Или другие элементы:
- Email — письма
- Meetings — собрания
- Tasks — задачи
- Notes — заметке
- Docs – документы
- Journals — журналы
- Contacts — контакты
- IM – сообщения мессенджеров
Поиск писем по определенному отправителю и получателю
-SearchQuery 'from:"[email protected]" AND to:"[email protected]"'
Письма с вложениями:
-SearchQuery 'hasattachment:true'
Прочитанные письма:
-SearchQuery 'isread:false'
Поиск писем по размеру:
-SearchQuery 'size>200000'
-SearchQuery 'attachment:"secret.pdf"'
Или по типу файла:
-SearchQuery 'attachment -like:"*.docx"'
Возможен поиск по дате отправки/получения писем, но тут есть несколько нюансов. При использовании дат в качестве критерия поиска нужно учитывать региональные настройки сервера Exchange. Например, дата 20 февраля 2022 года может быть указана:
- 20/02/2022
- 02/20/2022
- 20-Feb-2022
- 20/February/2022
Если при выполнении команды Search-Mailbox вы получите ошибку “
The KQL parser threw an exception…
”, значит вы используете неверный формат времени.
Для поиска писем, отправленных в конкретный день, используйте запрос:
-SearchQuery sent:22/02/2022
Если нужно указать диапазон дат (поиск писем, полученных в указанный промежуток времени):
-SearchQuery {Received:20/06/2020..22/02/2022}
Еще один пример. Ищем письма, полученные после 7 июля:
-SearchQuery {Received:> $('07/07/2021')}
-SearchQuery {отправлено:"01/07/2018..20/07/2018" AND получено:"01/07/2018..20/07/2018}
Соответственно, нужно использовать такие конструкции в SearchQuery:
ЗЫ. Именно за это я не люблю использовать русские версии серверных продуктов!
New-ComplianceSearch: быстрый поиск и удаление писем в Exchange
В Exchange 2016/2019 и Exchange Online (Microsoft 365) появился новый механизм для быстрого поиска и удаления писем в ящиках пользователей с помощью командлетов New-ComplianceSearch и New-ComplianceSearchAction.
Microsoft рекомендует использовать именно эти командлеты для поиска писем в Exchange вместо устаревшего Search-Mailbox.
Подключитесь к M365 Security & Compliance Center:
Connect-IPPSSession
Попробуем найти в ящиках письма с определенной темой от указанного email отправителя за период:
$Sender = "[email protected]"
$StartTime = "02/19/2022"
$EndTime = "02/21/2021"
$Subject = "report2022"
Чтобы создать задание поиска писем по указанным критериям, выполните:
New-ComplianceSearch -Name "ContentSearch_for_Report2022" -ExchangeLocation all -ContentMatchQuery "sent>=$($StartTime) AND sent
Вы можете задавать критерии поиска в атрибуте -ContentMatchQuery по аналогии с параметрами -SearchQuery командлета Search-Mailbox.
New-ComplianceSearchAction: The term 'New-ComplianceSearchAction' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again.
Проверьте, что вы назначили все роли Exchange как описано выше.
Закройте текущую сессию PowerShell и переподключитесь:
Get-PSSession | Remove-PSSession
.
Чтобы запустить это задание:
Start-ComplianceSearch -Identity "ContentSearch_for_Report2022"
Нужно дождаться его выполнения. Текущий статус можно получить так:
Get-ComplianceSearch -Identity "ContentSearch_for_Report2022"| FL name,items,size,jobprogress,status
Чтобы вывести результаты поиска в консоль в режиме Preview:
New-ComplianceSearchAction -SearchName "ContentSearch_for_Report2022" -Preview
(Get-ComplianceSearchAction "ContentSearch_for_Report2022"| Select-Object -ExpandProperty Results).Split(";")
Если вы хотите удалить все найденные письма из ящиков пользователей, используйте параметр –Purge:
New-ComplianceSearchAction -SearchName ContentSearch_for_Report2022 -Purge -PurgeType SoftDelete
Если вы хотите сделать удаленные письма доступными для восстановления пользователями, используйте параметр
-PurgeType SoftDelete
. Укажите
-PurgeType HardDelete
, чтобы полностью удалить письма из почтовых ящиков.
Microsoft 365
Поиск и удаление писем в ящиках Exchange Server (Microsoft 365) с помощью PowerShell