Полезные командлеты Powershell для Exchange

Назначить роли и права Exchange, например поддержке 2уровня
New-ManagementRoleAssignment –Role ‘Mail Recipients’ –SecurityGroup ‘Level 2 Support’
 
Проверить права
Get-ManagementRole "MyVoiceMail" | Format-Table Name, IsEndUserRole
После того, как роль была подтверждена как роль конечного пользователя, она назначается политике назначения ролей «Конечные пользователи продаж».
New-ManagementRoleAssignment -Role "MyVoiceMail" -Policy "Sales end-users"
 
Порядок установки CU на Exchange Server
1.
Переводим компонент сервера Hub Transport в режим обслуживания:
Set-ServerComponentState MAIL2 –Component HubTransport –State Draining –Requester Maintenance
2.
Переводим все активные сообщения из очередей почтового сервера на другой сервер (нужно указать FQDN севера):
Redirect-Message -Server MAIL2 -Target mail1.rew.local
Подтверждаем нажатием Y

3.Приостанавливаем членство в кластере:
Suspend-ClusterNode –Name MAIL2

4.Следующая команда перемещает все активные копии баз данных с сервера MAIL2 и блокирует политику активацию новых копий:
Set-MailboxServer MAIL2 –DatabaseCopyActivationDisabledAndMoveNow $true

5.Переводим сервер в режим обслуживания:
Set-ServerComponentState MAIL2 -Component ServerWideOffline –State InActive –Requester Maintenance

6. На cmd.exe от имени Администратора

Код:
setup.exe /prepareschema /IAcceptExchangeServerLicenseTerms
setup.exe /preparead /IAcceptExchangeServerLicenseTerms
setup.exe /PrepareDomain /IAcceptExchangeServerLicenseTerms

Устанавливаем CU:
setup.exe /m:upgrade /IAcceptExchangeServerLicenseTerms_DiagnosticDataON

-------------------

После установки возвращаем все в рабочее состояние:

Код:
Resume-ClusterNode –Name MAIL2
Set-MailboxServer MAIL2 –DatabaseCopyAutoActivationPolicy Unrestricted
Set-MailboxServer MAIL2 –DatabaseCopyActivationDisabledAndMoveNow $false
Set-ServerComponentState MAIL2 –Component HubTransport –State Active –Requester Maintenance

Возвращаем персональные настройки виртуальных каталогов (если они были сделаны).
Раскидываем базы данных, согласно приоритету активации, для этого переходим в папку C:\Program Files\Microsoft\Exchange Server\V15\scripts и выполняем команду:

.\RedistributeActiveDatabases.ps1 –DagName DAGNAME –BalanceDbsByActivationPreference –confirm: $false
Set-ServerComponentState MAIL2 -Component ServerWideOffline -State Active -Requester Maintenance
Проверяем что все компоненты запустились:
Get-ServerComponentState MAIL2 -Component ServerWideOffline
Готово. Проверяем репликацию:
Test-ReplicationHealth -Identity MAIL2

Осталось убедиться в отсутствии проблем у пользователей и сторонних сервисов и можно приступать к обновлению следующего сервера.
 
Последнее редактирование модератором:
Поиск письма по домену, на который оно было отправлено из вашей компании. Т.е. все письма отправленные на домен @mail.ru:

Код:
Get-TransportService | Get-MessageTrackingLog -Start "10/15/2022 11:00:00" -End "10/18/2022 11:00:00" -ResultSize Unlimited | where {[string]$_.recipients -like "*@mail.ru"} | Select-Object Timestamp,Sender,{$_.Recipients},MessageSubject,ReturnPath,{$_.RecipientStatus},Source,EventId,InternalMessageId,MessageId,NetworkMessageId | Export-Csv C:\DomainFile01.csv -NoTypeInformation


Поиск по алиасу получателя внутри компании. Т.е. все письма, которые были направлены на алиас вашего сотрудника как от внутренних сотрудников, так и внешних отправителей:

Код:
Get-TransportService | Get-MessageTrackingLog -Recipients MyAlias@adatum.com -Start "10/15/2022 11:00:00" -End "10/18/2022 11:00:00" -ResultSize Unlimited | where {($_.EventID -eq "RECEIVE") -and ($_.Recipients -eq "MyAlias@adatum.com")} | sort Timestamp -Descending | Select-Object Timestamp,Sender,{$_.Recipients},MessageSubject,MessageId,ReturnPath | Export-Csv C:\AliasFile02.csv -NoTypeInformation
 
Как узнать было ли прочитано сообщение отправленное одним внутренним отправителем другому внутреннему отправителю (например от начальника к подчинённому)?

В примере на скриншоте на моём Exchange есть несколько обслуживаемых доменов и показан пример того, что отправленное сообщение с почты в домене '.su' на почту в домене '.ru' было прочитано. Если же сообщение не было бы прочитано, то надписи 'Read' не было бы. Если человек прочитал сообщение, а потом отметил его непрочитанным, то в трекинге оно всё равно будет отображаться прочитанным.

Код:
Get-TransportService | Get-MessageTrackingLog -Sender BOSS@adatum.com -Recipients Vladimir@adatum.com -MessageSubject "Urgent task from CEO" | Select-Object -First 1 | fl Sender,Recipients,MessageSubject,MessageID

$Temp = Search-MessageTrackingReport -Identity Vladimir@adatum.com -Sender BOSS@adatum.com -MessageId dq23765f1c2b7035ad61821ba332hfa4@adatum.com -BypassDelegateChecking -DoNotResolve

Get-MessageTrackingReport -Identity $Temp.MessageTrackingReportID -ReportTemplate RecipientPath -RecipientPathFilter Vladimir@adatum.com -BypassDelegateChecking

Всё вышенаписанное было сделано на основе статьи: https://practical365.com/tracking-read-email-messages-exchange-server/ где есть интересное уточнение:

Непрочитанное сообщение в папке «Входящие» и непрочитанное сообщение, которое было удалено [без прочтения], будут неотличимы друг от друга при просмотре отчетов о доставке.

Если появляется ошибка конвертации параметра в Identity, то вместо $Temp.MessageTrackingReportID надо писать $Temp.MessageTrackingReportID.rawidentity
 

Вложения

  • Example.PNG
    Example.PNG
    89 КБ · Просмотры: 10
Последнее редактирование:
Посмотреть используемые мобильные устройства activesync и удалить, если необходимо
Код:
Get-ActiveSyncDevice -Mailbox username |fl identity, first*, devicemodel
Remove-ActiveSyncDevice -Identity "device identity"
 
Если вам действительно нужно более 10 устройств, вы можете изменить политику EASMaxDevices. Лучшая практика заключается в том, чтобы минимизировать число устройств. Используйте приведенные ниже команды, чтобы установить количество устройств равным 20.
Код:
New-Throttlingpolicy "Increased ActiveSync Devices" -EasMaxDevices 20 -EasMaxConcurrency 20
Set-Mailbox username -ThrottlingPolicy "Increased ActiveSync Devices"
 
В дополнение к посту выше об отслеживании ActiveSync устройств (iOS, Android, etc) нужно было понять, какие устройства давно не подключались к Exchange и я нашёл прекрасный скрипт, который явно говорит сколько дней назад устройство связывалось с Exchange сервером.

Скриншот с моего стенда.

Отмечу, что если в рамках леса есть несколько доменов, то, к сожалению, скрипт получает данные только из того домена, откуда был запущен. Если кто-то подскажет что нужно модифицировать (я, к сожалению, в PowerShell далеко не эксперт), то буду премного благодарен.
UPD: оказалось, если не править сам скрипт, то достаточно выполнить в EMS командлет Set-ADServerSettings -ViewEntireForest:$true и тогда в выгрузку попадут устройства из всех доменов леса.


MobileDevice.png
 
Последнее редактирование:
Просмотр очереди
Get-Exchangeserver * | Get-Queue | ft
 
Поиск по вложению в письме в exchange
Get-MailBox -Identity user@domen.ru | Search-Mailbox -SearchQuery attachment:'secret word' -DeleteContent
 
Последнее редактирование:
Узнать ExchangeGuid почтовых ящиков
Get-Mailbox | Sort Name | ft Name,ExchangeGuid
 
Поиск ящика по SMTP адресу
Get-Mailbox -ResultSize Unlimited -Filter {EmailAddresses -like "username@domain.com"} | Sort-Object Name

Удобно искать пользователей давно не подключавшихся
Get-ADUser -filter {enabled -eq $false} -Properties LastLogonTimeStamp -SearchBase ‘OU=Users,OU=OFFICE,OU=Main,DC=domen,DC=local’ | Select-Object Name, @{N='LastLogonTimeStamp '; E={[DateTime]::FromFileTime($_.LastLogonTimeStamp )}}| Sort LastLogonTimeStamp
Name lastlogontimestamp
---- ------------------
Ivanov Ivan1 06.12.2023 11:15:51
Ivanov Ivan2 26.01.2024 11:23:24
 
Последнее редактирование модератором:
Простейший скрипт по очистке старых логов exchange в каталогах
C:\Program Files\Microsoft\Exchange Server\V15\Logging\
С:\Program Files\Microsoft\Exchange Server\V15\Bin\Search\Ceres\Diagnostics\ETLTraces\
Внутри скрипта есть количество дней старше которых логи удалять (надо выставить по вкусу🤌). Так же логика работы понятна.
Понятно что не совсем все это правильно с точки зрения настроек, но иногда как говорится нет времени объяснять...
 

Вложения

Назад
Верх