2017年6月3日土曜日

Windows 7~10時刻同期が正常に行われない場合

Windows 7~8,1、Windows Server 2008~2012 において正常に時刻同期が行われていないことがあります。
その確認方法と対処方法を記載します。

■前提
 前提として『Windows Time』サービスが軌道している必要があります。
 しかし、 『Windows Time』サービスはスタートアップ状態を自動にしても起動しないという仕様になっています。
対処方法は以下の2つがあります。
① 『Windows Time』サービスを使う別のサービスを新に作成する。
②スクリプトで『Windows Time』サービスを強制的に起動させる。

②は比較的簡単です。
batファイルに以下のコマンドを記載してタスクスケジューラでログイン時に管理者権限で実行するだけです。

net start w32time


ただし、batファイルは通常ではタスクスケジューラで管理者権限で実行できません。
そのため、実行したいbatファイルのショートカットを作成し管理者権限で実行するように設定します。
①batファイルのプロパティを起動
②『ショートカット』タブを選択

③『詳細設定(D)』を選択
④『管理者として実行』のチェックボックスにチェックを入れる





■時刻同期の確認方法
以下のコマンドを実行します。

w32tm /query /status


ソースの分部がURLまたはIP+『,0x9』となっていれば正常です。
例:

ソースが『Local CMOS Clock』となっていた場合は、 ハードウェア(マザーボードまたはCPU)から時刻を取得しています。



この場合は、以下の2つの理由が考えられます。
①NTP Serverを設定していない。
②Windowsのバグ。修正パッチKB2493006を適応していない。

①を設定していても②が発生することがあります。そのため、完全に直したい場合は修正パッチの適応をお勧めします。

なお、NTP Serverの設定確認は以下のコマンドを実行し、『NtpServer』の項目で確認できます。

w32tm /query /configuration

例:


■時刻同期方法
 前提の通り、『Windows Time』サービスが起動している状態で以下のコマンドを実行します。

w32tm /resync

例:


■自動化方法
以下の3つのファイルを用意しタスクスケジューラに登録します。
①時刻同期するためのbat
②①を管理者権限で実行するためのショートカット
③①実行時に画面が出ないようにするためのVBScript

①のソース
ファイル名:time_sync.bat

@echo off

rem Windows Time サービスの状態を確認する。停止している場合は起動される。
sc query w32time | findstr STATE | findstr RUNNING
If Errorlevel 1 (
    net start w32time
)

rem 時刻同期を実施する。
w32tm /resync


※念のためWindows Time サービスの起動状態を確認して起動している場合は、サービス起動処理をしないようにしてあります。
仮に毎回起動するようにしても別に影響はありません。サービス起動処理が失敗して次の処理に行くだけです。

②前提に書いてあるショートカット作成方法を参考にしてください。

③ のソース
ファイル名:time_sync.vbs

Set ws = CreateObject("Wscript.Shell")
ws.run "cmd /c C:\ALL_DATA\02_program\time_sync\time_sync.bat.lnk",vbhide


※『C:\ALL_DATA\02_rogram\time_sync\』はbatファイルのあるパスです。
任意の場所で問題ありません。

ファイル配置時の例:





タスクスケジューラへの登録
①『Windowsキー+R』→『Taskschd.msc』と入力してEnterでタスクスケジューラが起動

②左のサイドバーから『タスクの作成』を選択


③『全般』の タブを選択

④『名前(M)』に適当な名称を入力

⑤『最上位の特権で実行する(I)』のチェックボックスにチェックを入れる

⑥『トリガー』のタブを選択

⑦『新規(N)』を選択


⑧『タスクの開始(G)』のリストから『ログオン時』を選択

⑨『遅延時刻を指定する(T)』のチェックボックスにチェックを入れて、リストから任意の時間(30秒がおすすめです)を選択
※サービス起動のために遅延時間を指定しない場合、起動処理がエラー可能性がある。(特にスペックの低いPCの場合)

⑩『繰り返し間隔(P)』のチェックボックスにチェックを入れて、リストから任意の時間を選択
 『継続時間(F)』 のリストから『無期限』を選択
 ※ 『繰り返し間隔(P)』のリストから選択した時間が時刻同期間隔となる

⑪内容を確認してOKボタンをクリック

⑫『操作』タブを選択

⑬『新規(N)』ボタンを選択


⑭『操作(I)』 はそのままにして、『プログラム/スクリプト(P)』の『選択(R)』ボタンを選択し、スクリプトを配置したディレクトリに移動してVBスクリプト『time_sync.vbs』を選択

⑮『OK』ボタンを選択し、タスクスケジューラを終了

⑯PCを再起動



以降、OS起動時に『Windows Time』サービスが起動し、定期的に時刻同期されるようになります。


0 件のコメント: