はじめに:Windows標準の時刻同期が頼りない…
私はなぜか、時計が狂っているのがどーしても許せない人です。それも秒単位で。
JJYの正式運用が始まってすぐぐらいに、ホームセンターに電波時計が売っているのを見つけて即購入し(当時確か5,000円近くした)、時刻が自動で合うのを見て感動したのを覚えています。
Windowsのタスクバーの時計も秒を表示させているのですが、最近、デスク付近のNTP時計(いまどきNTPで時刻同期をしてくれる時計というありがたいものがあるのですよ)とタスクバーの時計が5秒とかずれていて発狂しかける(大袈裟)ことが度々ありました。
相方からも「知らんがな」と言われていますが、時計がずれてるのってなんかどうしても許せないんですよねー。
Windowsの時計はなぜずれる?
Windowsで、NTPによる時刻合わせを行っているのは、W32Time(サービスの名前としては「Windows Time」)というサービスです。
Windowsは、標準の設定でも、NTPによる時刻合わせを行うことができます(設定→時刻と言語→日付と時刻 から行えます)。しかし、なぜか普段はW32Timeサービスが停止しています。それが、時刻がずれる原因のような感じがするのですが、なんだか調べても明確にこれが原因で、こうすれば直るというのがよくわかりませんでした。また、真偽は不明ですが、Windows Updateでのアップデート時に設定が戻る恐れもあるようです。
それなら強制的に同期させよう!
それならば、起動時に自動で時刻合わせを実行すればいいじゃない!
ということで、パソコンの起動時に、W32Timeサービスを起動させつつNTPによる時刻合わせを実行する設定手順を書き残しておこうと思います。
1. W32Timeサービスを起こして時刻合わせをするバッチを作る
まず、W32Timeサービスを起動させておいて、そのあとで時刻合わせをするバッチファイルを作成します。
sc query state=inactive | findstr "W32Time"
if %ERRORLEVEL%==0 (
net start w32time
)
w32tm /resync
簡単に中身を解説すると、
1行目:起動していないサービスの一覧からW32Timeを探す
2~4行目:W32Timeが一覧にあれば(1行目がエラーにならなければ)W32Timeサービスを起動する
5行目:W32TimeサービスからNTPによる時刻合わせをする(※「w32time」ではなく「w32tm」なので注意!)
というものです。
これを適当な場所にバッチファイル(.bat)として保存しておきます。
2. タスクスケジューラでバッチを自動起動するタスクを作成する
バッチファイルができたら、タスクスケジューラで、Windowsの起動時にバッチを起動するタスクを作成します。
最初、スタートアップにバッチファイルを置いておけばいいだろうと思ったのですが、これだと管理者権限がなくて処理ができませんでした。
1) タスクスケジューラを起動する
スタートメニューで「タスクスケジューラ」と入力してEnterを押すと、タスクスケジューラが起動します。
2) 新しいタスクを作成する
左のペインで「タスク スケジューラ ライブラリ」をクリックし、真ん中の上側のペインで右クリックして「新しいタスクを作成(C)...」をクリックします。
3) タスクに名前を付けて、最上位の特権を設定する
タスクの作成画面が表示されるので、まず「全般」タブで名前を適宜付けます。
そして、「最上位の特権で実行する(I)」にチェックを入れます。
4) ログオン時に実行するようにトリガーを設定する
「トリガー」タブに移動して、「新規(N)...」をクリックします。
新しいトリガーの作成画面が表示されるので、「タスクの開始(G):」欄を「ログオン時」に変更して、詳細設定の「有効(B)」にチェックが入っていることを確認して「OK」をクリックします。
5) タスク実行時にバッチを起動するように設定する
「操作」タブに移動して、「新規(N)...」をクリックします。
新しい操作の作成画面が表示されるので、「プログラム/スクリプト(P):」欄に先ほど作成したバッチファイルを設定(テキストボックスにフルパスを入力、「参照(R)...」ボタンから探す、どちらでもかまいません)し、「OK」をクリックします。
タスクの作成ウインドウに戻ったら「OK」をクリックしてタスクの作成を完了させたらミッション完了です。
再起動して、起動直後にコマンドプロンプトが出現して数秒で消えたら正常です。
こうして私の時計環境に平和が訪れた!(たぶん)
これでWindowsの起動時に必ず時刻合わせをしてくれるので、平和な日々が訪れる…はずです(今日Myパソコンに設定したから長期的な動作確認はまだできてません)。
同期成功した日時がちゃんとテストしたとおりになっているので、たぶん大丈夫だと思います。
備忘録ではありますが、何かの参考になれば幸いです。