Согласно рекомендациям лучших собаководов при внедрении cross-forest сценария, когда мы условно растягиваем почтовую организацию на 2 леса каждый получатель будет представлен в виде двух объектов. В одном лесе он будет обладать полноценным ящиком, в другом лесе для него будет создан объект Mail Enabled User (или Contact, если ящик мигрировать из леса в лес не планируется). В последний рекомендуется копировать пачку атрибутов из объекта, который обладает почтовым ящиком. Примерный список атрибутов для такого копирования можно подсмотреть, например тут и тут.

Example of Exchange 2010 multiple forest

Если следовать рекомендациям лучших собаководов, то делегирование между лесами не взлетит, потому что они не упоминают о нескольких атрибутах, которые должны быть правильно заполнены в MEU, для того, чтобы заработало делегирование. Вот этот список:

  • mAPIRecipient = TRUE
  • msExchMasterAccountSID = objectSID from Mailbox
  • msExchOriginatingForest = Target Forest FQDN
  • msExchRecipientDisplayType = –1073741818
  • proxyAddresses = X500: + LegacyExchangeDN from Mailbox; existing addresses

Это позволит пользователю с ящиком одного леса назначать права на свой ящик (делегировать доступ) объекту MEU, который связан с почтовым ящиком из другого леса. Это позволит почтовому ящику из другого леса получить доступ к тем ресурсам, на которые ему выдал права пользователь из первого леса.

Полезные ссылки:
Deploy Exchange 2013 in a cross-forest topology
Prepare mailboxes for cross-forest move requests
Prepare mailboxes for cross-forest moves using the Exchange Management Shell
Exchange Server 2010 Cross Forest Delegation
[TUTORIEL]: Partage entre Organisations Exchange (partie 2: coexistence “riche”)
Cross Forest Exchange Impersonation – where the rubber meets the road

Проблема: на почтовом ящике включен аудит, но при поиске ло логам аудита результат всегда нулевой.

Папка /Audits при этом не пустая:

[PS] C:\Windows\system32>Get-MailboxFolderStatistics  mailbox | ? {$_.Name -eq "Audits"} | 
fl FolderPath, ItemsInFolder
...
FolderPath                        : /Audits
ItemsInFolder                     : 10

Это говорит о том, что логи аудита таки собираются, но почему-то при их запросе сервер ничего не возвращает. А не возвращает он из-за того, что локаль на сервере выставлена в Russia (то есть не в United States).

Ссылки:
Search-AdminAuditLog or Search-MailboxAuditLog with parameter returns empty results in Exchange Server
No results using the Search-MailboxAuditLog cmdlet with Exchange 2013 CU4+

Проблема: серверы Exchange 2013 с последним кумулятивом начинают отправлять массово NDR сообщения на адрес inboundproxy@contoso.com.

Известно, что адрес inboundproxy@contoso.com (начиная с Exchange 2013 CU2) используется механизмом Managed Availability для проверки хождения почты внутри почтовой организации между почтовыми ящиками типа Health Mailbox. Поэтому первым делом смотрим состояние этих ящиков:

Get-Mailbox –Monitoring

По каждому ящику получаем забавный вывод:

WARNING: The object child.domain.local/Microsoft Exchange System Objects/Monitoring Mailboxes/
HealthMailbox<guid> has been corrupted, and it's in an inconsistent state. The following 
validation errors happened:
WARNING: Database is mandatory on UserMailbox.
WARNING: Database is mandatory on UserMailbox.

Видно, что ящики поломались – не хватает аттрибута Database. Самый простой способ починить – пересоздать эти ящики. Подробнее процедура описана тут. Итак, ящики пересоздали. Get-Mailbox не возвращает ошибок по новым ящикам. Смотрим дальше – проблема не пропала. Самое время посмотреть тело отправляемого NDR. Если Exchange отправляет почту через сторонний почтовый сервер, то эти письма можно поискать там. Если отправка идёт напрямую, то такие сообщения будут копиться в очередях на самих серверах Exchange. Как их выгрузить в последнем случае можно посмотреть, например, так:

Get-Queue server\idForInboundProxy
Get-Message -Queue server\idForInboundProxy | Suspend-Message -Confirm:$false
Export-Message server\idForInboundProxy\MessageID | AssembleMessage -Path c:\temp\Health1.eml

В моем случае ошибка была следующая:

HealthMailbox<guid>@domain.local
Remote Server returned '550 5.1.1 RESOLVER.ADR.RecipNotFound; not found'

Недвусмысленный намёк, что managed Availability не может найти адрес, на который отправляет почту. Тут есть тонкий момент – все почтовые ящики находятся в дочернем домене child.domain.com. Основной принимающий домен (accepted domain) – корневой домен domain.local. Причём, этот домен не используется в дефолтной политике почтовых адресов (email address policy). И скорее всего, именно поэтому, при пересоздании почтовых ящиков Managed Availability они создались без smtp-адреса из корневого домена domain.local. Поэтому проверки Managed Availability не смогли отправить почту на адрес из корневого домена и сформировался NDR. Остался неразрешённым один вопрос – почему Managed Availability использовал не основной адрес ящика здоровья, а суррогат, сформированный по правилу alias@domain.local. Есть следующая статья в базе знаний, в которой описан обходной путь для решения этой проблемы, и даже указано, что она решена в Exchange 2016 CU4.

Ссылки:
Exchange 2013/2016 Monitoring Mailboxes
Queues Building to inboundproxy.com Domain
Messages for the health mailboxes are stuck in queue on Exchange Server 2016
Dealing with Health Proxy Probe Messages in Exchange 2013 Managed Availability
Exchange Server 2013 and the Inboundproxy.com NDR Message Problem
Managed Availability messages are journaled in Exchange Server 2013

Относительно недавно обновился базовый пакет с основными библиотеками DSC. И вот что я хочу сказать по этому поводу. DSC отлично подходит для разработки и разработчиков. И очень плохо подходит для поддержки и системных администраторов.

Я вижу следующие стоп-факторы в использовании DSC как инструмента автоматизации:

  • DSC по своей архитектуре работает исключительно в рамках конкретного хоста. Это приводит к тому, что если мы хост перегружаем, то логика работы движка DSC сбрасывается. DSC начинает заново выполнять полученный от администратора скрипт, а не с того момента, где в скрипте возникла команда на перезагрузку сервера. Потенциально, этот стоп-фактор может снять настройка ActionAfterReboot LCM’а, которая появилась в Windows Server 2016
  • DSC не имеет штатного инструмента для постановки выполнения скрипта на паузу. Администратор должен переписывать базовые модули, чтобы этот инструмент можно было таки использовать
  • DSC по своей архитектуре постоянно проигрывает скрипт, который получил от администратора. Если у нас в скрипте будет заложена стандартная логика “вывести ресурс из под нагрузки” ⇒ “обновить” ⇒ “вернуть ресурс в работу”, то эта логика будет постоянно проигрываться движком DSC. Ни один штатный ресурс (за исключением разве что xExchange) не предусматривает проверки версионности конфигурации. Следовательно, сразу после завершения скрипта нужно будет быстро-быстро бежать и затирать всю полученную перед обновлением конфигурацию, как это описано, например, тут

Поэтому, коллеги, не верьте политруку, политрук лжёт 🙂

Ссылки:
DSC Resource Kit Release June 2018
How to remove all PowerShell DSC configuration documents (MOF files)?