Нет ничего сложного в администрировании Windows инфраструктуры говорили они. Все эти ваши окошки и далее-далее, проприетарщина…

Ничего не предвещало каких-либо изменений. Обычный рабочий день. В один прекрасный день: конец года, бюджетирование, давайте уже переходить на актуальные версии Windows. Принимаем решение: будем обновлять наши домен контроллеры 2012R2 до 2019. Всё бы просто, поднял рядом, перенёс роли и живи припеваючи. Но те, кто работал с Windows знают, что всё обычно не так радужно и стоит учитывать все подводные камни.

Имея у себя Exchange и пачку других сервисов от M$ понимаешь, что нужно садиться и читать. Открывая странички рекомендаций, форумы и прочие интересности, становится ясно, что предстоит обновление Exchange 2013 до актуальных версий.

Поняв ограничения, которые накладывают новые версии:

  • Работа Outlook по MAPI – минус старые клиенты

  • Подключение к серверу по TLS 1.2 – минус старые ОС

  • Что-то ещё?

Начинаем планирование обновления Exchange c 2013 на 2019. Имея довольно простую архитектуру системы, начинаешь задумываться о том, как бы всё не сломать и что получится в итоге.

Первоначальная конфигурация Exchange
Первоначальная конфигурация Exchange

 Кому подробностей:

  • Почтовый шлюз в виде кластера от известного вендора из верхнего правого угла magic quadrant gartner

  • CAS-ы без дополнительных балансировщиков. Простой DNS Round Robin

  • Почтовая база в DAG-е на паре MBX серверов

  • Пользователи подключаются к CAS-ам, с той лишь разницей, что для внешних подключений используется WAP на базе Server 2019.

Поскольку в Exchange 2019 роль CAS-а отдельно не существует, а является службой на сервере Exchange понимаем, что мы получим минус 2 севера (ура экономия). Решаем запускать процесс. Не будет излишним указать план, который получился в итоге:

  • Установка Windows Server 2019

  • Установка предварительного софта (.Net, Visual C++ и т.д.)

  • Получить права Enterprise Administrator (в моём случае хватает и его, но M$ по этому случаю говорит "Your account needs to be a member of both the Schema Admins and Enterprise Admins security groups" )

  • Выпуск сертификата для Exchange c именами новых серверов

  • Подготовка AD и схемы леса (изменится SCP) – здесь почта перестаёт работать на почтовых клиентах

  • Установка Exchange на новые сервера по далее-далее, выбираем роль почтового сервера, ставим инструменты управления

  • Настройка SCP, указывающую на старые сервера Exchange – здесь почта начинает работать на почтовых клиентах

  • Импорт сертификатов со старых серверов на новые, биндинг их для служб, перенастройка VirtualDirectory на новых серверах Exchange

  • Меняем на WAP для клиентов IP CAS на новые сервера

  • Устанавливаем SCP на новые сервера – по факту ящики будут хранится в старой базе, но точкой подключения станут новые сервера

  • Организация DAG из новых серверов

  • Создание нового пользователя в новой DAG. Тесты с новым пользователем, миграция между DAG-ами, проверка отказоустойчивости новой DAG

  • Подготовка и рассылка информационного письма о смене почтового сервера администраторам пользователей Exchange

  • Миграция всех служебных почтовых ящиков Exchange

  • Миграция нескольких рабочих пользователей в новую DAG. Определить время миграции 10 ящиков

  • Миграция всех в новую DAG группами по 10 почтовых ящиков

  • Удаляем Exchange со старых серверов, тушим VM

Разбиваем всё на этапы, подготавливаем скрипты для автоматизации процессов, согласовываем время простоя. Решено – установку проводим в субботу, а дальше разберёмся. На всё про всё закладываем месяц.

Приступаем к установке:

  • Windows Server 2019 (не буду повторять пост одного человека, как он LAMP устанавливал)

  • Устанавливаем требуемые компоненты

Install-WindowsFeature Server-Media-Foundation, NET-Framework-45-Features, RPC-over-HTTP-proxy, RSAT-Clustering, RSAT-Clustering-CmdInterface, RSAT-Clustering-Mgmt, RSAT-Clustering-PowerShell, WAS-Process-Model, Web-Asp-Net45, Web-Basic-Auth, Web-Client-Auth, Web-Digest-Auth, Web-Dir-Browsing, Web-Dyn-Compression, Web-Http-Errors, Web-Http-Logging, Web-Http-Redirect, Web-Http-Tracing, Web-ISAPI-Ext, Web-ISAPI-Filter, Web-Lgcy-Mgmt-Console, Web-Metabase, Web-Mgmt-Console, Web-Mgmt-Service, Web-Net-Ext45, Web-Request-Monitor, Web-Server, Web-Stat-Compression, Web-Static-Content, Web-Windows-Auth, Web-WMI, Windows-Identity-Foundation, RSAT-ADDS

Установить NET Framework 4.8.

Установить Visual C++ Redistributable Package for Visual Studio 2012.

Установить Visual C++ Redistributable Package for Visual Studio 2013.

Установить компонент Server Media Foundation:

Install-WindowsFeature Server-Media-Foundation

Установить Microsoft Unified Communications Managed API 4.0, Core Runtime 64-bit

  • Не забываем сохранить текущую конфигурацию Exchange

Start-Transcript EnvironmentBackup.txt
Get-OutlookProvider | Format-List
Get-OutlookAnywhere | Format-List
Get-ClientAccessServer | Format-List
Get-ActiveSyncVirtualDirectory | Format-List
Get-AutodiscoverVirtualDirectory | Format-List
Get-EcpVirtualDirectory | Format-List
Get-OabVirtualDirectory | Format-List
Get-OwaVirtualDirectory | Format-List
Get-MapiVirtualDirectory | Format-List
Get-PowerShellVirtualDirectory | Format-List
Get-WebServicesVirtualDirectory | Format-List
Get-SendConnector | Where-Object {$.Enabled -eq $true} | Format-List
Get-SendConnector | Where-Object {$.Enabled -eq $true} | Get-ADPermission | Where-Object {$_.extendedrights -like "routing"} | fl identity, user, *rights
Stop-Transcript

  • Установка Exchange. Здесь действительно далее-далее. Получаем предупреждение о том, что будет изменена схема леса, как следствие меньше, чем 2019й Exchange больше не станет – далее. В консоли администрирования отрастают новые сервера, но у части пользователей (внутренних) ломается подключение к Exchange. Хотелось бы объяснить, что произошло.

    Для понимающих можно пойти дальше, всё одно мы это пофиксим при правке биндингов. А интересующимся опишу порядок подключения почтового клиента (читай Outlook) к Exchange.

    Сама процедура поиска сервера отличается в зависимости от версии Outlook, но если брать современные (2013+) происходит по следующим этапам:

  • Поиск сервера через Service Control Point (SCP)

  • Поиск сервера через DNS запись autodiscover

  • Поиск сервера через DNS SRV запись

    Естественно, всё дело в том, что значение SCP изменилось, часть пользователей начало подключаться через новые Exchange сервера к почтовой базе, а там сертификтаты самоподписанные.  Чтобы решить эту проблему экспортируем сертификат со старого сервера через браузер или через Shell при помощи командлета Export-ExchangeCertificate. В дальнейшем импортируем на новые сервера и настраиваем биндинг на нужные нам службы. Кроме всего прочего, задаём параметры VirtualDirectory для серверов. Можно править как в браузере, так и через Shell при помощи Get-OutlookAnywhere, Get-ClientAccessService, Get-OwaVirtualDirectory, Get-OabVirtualDirectory, Get-ECPVirtualDirectory и т.д.

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

    Промежуточная конфигурация Exchange
    Промежуточная конфигурация Exchange

    Наступила рабочая неделя, пошли отлавливать косяки. Поскольку с конечными пользователями работают администраторы на филиалах, то первыми о сбоях сообщают им. Как ни странно, проблем почти нет. Начинаем менять DNS для переключения точек входа пользователей на новые сервера. И практически сразу находим несколько очень интересных кейсов:

  • Пользователи с 2007 офисом не подключаются к новым серверам

  • Пользователи под Windows 7 не подключаются к новым серверам

  • Не работает OWA через новые сервера (после ввода кредов крутится сообщение owa still working on it)

    Начинаем решение по мере появления проблем:

  • Администраторам ещё раз сообщаем – офис минимум 2010 с KB2899591

  • Windows 7 – пока не очевидно, приписываем локальные hosts, указывающие на старые сервера

  • OWA – проблема решилась путём простого поиска по запросу wap exchange 2019 still working on it. Как оказалось нужно было добавить вот такой ключик в реестре на WAP:
    HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings\WinHttp\EnableDefaultHttp2 Value: 0

  • Проблема с Windows 7 в качестве клиента решалась практически неделю, но оказалась в самом очевидном месте. После установки тестовой машины, и прогона кучи тестов было выяснено, что сервер отфутболивает попытки подключения, а Wireshark помог разобраться почему. Оказалось, что Exchange Server 2019 по умолчанию работает с TLS 1.2, в то время как Windows 7 такое может только после патчей. Ставим на клиенты KB3140245 и Microsoft EasyFix 51044, удаляем старые записи в hosts файле – профит.

    Следующим этапом будет разворачивание новой DAG. Мануалов миллион. Процедура выглядит следующим образом:

  • Берём базу на одном из новых серверов. Перемещаем её на отдельный диск с внятным названием. Используем Move-DatabasePath.

  • Создаём DAG. Используем New-DatabaseAvailabilityGroup, где в качестве свидетеля используем всё тот же север, который является свидетелем для старой DAG, но с другой папкой.

  • После создания DAG добавляем в неё новые сервера используя Add-DatabaseAvailabilityGroupServer, после чего добавляем копию базы данных на второй сервер через Add-MailboxDatabaseCopy.

  • Проверяем полученный результат: Get-MailboxDatabaseCopyStatus

    По факту на данном этапе мы готовы к миграции. Начинаем тестирование, проверки отказоустойчивости и прочие полезные вещи. Не забываем начать добавить новые сервера в резервное копирование. Всё проходит успешно.

    Мигрируем системные почтовые ящики:
    Get-Mailbox -Arbitration -Server MBX1 | New-MoveRequest -TargetDatabase DB2

    Запускаем миграцию. Ввиду того, что у нас лес с кучей доменов, а глобальный каталог растянут по всем контроллерам в лесу, то необходимо использовать конкретный домен контроллер, а через web данная операция невозможна. Выбираем десяток пользователей и идём в Shell.

    New-MoveRequest -Identity User1 -DomainController domain.local -TargetDatabase DB2 -BadItemLimit 10

    Get-MoveRequest -DomainController domain.local | Get-MoveRequestStatistics

    Get-MoveRequest -DomainController domain.local -MoveStatus Completed | Remove-MoveRequest -DomainController domain.local

    Мигрируем потихоньку пользователей, смотрим как оно идёт, периодически ловим сбои при миграции. Очень помогает интересный синтаксис.

    Get-MoveRequest -DomainController domain.local -movestatus Failed | Get-moverequeststatistics | select DisplayName,SyncStage,Failure*,Message,PercentComplete,largeitemsencountered,baditemsencountered | ft -autosize

    Возникла проблема с зависанием миграции. Всё что гуглилось, попадало под запрос Move Exchange mailbox FailedOther stops at 95%. И решение, которое никак не задокументировано, но работает

    Get-MoveRequest -Identity User1 -DomainController domain.local | Set-MoveRequest -MoveOptions skipKnownCorruptions,skipFolderPromotedProperties -DomainController domain.local

    Get-MoveRequest -Identity User1 -DomainController domain.local | Resume-MoveRequest -DomainController domain.local

    У пользователя после миграции появились пустые папки, которые он раньше удалял, повторил операцию – всё продолжило работать.

    Итоговоая конфигурация Exchange
    Итоговоая конфигурация Exchange

    Вот так прошёл наш переезд. В целом на всё про всё ушло 2 недели. Плюс неделя на подготовку. Из неучтённого – возникла проблема с календарями. Пользователи, находящиеся в старой базе Exchange, не видели календари пользователей в новой базе. Разбираться не стали, просто завершили миграцию и по окончании у всех всё заработало. По завершении миграции просто удалили Exchange со старых серверов через установку/удаление программ и потушили VM.

    Из полезного. Изменился формат хранения индексов БД Exchange, они сейчас хранятся в самой БД, что обеспеченивает лучшее быстродействие (читай поиск), а также исчезает необходимость проверки данных индексов, поскольку используется другая ифраструктура. Увеличилась безоасность подключения клиентов, ввиду использования TLS 1.2. Появился интерфейс OWA оптимизированный для мобильных устрйоств.

Комментарии (9)


  1. 13werwolf13
    16.12.2021 11:21

    По завершении миграции просто удалили Exchange со старых серверов через установку/удаление программ и потушили VM.

    простите мою тупость, но зачем было удалять софт с вм если вм всё равно отправляется в утиль?


    1. dotnetfx40
      16.12.2021 11:37

      Возможно процедура/политика вывода из эксплуатации ноутов/hardware серверов продублирована и для VM.


    1. outlingo
      16.12.2021 11:54
      +3

      Насколько помню, exchange при удалении удаляет упоминания о себе из activedirectory, и если сервер просто убить, потом необходимо руками информацию о нем оттуда вычищать.


      1. Mnemonic0 Автор
        16.12.2021 13:42
        +2

        Именно. Вся информация о серверах Exchange, базах данных, DAG, хранится в AD. Если есть желание посмотреть - подключаемся через ADSI Edit в контекст конфигурации. Там идём в CN=Microsoft Exchange,CN=Services,CN=Configuration,DC=domain,DC=local - собсвенно всё это счастье и есть кофигурация Exchange. И именно эти сведения появляются/удаляются при установке/удалении exchange.

        Соответсвенно, в случае если вы ставили обновляли Exchange и решили откатить сервера назад - ничего у вас не выйдет, поскольку как минимум данный OU нужно будет восстановить, а иначе вы получите работающий сервер с нерабочим сервисом. И скорее всего частично всё будет работать, но весь лог AD, Exchange сервера и клиентов будет красным.


    1. komflex
      16.12.2021 13:35
      +2

      Информация о exchange серверах хранится в active directory, чтобы корректно удалить информацию о старых серверах необходима процедура через удаление программы.


    1. vesper-bot
      16.12.2021 13:55

      (уже объяснили и не раз… я буду обновлять комменты)


  1. W3n8f34
    17.12.2021 13:24

    Понравилась фраза

    Подготовка и рассылка информационного письма о смене почтового сервера администраторам пользователей Exchange

    И
    Администраторам ещё раз сообщаем – офис минимум 2010 с KB2899591


    То есть вы там самый умный архитектор, повышаете уровень домена со старыми клиентами. Зачем?


    1. Mnemonic0 Автор
      17.12.2021 13:28
      +1

      Всё довольно просто просто. Мы, зная о том, что есть рабочие места с версиями ПО, ниже рекомендуемой - заставляем администраторов обновить рабочее место.
      Зачастую и лицензии есть и железо нормальное, а пользователь по каким-то причинам сидит со старым офисом. В таком случае обновление сервера подталкивает поработать.
      Ну и то колличество клиентов (0.3% от всех), которым необходимо провести обновление, не должно задерживать нас в нашем стремлении к новым версиям ПО.


      1. W3n8f34
        17.12.2021 15:31

        0.3% не 30% конечно, нужно сразу указывать на это в статье, иначе эта статья не стала бы ценной инструкцией к действиям тем, кому предстоит ещё апгрейд

        Тогда извините, все технически написано верно, зря я придрался. Ну можно конечно добавить что такие обновления лучше делать на тестовом стенде с полной имитацией инфраструктуры.

        П.с кстати обновление с 2010 exchange до 2019 ещё веселее :)