В Exchange Server вы можете использовать PowerShell командлеты Search-Mailbox или New-ComplianceSearch (доступен в новых версиях Exchange Server и в Exchange Online/Microsoft 365) для поиска и удаления писем из ящиков пользователей. Например, пользователь случайно разослал приватные данные коллегам в организации и не успел отозвать сообщение в Outlook . Департамент защиты информации требует, чтобы вы, как администратор Exchange, удалили случайно отправленное приватное письмо из всех ящиков пользователей в вашей организации/тенанте Exchange
Предоставить права для поиска по ящикам 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 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
После назначения ролей нужно перезапустить сеанс 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:"Годовой отчет"'
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-файл, в котором перечислен список ящиков, соответствующих критериям поиска.
(Read: True/False
).Вы можете оценить результаты поиска (общее количество и размер писем) с помощью параметра –EstimateResultOnly . При использовании этого параметра не нужно указывать целевой ящик и папку.
Get-Mailbox | Search-Mailbox -SearchQuery 'Subject:"report"' -EstimateResultOnly|select Identity,ResultItemsCount,ResultItemsSize| Where-Object ResultItemsCount -gt 0
Чтобы удалить найденные письма нужно использовать параметр –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 несколько раз, либо разбивать ящик на группы по почтовым базам или серверам.
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')}
-SearchQuery {отправлено:"01/07/2018..20/07/2018" AND получено:"01/07/2018..20/07/2018}
Соответственно, нужно использовать такие конструкции в SearchQuery:
-
кому: [email protected]
-
откого:" [email protected] "
-
тема:"Секретный план"
ЗЫ. Именно за это я не люблю использовать русские версии серверных продуктов!
New-ComplianceSearch: быстрый поиск и удаление писем в Exchange
В Exchange 2016/2019 и Exchange Online (Microsoft 365) появился новый механизм для быстрого поиска и удаления писем в ящиках пользователей с помощью командлетов New-ComplianceSearch и New-ComplianceSearchAction .
Подключитесь к 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
Чтобы вывести результаты поиска в консоль в режиме 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
, чтобы полностью удалить письма из почтовых ящиков.