В домене 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 → Максимальный допуск для синхронизации системных часов. Растягивать пятиминутный запас плохая идея: вместе с ним растёт окно, в котором старый билет ещё считается свежим. Лечить надо часы, а не терпимость к ним.
По каким признакам домен показывает, что время уже уехало:
- пароль верный, а вход отбивается с сообщением о неверных учётных данных;
- машины работают на кэшированных профилях и не открывают сетевые папки;
- службы и браузеры жалуются на сертификаты, срок которых ещё не наступил или истёк;
- плановые задачи срабатывают с опозданием, по два раза или вовсе не стартуют;
- записи в журналах перепутаны по времени, и разбор инцидента превращается в головоломку.
Если такие признаки видны на нескольких машинах, откройте консоль и спросите у домена, чьи часы он считает эталоном. Ответ подскажет, с какого конца начинать ремонт: чаще всего виноват корень лестницы.
Настройка эмулятора 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. В России стрелки уже много лет не переводят, так что главный враг точного времени здесь не сезонный перевод часов, а мёртвая батарейка, сервер, поднятый из снимка, и ручная подгонка наугад. Держите один надёжный корень с внешним временем, проверяйте источник и дату последней синхронизации, и домен будет ходить по точным часам без вашего участия.