【NTP入門 第5回】Windowsの時刻同期 ― W32Time、ADドメインの時刻の階層、PDCエミュレーターの設定、w32tmの読み方、高精度の時刻同期

NTP サーバー
スポンサーリンク
スポンサーリンク

「ADのドメインコントローラーを入れ替えたら、しばらくしてドメイン全体の時刻が少しずつずれ始めました」
「w32tm /query /sourceを打ったら『Local CMOS Clock』と出ました。これは正常ですか?」

Windowsの時刻同期は、ADドメインの階層に沿って自動で流れます。便利な反面、頂点の1台の設定を忘れると、ドメイン全体がずれていきます。

第4回ではLinuxのchronyを見ました。第5回では、Windows Time サービス(W32Time)と、ADドメインの時刻の階層、w32tmでの確かめ方を扱います。


Windows Time サービス(W32Time)の役割と精度

Windowsの時刻同期は、Windows Time サービス(W32Time)が担います。NTPのクライアントとサーバーの両方の機能を持ち、UDP 123で通信します。

W32Timeは時刻を受け取るNtpClientと時刻を配るNtpServerを持ち、ドメイン参加の端末はドメインのDCからMS-SNTP(認証付き)で、ワークグループの端末はtime.windows.comからNTPで時刻を受け取り、DCのときはPC・メンバーに配ることと、既定はKerberosの5分に足りる精度で、2016以降の高精度の設定で1秒・50ms・1msまで上げられることを示す図
  • もともとKerberos認証の許容範囲(既定で5分)(連載「Kerberos入門」第4回)に時刻を収める目的で作られたため、既定の設定は「Kerberosに足りる程度にゆるく合わせる」もの
  • 2012 R2以前はそれ以上の精度をサポートしないが、Windows Server 2016とWindows 10(1607)以降は、条件を満たせば1秒、50ms、1msの精度をサポートする
  • ドメインのメンバーはドメインコントローラー(DC)からMS-SNTPという認証付きの方式で時刻を受け取り、ドメインに参加していない端末は既定でtime.windows.comと同期する

受け取るのも配るのも同じサービスで、精度は設定で上げるのです。


ADドメインの時刻の階層

ADドメインでは、時刻の流れ(階層)が自動で決まります。

外部の時刻源(社内のNTPサーバー)をフォレストルートcorp.example.jpのPDCエミュレーターDC01にType=NTPで手動設定し、ほかのDC、PC・メンバーサーバー、子ドメインbranch.corp.example.jpのPDCエミュレーター、DC、PC・メンバーがNT5DSで階層に従うことと、設定を忘れると内蔵時計が基準になり全体がずれることを示す図
  • クライアントとメンバーサーバーは、認証を受けたDC(原則として同じサイトのDC)を時刻源にする
  • DCは、そのドメインのPDCエミュレーター(FSMOの役割の1つ。連載「Active Directory入門」第4回)や親ドメインのDCを時刻源にし、子ドメインのPDCエミュレーターは親ドメインのDCを参照する
  • たどっていくと、最上位はフォレストルートドメインのPDCエミュレーター。この1台だけは上位のDCが無いため、外部の信頼できる時刻源(社内のNTPサーバーなど)と同期するよう手動で設定する

設定を忘れると、PDCエミュレーターは自分の内蔵時計(Local CMOS Clock)を基準にし、フォレスト全体が少しずつずれていきます。冒頭の「DCを入れ替えたらずれ始めた」は、このパターンです。階層に従うこの方式をNT5DSと呼び、ドメインのメンバーの既定です。


同期の種類(Type)と既定値の違い

Type意味既定になる環境
NT5DSドメインの階層に従うドメインのメンバー(DC を含む)
NTPNtpServer に書いたサーバーと同期するワークグループ。ルートの PDC エミュレーターは手動でこれにする
AllSync階層と NtpServer の両方を使う—
NoSync同期しない—
設定(レジストリ)DCドメインのメンバーワークグループ
NtpServer(なし)(なし)time.windows.com,0x1
MaxPos/MaxNegPhaseCorrection172,800秒(48時間)0xFFFFFFFF(常に直す)54,000秒(15時間)
MaxAllowedPhaseOffset300秒300秒1秒
Min/MaxPollInterval6/10(64〜1,024秒)10/15(1,024〜32,768秒)10/15
UpdateInterval10030,000360,000

NtpServerのサーバー名の後ろのフラグは、0x1がSpecialPollIntervalの間隔で問い合わせる、0x2が予備(UseAsFallbackOnly)、0x4がsymmetric active、0x8がクライアントモードです。外部のNTPサーバーには0x8を付けるのが一般的です。

ずれの大きさと直し方

DCはMaxAllowedPhaseOffsetの300秒まではslew、そこから48時間まではstep、48時間を超えると直さず、ドメインのメンバーは300秒まではslewでそれ以上はstepで上限がなく、ワークグループは1秒まではslew、15時間まではstep、それを超えると直さないことと、DCが48時間以上ずれると自動では戻らずイベントを記録するだけであることを示す図
  • MaxAllowedPhaseOffset以下のずれはslewで少しずつ、超えるずれはstepで一気に合わせる
  • MaxPos/MaxNegPhaseCorrectionを超えるずれは直さず、イベントを記録するだけ。スナップショットの復元やRTCの電池切れで大きくずれたDCは、自動では戻らない(手順は第10回)

フォレストルートのPDCエミュレーターを設定する

PS> (Get-ADDomain -Identity (Get-ADForest).RootDomain).PDCEmulator
DC01.corp.example.jp
PS> w32tm /config /manualpeerlist:"ntp1.corp.example.jp,0x8 ntp2.corp.example.jp,0x8 ntp3.corp.example.jp,0x8" /syncfromflags:manual /reliable:yes /update
PS> net stop w32time; net start w32time
PS> w32tm /resync /rediscover
PS> w32tm /query /source
ntp1.corp.example.jp,0x8
  • まず、PDCエミュレーターを持つDCを確かめる(netdom query fsmoでもよい)。設定するのはこの1台だけ
  • /manualpeerlist:外部の時刻源。空白で区切り、全体を引用符で囲む。3台以上を指定する(2台なら片方に0x2を付けて予備にする。第3回)
  • /syncfromflags:manual:TypeをNTPにし、階層ではなくリストのサーバーに従わせる
  • /reliable:yes:「信頼できる時刻源」としてドメインに知らせる(DCでだけ意味がある)
  • /update:設定をサービスに知らせる。確実に反映するため、サービスを再起動して/resync /rediscoverで同期し直す
  • 外部へUDP 123で出られることを確かめる。Test-NetConnectionはUDPを試せないため、w32tm /stripchartを使う

状態を確かめる

w32tmを調べる(/query /source・/status・/peers・/configuration、/monitor /domain)、測る(/stripchart /computer、時計は変えずUDP 123の疎通確認にも使える)、直す(/resync、/resync /rediscover)、設定する(/config /manualpeerlist、/syncfromflags:manual・domhier、/reliable:yes、/update)の4つに分けた早見表

w32tm /query /status

PS> w32tm /query /status
閏インジケーター: 0 (警告なし)
階層: 3 (二次参照 - (S)NTP で同期)
精度: -23 (ティックごとに 119.209ns)
ルート遅延: 0.0031250s
ルート分散: 0.0412345s
参照 ID: 0xC0000210 (ソース IP:  192.0.2.16)
最終正常同期時刻: 2026/09/26 16:10:12
ソース: DC01.corp.example.jp
ポーリング間隔: 10 (1024s)
項目(英語版の表示)読み方
閏インジケーター(Leap Indicator)0 は警告なし。3 (同期未実行) は同期していない
階層(Stratum)同期先の1つ下。0 (未指定) は同期していない
ルート遅延/ルート分散(Root Delay/Root Dispersion)最上位までの往復の遅延と、積み重なった誤差(第3回)。分散が秒単位なら同期が止まっている兆候
参照 ID(ReferenceId)同期先の IPv4 アドレス(16進とドット表記)
最終正常同期時刻(Last Successful Sync Time)最後に同期できた時刻。古ければ同期が止まっている。一度も同期していなければ「未指定」
ソース(Source)同期先。Local CMOS Clock や Free-running System Clock は外部と同期していない
ポーリング間隔(Poll Interval)問い合わせ間隔(2のべき乗秒)

出力例はメンバーサーバーのもので、日本語版の Windows の表示です(Windows Server 2016 と Windows 11 で確かめた形。値は例)。英語版では項目名が英語になります。Linuxのchronyc tracking(第4回)に当たるコマンドです。

冒頭の「Local CMOS Clockと出た」は、外部と同期していないという意味です。フォレストルートのPDCエミュレーターなら設定漏れ、それ以外のDCやメンバーなら階層が途切れています。

/source・/peers・/configuration

PS> w32tm /query /peers
ピア数: 3

ピア: ntp1.corp.example.jp,0x8
状態: アクティブ
残り時間: 41.2345678s
モード: 3 (クライアント)
階層: 2 (二次参照 - (S)NTP で同期)
ピアポーリング間隔: 6 (64s)
ホストポーリング間隔: 6 (64s)
(以下、ntp2・ntp3 が続く。抜粋)
  • /source:今の同期先だけを1行で表示する。スクリプトでの確認に便利
  • /peers:時刻源の候補と状態の一覧。状態が「保留中」(Pending)のまま、階層が0 (未指定) のままなら応答が届いていない。Linuxのchronyc sourcesに当たる
  • /configuration:実際に効いている設定と、その出どころを表示する。値の後ろの(ローカル)(英語版は(Local))はレジストリ、グループポリシーから来た値は別の表記(英語版は(Policy))になる
  • /sourceと/configurationは、Windows 11では管理者として実行しないと「アクセスが拒否されました。 (0x80070005)」になる(/status・/peersは一般ユーザーでも見られる)
  • /verboseで詳しい情報、/computer:DC02で他のコンピューターの状態を調べられる(管理者の権限が必要)
  • ドメイン全体はw32tm /monitor /domain:corp.example.jpで、DCごとのずれを一覧できる

w32tm /stripchartと/resync

PS> w32tm /stripchart /computer:ntp1.corp.example.jp /samples:5 /dataonly
ntp1.corp.example.jp [192.0.2.123:123] を追跡中。
5 サンプルを収集中。
現在の時刻は 2026/09/26 16:20:01 です。
16:20:01, +00.0012345s
16:20:03, +00.0011872s
16:20:05, +00.0012011s
16:20:07, +00.0011930s
16:20:09, +00.0012104s
PS> w32tm /resync
再同期コマンドをローカル コンピューターに送信しています
コマンドは正しく完了しました。
  • /stripchartは、相手との時刻の差を測るだけで、自分の時計は変えない。相手にUDP 123が届くかの確認にも使える(届かなければ応答が無い旨のエラーになる)
  • /resyncは、蓄積した統計を捨ててすぐに同期し直す。/rediscoverは時刻源の検出からやり直し、/nowaitは完了を待たずに戻る
  • 「The computer did not resync because no time data was available.」と出たら、時刻源に届いていない。設定と通信を確認する
  • /resyncの後の直し方はMaxAllowedPhaseOffsetで決まり、それを超えるずれは一気に合わせ、それ以下はゆっくり合わせる。Linuxのchronyc makestepのように必ず飛ばすわけではない。出力例は日本語版の表示(英語版は「Sending resync command to local computer」「The command completed successfully.」)

高精度の時刻同期(Windows Server 2016以降)

目標の精度時刻源までの遅延時刻源からの距離CPU 使用率(1日平均)
1秒片道の遅延の累積が 100ms 以内——
50ms5ms 未満stratum 5 以内、6ホップ以内90% 以下(仮想ならホストも)
1ms0.1ms 未満stratum 5 以内、4ホップ以内80% 以下(仮想ならホストも)
  • 経路上のすべてのWindows(上位の時刻サーバー、Hyper-Vホストを含む)が、Windows Server 2016/Windows 10以降であること。W32Timeの開始の種類は「自動」
  • レジストリ(W32Time\Config):MinPollInterval=6、MaxPollInterval=6、UpdateInterval=100、FrequencyCorrectRate=2、UtilizeSslTimeData=0。NtpClientのSpecialPollInterval=64
  • 反映はw32tm /config /updateとサービスの再起動(UtilizeSslTimeDataはOSの再起動が必要)
  • 最上位に正確で安定したstratum 1(GPS受信機付きのNTPサーバーなど)を置く。遠くの公開NTPサーバーでは1msは狙えない

Microsoft Learnは、米国FINRAの50ms、EUのMiFID IIの1msを要件の例に挙げています(第1回)。遅延はw32tm /stripchart /computer:… /rdtsc /samples:450のRoundtripDelayから求めます。Kerberosのためだけなら、既定のままで十分です。NTPとPTPの比較は第9回、設計は第11回の問4で扱います。


グループポリシーでの設定とワークグループの端末

GPO「PDCの時刻源」(Type=NTP・NtpServer、WMIフィルターDomainRole = 5)をDomain Controllers OUにリンクすると、PDCエミュレーターのDC01(DomainRole=5)には適用され、ほかのDC02(DomainRole=4)は対象外で、PDCの役割をDC02へ移すとDC02に適用されDC01から外れるので、GPOの設定は変えなくてよいことを示す図
  • 場所は、コンピューターの構成 > 管理用テンプレート > システム > Windows タイム サービス(> タイム プロバイダー)。「Windows NTP クライアントを構成する」でTypeとNtpServerを指定する
  • PDCエミュレーター用のGPOをフォレストルートドメインのDomain Controllers OUにリンクし、WMIフィルターSELECT * FROM Win32_ComputerSystem WHERE DomainRole = 5でPDCエミュレーターだけに当てると、役割を移しても設定が付いていく
  • 「グローバル構成設定」を有効にすると、画面で変えていない値もGPOの既定値で上書きされる(例:MaxPos/MaxNegPhaseCorrectionが172,800秒になる)。必要なポリシーだけを有効にする
  • GPOで配った値はw32tm /query /configurationで(Policy)と表示される。レジストリを直接直しても、GPOの値が優先される

ワークグループの端末は既定でtime.windows.comと同期し、間隔も長めです。社内にNTPサーバーがあれば、w32tm /config /manualpeerlist:"ntp1.corp.example.jp,0x8" /syncfromflags:manual /updateで向け直します。15時間を超えるずれは、自動では直りません。


仮想マシンのDCと、PDCエミュレーターを移したとき

  • Hyper-V:DCのVMは、統合サービスの「時刻の同期」を外し、ドメインの階層に従わせる(Microsoftの推奨)。ゲストのレジストリVMICTimeProviderのEnabled=0で、ホストからの時刻だけを使わない方法もある
  • VMware:VMware Toolsの周期的な同期は既定で無効。ただし起動・再開・vMotion・スナップショット時の一回限りの同期は有効なので、ESXiホストの時刻を正しく保つ(第6回)
  • DCのVMがホストの時刻に従い、ホストがドメインから時刻を受け取る構成は循環する。どちらか一方を断つ

PDCエミュレーターを移したら

PS> netdom query fsmo
PS> w32tm /config /syncfromflags:domhier /reliable:no /update
PS> net stop w32time; net start w32time
PS> w32tm /query /source
PDCの役割をDC01からDC02へ移すとき、元のPDCのDC01は階層に戻す(domhier・reliable:no)、新しいPDCのDC02は外部の時刻源を設定する(manualpeerlist・reliable:yes)必要があり、片方を忘れるとDC01の設定が残って頂点が2つになるか、DC02に設定が無くLocal CMOS Clockを基準にずれることを示す図

新しいPDCエミュレーターには、前の節の「外部の時刻源」の設定を行い、古い方は上のコマンドで階層に戻します(WMIフィルターのGPOなら自動)。時刻の設定は役割に付いてきません。新旧の2台とも直すのを忘れないでください。


考えてみよう

  1. 自分のPCでw32tm /query /sourceを実行してください。どのDC(またはtime.windows.com)から時刻を受け取っていますか。そのDCは、さらにどこから受け取っていますか。
  2. フォレストルートのPDCエミュレーターを別のDCに移す作業の手順書に、時刻の設定として何を書き加えますか。
  3. 「ときどきKerberos認証に失敗する」と言われたとき、どのコマンドで何を確かめますか。仮想マシンのDCであれば、ほかに何を確かめますか。

ヒント:この記事の階層の図、PDCエミュレーターの設定と移したときの手順、/query /statusのSource・Stratum・Last Successful Sync Timeが手がかりです。


まとめ

  • W32TimeはNTPのクライアント兼サーバー。既定はKerberosの5分に足りる精度
  • ADでは時刻が階層(NT5DS)で流れ、頂点はフォレストルートのPDCエミュレーター
  • 頂点の1台だけ/manualpeerlist … /syncfromflags:manual /reliable:yesで外部の時刻源を3台以上
  • Local CMOS Clockは外部と同期していない合図
  • MaxPos/MaxNegPhaseCorrectionを超えるずれは直さない
  • 高精度(1ms)は2016以降+条件つき。Kerberosだけなら既定で十分
  • PDCエミュレーターを移したら新旧2台とも時刻の設定を直す(WMIフィルターのGPOなら自動)

次回は、ネットワーク機器やESXi・vCenterなど、サーバー以外の機器の時刻同期を扱います。


連載「NTP入門」全11回

全回の目次と、読む順番・目的別の読み方は、NTP入門の入口のページにまとめています。

  1. なぜ時刻同期が必要か
  2. 時刻の基礎知識
  3. NTPの仕組み
  4. Linuxの時刻同期(chrony)
  5. Windowsの時刻同期(この記事)
  6. ネットワーク機器・仮想基盤
  7. 設計と推奨構成
  8. NTPのセキュリティ
  9. PTPと高精度同期
  10. 時刻同期のトラブルシュート
  11. 時刻同期の設計演習

コメント

タイトルとURLをコピーしました