Поиск и удаление писем в ящиках 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 для поиска Search-Mailbox

В 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

Для подключения к Exchange Online можно использовать модуль Exchange Online PowerShell v2 (EXO V2) .

После назначения ролей нужно перезапустить сеанс 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:"Годовой отчет"'

При использовании командлета Search-Mailbox в Exchange Online (Microsoft 365) появляется предупреждение:

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._x000D_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-файл, в котором перечислен список ящиков, соответствующих критериям поиска.

csv отчет с результатами поиска письма по ящикам exchange

Обратите внимание, что в полученном отчете есть статус письма Прочтено/Не прочтено (Read: True/False ).

Вы можете оценить результаты поиска (общее количество и размер писем) с помощью параметра –EstimateResultOnly . При использовании этого параметра не нужно указывать целевой ящик и папку.

Get-Mailbox | Search-Mailbox -SearchQuery 'Subject:"report"'  -EstimateResultOnly|select Identity,ResultItemsCount,ResultItemsSize| Where-Object ResultItemsCount -gt 0

Get-Mailbox - результаты поиска по ящикам пользователей

Чтобы удалить найденные письма нужно использовать параметр –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 The total data received from the remote client exceeded allowed maximum

Поэтому, чтобы удалить большее количество элементов нужно запустить командлет 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<>”remontka.com”' -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')}

Совет . В локализованной (русской) версии Exchange нужно использовать русские ключи в аргументах KQL. Например, ищем письма, полученные и отправленные в указанный период:

-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<=$($EndTime) AND sender:$($Sender) AND subject:$($Subject)"

Вы можете задавать критерии поиска в атрибуте -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
New-ComplianceSearch просмотр результата поиска в ящиках Exchange
Чтобы вывести результаты поиска в консоль в режиме 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 , чтобы полностью удалить письма из почтовых ящиков.
EnglishRussianUkrainian