Поиск и удаление писем в ящиках 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 adminusr@winitpro.ru
New-RoleGroup "Mailbox Import-Export Management" -Roles "Mailbox Import Export"
Add-RoleGroupMember "Mailbox Import-Export Management" -Member adminusr@winitpro.ru

Добавьте свою учетную запись в 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.
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:"vasia@winitpro.ru"' –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:spam@spammer.ru' -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:"admin@winitpro.ru" AND to:"support@winitpro.ru"'

Письма с вложениями: -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:

  • кому:admin@winitpro.ru
  • откого:"vasya@winitpro.ru"
  • тема:"Секретный план"

ЗЫ. Именно за это я не люблю использовать русские версии серверных продуктов!

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 = "user1@winitpro.ru"
$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 , чтобы полностью удалить письма из почтовых ящиков.

Предыдущая статья Следующая статья


Комментариев: 48 Оставить комментарий

Оставить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Я не робот( Обязательно отметьте)