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
Щоб виконати пошук тільки по віддаленим елементів, додайте параметр -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
Можна одночасно шукати по тексту в заголовку і в темі листа, наприклад, знайдемо і видалимо всі листи, у яких в темі листа міститься фраза "Новий Рік" або в тексті листа є фраза "покупка коньяку".
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')
-SearchQuery відправлено: "01/07/2018 ... 20/07/2018" AND отримано: "01/07/2018 ... 20/07/2018
Відповідно, потрібно використовувати такі конструкції в SearchQuery:
- кому: [email protected]
- откого: »[email protected]»
- тема: "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 кілька разів, або розбивати ящик на групи по поштовим баз або серверів.
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