Windowsで時刻を合わせるのは(案外)難しい

時刻を合わせるっていうのはシステムにとって重要なことだけど、案外難しかったりする。特にWindowsでは無駄に複雑なのでちょっとだけまとめてみることにしてみた。

0.そもそも正しい時刻をどのように提供するかインターネット上の時刻サーバ、GPS時刻サーバ、プロバイダ提供の時刻サーバ、データセンター提供の時刻サーバなどがある。これらのサーバのどれを正しい時刻とするか、まずは決定する。これはOSを問わず必要な作業だ。

1.ActiveDirectory環境ドメインを構築している場合、Windowsの時刻はドメインコントローラと同期される。基本的にドメイン環境ではドメインコントローラの時刻の正確性だけ気にしておけばあまりトラブルになることはない。ただし、ドメインコントローラの時刻についてはきっちり正しい必要があって、それはNTPで確保するのが一般的。

2.ActiveDirectoryではない環境(WorkGroup環境)ドメインを使用しない場合、時刻同期は非常に厄介になる。

2−1 NET TIMEコマンドを使用するインターネットに直接接続できないような環境で時刻同期を行う場合、NET TIMEコマンドで時刻同期を行うことがある。
NET TIMEコマンドをタスクスケジューラや、ログオンスクリプトに仕込んでおくという方法が考えられるが、NET TIMEコマンドを使用すると、実行されるプロトコルはNTPではなくSMBが用いられる(SNTPを用いることもできる)。SMBにはユーザ認証が必要となっているので、NET USEで認証を通してからNET TIMEを実行する必要がある。また、SMBを使用するので、SMBをブロックするような設定をしているサーバや、SMBを提供していないサーバ、SMBを透過させない環境では有効な方法でない。

2−2 w32timeに頼るw32timeサービスはWindowsの「日付と時刻の同期」に設定されているインターネット上の時刻サーバに、時刻を確認しに行く。使うプロトコルはNTPだ。だから、インターネットに時刻を同期しに行くのであれば、ルータやファイアウォールでNTPが通るようにしておく必要がある。また、同期がどのようなタイミングで行われるのか、確認する必要がある。

2−3 Hyper-V何が厄介って、ドメイン環境でなく、インターネットに接続できない、Hyper-V環境の時刻同期くらい面倒なものはない。Hyper-Vの場合、バージョンによって「再起動時の管理OSとの時刻同期仕様が異なっている」からだ。
管理OSと同期をとらない設定の場合、Hyper-VのV2では再起動で同期されてしまい、V3では同期されない。基本的にHyper-V環境では管理OSも仮想OSも、時刻同期を個別に実施し、仮想OSが管理OSに同期されないように設定するのが良いように思われる。めんどくさいったらありゃしない。