В домене Active Directory все компьютеры живут по часам одной машины, контроллера с ролью эмулятора PDC в корневом домене леса. Это не прихоть разработчиков, а условие работы протокола Kerberos, который не терпит расхождений дольше пяти минут. Дальше: как устроена служба времени Windows, как направить эмулятор PDC на внешний NTP-сервер, как вернуть рядовые машины на иерархию и как ловить разъехавшиеся часы командами w32tm.

Служба времени Windows и цепочка источников от PDC до клиентов

За время в домене отвечает служба W32Time, в интерфейсе она подписана как Служба времени Windows. Работает она по протоколу NTP через порт UDP 123 и выстраивает строгую лестницу источников. Члены домена по умолчанию используют тип синхронизации NT5DS и берут время из доменной иерархии. Рядовые серверы и рабочие станции ходят за временем к контроллеру, через который входят в домен, контроллеры опрашивают эмулятор PDC своего домена, эмулятор PDC дочернего домена смотрит на контроллеры родительского, а вершина лестницы всегда одна: эмулятор PDC корневого домена леса, и именно он должен получать время с внешнего NTP-сервера.

Контроллер выбирает источник по баллам: свой сайт даёт восемь очков, пометка надёжного источника четыре, родительский домен два, роль PDC ещё одно. Первый поднятый в домене контроллер система автоматически помечает надёжным источником, поэтому он легко становится корнем лестницы. Что будет, если корень не подключить к внешнему серверу? Домен тихо живёт по внутренним часам этой машины до первых проблем со входом.

Внутри леса время защищено: NTP-пакеты подписываются сеансовыми ключами Kerberos, и неподписанный ответ отбрасывается. Сервер, добавленный в список вручную, так не умеет, поэтому вершина лестницы должна быть ровно одна. Службу целиком отключать тоже не стоит: она резервирует порт 123, и сторонний NTP-сервис на той же машине не поднимется.

Допуск Kerberos в пять минут и цена пропущенной синхронизации

Kerberos ставит в каждый билет метку времени, чтобы старые запросы нельзя было подставить повторно. Пока расхождение между часами клиента и контроллера меньше допуска, метки считаются достоверными, стоит его превысить, и билет отвергается. Предел задаётся политикой Максимальный допуск для синхронизации системных часов, в Default Domain Policy он равен пяти минутам; диапазон от одной до 99 999 минут.

Путь к политике: Конфигурация компьютера → Настройка Windows → Параметры безопасности → Политики учетных записей → Политика Kerberos → Максимальный допуск для синхронизации системных часов. Растягивать пятиминутный запас плохая идея: вместе с ним растёт окно, в котором старый билет ещё считается свежим. Лечить надо часы, а не терпимость к ним.

По каким признакам домен показывает, что время уже уехало:

  1. пароль верный, а вход отбивается с сообщением о неверных учётных данных;
  2. машины работают на кэшированных профилях и не открывают сетевые папки;
  3. службы и браузеры жалуются на сертификаты, срок которых ещё не наступил или истёк;
  4. плановые задачи срабатывают с опозданием, по два раза или вовсе не стартуют;
  5. записи в журналах перепутаны по времени, и разбор инцидента превращается в головоломку.

Если такие признаки видны на нескольких машинах, откройте консоль и спросите у домена, чьи часы он считает эталоном. Ответ подскажет, с какого конца начинать ремонт: чаще всего виноват корень лестницы.

Настройка эмулятора PDC на внешние серверы точного времени

Сначала найдите машину с ролью эмулятора PDC: на любой машине с инструментами администрирования откройте командную строку и выполните команду ниже, роль покажет себя в строке PDC.

netdom query fsmo

Вариант в PowerShell с модулем ActiveDirectory:

Get-ADDomain | Select-Object PDCEmulator

Теперь настройте сам контроллер. Откройте командную строку от имени администратора (Пуск → введите cmd → правый щелчок по Командная строка → Запуск от имени администратора) и выполните три команды:

w32tm /config /manualpeerlist:"time.windows.com,0x9" /syncfromflags:manual /reliable:yes /update
net stop w32time && net start w32time
w32tm /resync

Первая строка переводит контроллер на ручной список партнёров, помечает его надёжным источником и сразу применяет изменения. Суффикс 0x9 объединяет клиентский режим с фиксированным интервалом SpecialPollInterval, по умолчанию 1024 секунды. Перезапуск службы заставляет её перечитать конфигурацию, а w32tm /resync просит синхронизироваться сразу.

Один внешний сервер – единственная точка отказа, поэтому партнёров лучше перечислить три и больше через пробел внутри кавычек. Если серверов только два, второму положите флаг 0x2, режим запасного, как в примере:

w32tm /config /manualpeerlist:"ntpserver.contoso.com,0x8 clock.adatum.com,0x2" /syncfromflags:manual /update

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

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Parameters]
"Type"="NTP"
"NtpServer"="time.windows.com,0x1"

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Config]
"AnnounceFlags"=dword:00000005

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpServer]
"Enabled"=dword:00000001

Тип NTP переводит контроллер на ручной список, а параметр NtpServer хранит партнёров; к каждому имени полагается суффикс 0x1, иначе фиксированный интервал не заработает. Значение 5 у AnnounceFlags объявляет машину надёжным источником; если связь с внешним сервером слабая или используется SpecialPollInterval, рекомендуется ставить 10, то есть dword:0000000a. Включённый Enabled разрешает NtpServer раздавать время другим машинам. После импорта перезапустите службу командами net stop w32time и net start w32time.

Переключение рядовых серверов и клиентов на иерархию NT5DS

Рядовым машинам ничего вручную указывать не нужно. Хуже, когда машину когда-то выводили из домена или кто-то направил её на внешний сервер: она живёт в собственном часовом поясе правды и медленно уезжает от домена. Верните её на лестницу командами:

w32tm /config /syncfromflags:domhier /update
net stop w32time
net start w32time

Ключ domhier отправляет клиента за временем по доменной иерархии. После перезапуска службы выполните w32tm /resync и убедитесь, что источник сменился.

Ловушка поджидает тех, кто задаёт источник времени групповой политикой. Если включить политику Настройка NTP-клиента Windows, прописать в ней внешний сервер и применить её к члену домена, служба проигнорирует имя сервера: у доменных машин лестница сильнее любого списка в политике. Внешних партнёров политикой назначают только эмулятору PDC, всем остальным достаточно параметра Тип со значением NT5DS. Путь к параметрам: Конфигурация компьютера → Административные шаблоны → Система → Служба времени Windows → Поставщики времени → Настройка NTP-клиента Windows.

Пара чисел объясняет характер исправлений. MaxAllowedPhaseOffset у членов домена равен 300 секундам: сдвиги до этой величины служба подтягивает плавно, подкручивая ход часов, а всё, что больше, переставляет одним прыжком. Тип AllSync разрешает машине использовать и лестницу, и ручной список как запасной вариант.

Диагностика командами w32tm до того, как сломается вход

Утилита w32tm здесь главный инструмент. Откройте командную строку от имени администратора и начните со статуса:

w32tm /query /status /verbose

Сокращённый пример вывода:

Stratum: 1 (primary reference - syncd by radio clock)
ReferenceId: 0x00000000 (unspecified)
Last Successful Sync Time: 5/23/2023 7:51:39 PM
Source: VM IC Time Synchronization Provider
Poll Interval: 6 (64s)
Phase Offset: -0.0000013s

Строка Source называет текущий источник, в примере это служба интеграции гипервизора. Last Successful Sync Time показывает дату последней удачной синхронизации, Phase Offset текущее расхождение с источником, а Stratum расстояние до эталонных часов: чем выше номер, тем больше погрешности по пути.

Дальше три быстрых вопроса машине:

w32tm /query /source
w32tm /query /peers
w32tm /query /configuration

Первая команда печатает источник одной строкой, вторая перечисляет партнёров со статусом, третья показывает конфигурацию и откуда взято каждое значение.

Состояние всего домена: команда обходит контроллеры и печатает смещения относительно опорной машины:

w32tm /monitor /domain:contoso.com

Доступность внешнего сервера проверяют до смены настроек:

w32tm /stripchart /computer:time.windows.com /dataonly /samples:5

Таймауты здесь означают, что брандмауэр или сеть режут порт UDP 123, и настраивать контроллер рано. События службы живут в журнале: Диспетчер серверов → Средства → Просмотр событий → Журналы Windows → Система, затем Действия → Фильтр текущего журнала и источник W32time. Что именно пишет служба, регулирует параметр EventLogFlags: значение 2 включает журнал смен источника, добавленная единица включает записи о скачках времени.

Двойная загрузка с Linux и аппаратные часы, хранящие локальное время

В каждой машине тикают два времени, системное и аппаратное, RTC или CMOS. При выключении система записывает в аппаратные часы своё время, при включении читает его обратно. Спор начинается из-за стандарта записи: Windows по умолчанию держит в аппаратных часах локальное время, а Linux считает, что там UTC. Поэтому после перезагрузки в другую систему часы уходят ровно на величину часового пояса: в Калининграде на два часа, в Москве на три, в Екатеринбурге на пять.

Многие дистрибутивы, обнаружив при установке соседнюю Windows, сами переводят аппаратные часы на локальный стандарт. Поэтому расхождение проявляется не сразу, а после переустановки или смены порядка загрузки.

Варианта два: подстроить Linux командой timedatectl set-local-rtc 1, либо, и это правильный путь, научить Windows понимать UTC. Откройте командную строку от имени администратора и добавьте в реестр ключ RealTimeIsUniversal; после выполнения система начнёт читать аппаратные часы как UTC:

reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\TimeZoneInformation" /v RealTimeIsUniversal /d 1 /t REG_DWORD /f

Затем выставьте время заново, чтобы оно записалось в аппаратные часы уже в новом стандарте. Если машина включена в домен, вернувшись из Linux, она пробьёт пятиминутный допуск насквозь, пока служба не подтянет время. Для сервера, которому дорога роль в домене, самый надёжный регламент – это запрет двойной загрузки.

Регламентные сдвиги времени и правила безопасного обслуживания

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

Право службы ограничено лимитами коррекции. На контроллерах домена параметры MaxPosPhaseCorrection и MaxNegPhaseCorrection равны 172 800 секундам, то есть 48 часам; у рядовых членов домена стоит 0xFFFFFFFF, ограничение снято. Если машине требуется правка больше лимита, служба её не применит, а лишь запишет событие в журнал. Отсюда частая картина: сервер с мёртвой батарейкой неделями живёт в далёком прошлом, вход в домен на нём не работает, а служба только фиксирует отказ в журнале.

Плановую правку делайте по правилам: окно обслуживания, затем w32tm /resync /rediscover и проверка командой w32tm /monitor /domain:contoso.com, чтобы убедиться, что разрыв уложился в пять минут. Пользователям с уже выпущенными билетами иногда нужно выйти из системы и войти заново, заложите это в объявление о работах.

И последняя тонкость. Kerberos живёт во времени UTC, поэтому смена часового пояса на допуск не влияет: пояс меняет лишь то, что видит человек в трее. Ломает домен именно сдвиг UTC. В России стрелки уже много лет не переводят, так что главный враг точного времени здесь не сезонный перевод часов, а мёртвая батарейка, сервер, поднятый из снимка, и ручная подгонка наугад. Держите один надёжный корень с внешним временем, проверяйте источник и дату последней синхронизации, и домен будет ходить по точным часам без вашего участия.