Search-Mailbox: Поиск и удаление отдельных писем из ящиков Exchange

Exchange сервер позволяет администратору выполнять поиск по почтовым ящикам пользователей в базах и удалять из ящиков определенные письма (или другие элементы). Например, пользователь ошибся и случайно разослал приватные данные другим пользователям в организации и не успел отозвать сообщение в Outlook. Департамент защиты информации требует, чтобы вы, как администратор Exchange, удалили данное письмо у всех пользователей в вашем организации Exchange. В этой статье мы покажем, как с помощью PowerShell можно выполнять поиск по ящикам пользователей Exchange (по разным критериям) и удалять отдельные письма у конкретного пользователя или у всех пользователей Exchange. Описанные методики применимы для Exchange 2016, 2013 и 2010.

Назначаем разрешения для поиска по ящикам Exchange

Учетной записи администратора, который выполняет поиск и удаление элементов нужно назначить следующие роли:

  • 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 Management Shell.

Используем командлет Search-Mailbox для поиска и удаления писем в ящиках Exchange

Поиск писем в ящиках пользователей можно выполнить и через Exchange Control Panel / Exchange Admin Center, однако этот способ поиска довольно медленный и не позволяет удалять письма. Гораздо проще выполнить поиск с помощью PowerShell.

Для поиска сообщений в ящиках пользователей можно использовать командлет Search-Mailbox, который позволяет по определенным критериям найти письма во всех или конкретных ящиках, скопировать найденные элементы в другой ящик или удалить их.

Сначала разберемся, как выполнять поиск с помощью Search-Mailbox.
Для поиска в определенном ящике писем с определенной темой выполните команду:
Search-Mailbox -Identity vasia -SearchQuery 'Subject:"Годовой отчет"'
Для поиска по всем ящикам в организации, воспользуйтесь командой:
Get-Mailbox -ResultSize unlimited | Search-Mailbox -SearchQuery 'Subject:"Годовой отчет"'

Чтобы скопировать результаты поиска в определенный ящик и папку, используйте параметры TargetMailbox и TargetFolder. Таким образом после окончания поиска вы сможете с помощью Outlook или OWA вручную просмотреть найденные письма. Допустим, нам нужно выполнить поиск писем по списку пользователей (содержится в текстовом файле users.txt) и скопировать найденные письма в папку определённого ящика, выполните:

get-content users.txt | Get-Mailbox -ResultSize unlimited | Search-Mailbox -SearchQuery 'Subject:"Годовой отчет"' -TargetMailbox sec_mbx -TargetFolder "ExSearchFolder”

Параметр –LogOnly означает, что нужно выполнить только оценку результатов поиска, не копируя результаты поиска в целевой ящик и не удаляя элементы. При использовании этого аргумента на указанный целевой ящик будет отправлен отчет с результатами поиска. Отчет представляет собой заархивированный csv-файл, в котором перечислен список ящиков, соответствующих критериям поиска.

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

Чтобы удалить найденные письма нужно использовать параметр –DeleteContent, чтобы убрать запросы на подтверждение удаления информации, добавьте параметр –Force.

Удалим все письма от пользователя vasia во всех ящиках на определенном сервере Exchnage:

Get-Mailbox –Server msk-mdb1 –ResultSize unlimited | Search-Mailbox -SearchQuery 'from:"vasia@winitpro.ru"' –DeleteContent –Force

Перед удалением писем из ящиков с помощью ключа -DeleteContent настоятельно рекомендуем ознакомиться с найденными по указанным критериям поиск письмам с помощью аргументов -EstimateResultOnly или –LogOnly.

Чтобы выполнить поиск только по удаленным элементам, добавьте параметр –SearchDumpsterOnly (чтобы исключить поиск по удаленным элементам, добавьте параметр -SearchDumpster:$false) . Если нужно исключить архив ящика, используйте параметр –DoNotIncludeArchive.

Примеры запросов SearchQuery на поиск писем в ящиках Exchange

Рассмотрим примеры запросов выборки почтовых элементов с помощью параметра SearchQuery. Параметр SearchQuery обрабатывает запросы на языке KQL (Keyword Query Language) — https://docs.microsoft.com/ru-ru/sharepoint/dev/general-development/keyword-query-language-kql-syntax-reference.

Удалим все письма с ключевым слово «Секрет» в теме от всех пользователей не из вашего домена:

Search-Mailbox -Identity vasia -SearchQuery 'Subject:"Секрет" and from<>”winitpro.ru”' -DeleteContent

Найти и удалить все письма с вложениями размером более 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 'attachment:"secret.pdf"'

Или по типу файла:

-SearchQuery 'attachment -like:"*.docx"'

Возможен поиск по дате отправки / получения писем, но тут есть несколько нюансов. При использовании дат в качестве критерия поиска нужно учитывать региональные настройки сервера Exchange. Например, дата 20 июля 2018 года может быть указана:

  • 20/07/2018
  • 07/20/2018
  • 20-Jul-2018
  • 20/July/2018

И если вы при выполнении команды Search-Mailbox вы получите ошибку “The KQL parser threw an exception…”, значит вы используете неверный формат времени.

Для поиска писем, отправленных в конкретный день, используйте запрос:

-SearchQuery sent:20/07/2018

Если нужно указать диапазон дат (поиск писем, полученных в указанный промежуток времени):

-SearchQuery {Received:20/06/2018..20/07/2018}

Еще один пример. Ищем письма, полученных до 7 июля:

-SearchQuery {Received:> $('07/07/2018')}

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

-SearchQuery {отправлено:"01/07/2018..20/07/2018" AND получено:"01/07/2018..20/07/2018}

Соответственно, нужно использовать такие конструкции в SearchQuery:

  • кому:admin@winitpro.ru
  • откого:»vasya@winitpro.ru»
  • тема:»Tema такая»

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

Ограничения Search-Mailbox

У команды 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 2016 с помощью New-ComplianceSearch

В Exchange 2016 появился новый механизм для быстрого поиска и удаления писем в ящиках пользователей.

С помощью следующих команд можно существенно сузить область поиска:

New-ComplianceSearch -Name FastSearch1 -ExchangeLocation all -ContentMatchQuery 'from:"spammer@gmail.com"'
Start-ComplianceSearch -Identity FastSearch1

Данные команды отрабатывают на нескольких тысяч ящиков за несколько минут.

Получаем список ящиков, которые попадают под критерии поиска:

$search = Get-ComplianceSearch –Identity FastSearch1
$results = $search.SuccessResults
$mbxs = @()
$lines = $results -split '[\r\n]+'
foreach ($line in $lines)
{
if ($line -match 'Location: (\S+),.+Item count: (\d+)' -and $matches[2] -gt 0)
{
$mbxs += $matches[1]
}
}

Теперь можно запустить удалением писем с помощью Search-Mailbox только в найденных ящиках:

$mbxs | Get-Mailbox| Search-Mailbox -SearchQuery 'from:"spammer@gmail.com"' -DeleteContent –Force

Суммарное время поиска и удаления писем уменьшается в несколько раз, особенно в больших оргаизациях.

Теперь можно удалить результаты поиска:

Remove-ComplianceSearch –Identity FastSearch1


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


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

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

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

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