Search-Mailbox Пошук і видалення окремих листів з скриньок Exchange

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

зміст:

  • Призначаємо дозволу для пошуку по шухлядах Exchange
  • Використовуємо командлет Search-Mailbox для пошуку і видалення листів в ящиках Exchange
  • Приклади запитів SearchQuery на пошук листів в ящиках Exchange
  • Обмеження Search-Mailbox
  • Швидкий пошук і видалення листів в Exchange 2016 за допомогою New-ComplianceSearch

Призначаємо дозволу для пошуку по шухлядах Exchange

Облікового запису адміністратора, який виконує пошук і видалення елементів потрібно призначити наступні ролі:

  • Mailbox Import Export
  • Mailbox Search

Ви можете призначити ролі через EAC або за допомогою наступних команд PowerShell:

New-ManagementRoleAssignment -User itpro -Role "Mailbox Import Export"
New-ManagementRoleAssignment -User itpro -Role "Mailbox Search"

Після призначення ролей потрібно перезапустити консоль 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: "[email protected]"' -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: "[email protected]" AND to: "[email protected]"'

Можна шукати листи з певним файлом у вкладенні:

-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:

ЗИ. Саме за це я не люблю використовувати російські версії продуктів!

Обмеження 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 кілька разів, або розбивати ящик на групи по поштовим баз або серверів.

Get-Mailbox -Database mskdb | Search-Mailbox -SearchQuery 'from: [email protected]' -DeleteContent -Force

Інша проблема Search-Mailbox - низька продуктивність. Пошук по великій організації може виконуватися кілька діб.

Швидкий пошук і видалення листів в Exchange 2016 за допомогою New-ComplianceSearch

В Exchange 2016 з'явився новий механізм для швидкого пошуку і видалення листів в ящиках користувачів.

За допомогою наступних команд можна істотно звузити область пошуку:

New-ComplianceSearch -Name FastSearch1 -ExchangeLocation all -ContentMatchQuery 'from: "[email protected]"'
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: "[email protected]"' -DeleteContent -Force

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

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

Remove-ComplianceSearch -Identity FastSearch1