Home > Windows にまつわる e.t.c.

Windows Time サービス動作確認


Windows OS は、Windows Time サービス(w32time)で時刻同期をしており、ドメイン環境では w32time は常時稼働しています。
ワークグループ環境ではデフォルト w32time はトリガー開始ですが、Windows Server の場合は常時稼働に設定変更しているケースが大半でしょう。

たまに時刻同期が狂ってしまう事があるので、w32timeが期待動作しているのかを PowerShell でチェックする関数を作りました。
(時刻差異は ntp.nict.jp との比較しています)

【注意】 w32tm の出力結果文字列でチェックしているので、日本語環境でのみ動作します。

確認対象台数が少なければ、このまま貼り付けて確認すれば良いです。
確認対象が多ければ、Invoke-Command で投入すると良いでしょう(こいつ目的で作ったものを汎用化しました)

こんな感じに確認できます

PS C:\> $HostName = hostname
PS C:\> CheckW32time $HostName
w81Entx64-main : NTP Interval Min : 17.0666666666667 ( 10 ) Max : 546.133333333333 ( 15 )
w81Entx64-main : 参照NTP -------- dc01.vwnet.jp
w81Entx64-main : 同期経過 -------- OK(3.58939163833333)
w81Entx64-main : 時刻差異 -------- OK(+0.0148508s)

 

関数そのものと手動投入はこちら

# w32time 動作確認
function CheckW32time(){
    $HostName = hostname
    # w32tm が動いてなかったらチェックしない
    if((Get-Service w32time).Status -ne "Running"){
        echo "$HostName : Windows Time Service is not running."
        return
    }
    
    # 最少/最大同期インターバル(分)
    $RegKey = "MaxPollInterval"
    $RegPath = "HKLM:\SYSTEM\CurrentControlSet\Services\W32Time\Config"
    $Result = Get-ItemProperty $RegPath -name $RegKey -ErrorAction SilentlyContinue
    $MaxICount = $Result.$RegKey
    $MaxInterval = ([Math]::Pow(2,$MaxICount))/60

    $RegKey = "MinPollInterval"
    $Result = Get-ItemProperty $RegPath -name $RegKey -ErrorAction SilentlyContinue
    $MinCount = $Result.$RegKey
    $MinPollInterval = ([Math]::Pow(2,$MinCount))/60

    echo "$HostName : NTP Interval Min : $MinPollInterval ( $MinCount ) Max : $MaxInterval ( $MaxICount )"

    $Status = w32tm /query /status
    $Return = $Status | Select-String "ソース: "
    $Parts = @(-split $Return)
    $NTP_Server = $Parts[1]
    echo "$HostName : 参照NTP -------- $NTP_Server"

    $Return = $Status | Select-String "最終正常同期時刻: "
    $Parts = @(-split $Return)
    $LastSyncTime = $Parts[1] + " " + $Parts[2]
    $ElapsedTime = (New-TimeSpan $LastSyncTime).TotalMinutes
    if( $ElapsedTime -lt $MaxInterval ){
        echo "$HostName : 同期経過 -------- OK($ElapsedTime)"
    }
    else{
        echo "$HostName : 同期経過 ○●○● NG($ElapsedTime)"
    }

    $Status = w32tm /monitor /computers:ntp.nict.jp
    $Return = $Status | Select-String "    NTP:"
    $Parts = @(-split $Return)
    $DiffTimeString = $Parts[1]
    $DiffTimeNum = [decimal]$DiffTimeString.Substring(1,$DiffTimeString.Length-2)
    if( $DiffTimeNum -lt 2 ){
        echo "$HostName : 時刻差異 -------- OK($DiffTimeString)"
    }
    else{
        echo "$HostName : 時刻差異 ○●○● NG($DiffTimeString)"
    }
}

# 手動投入
CheckW32time

 

関連情報

ドメインの時刻をNICTのNTPと同期させる

リモート コンピューターのバッチ操作(Invoke-Command)

リモート コンピューターのパラレル バッチ操作(Invoke-Command -AsJob)

Windows OSにおける時刻同期サービスとNTP (@IT)
http://www.atmarkit.co.jp/ait/articles/0508/12/news089.html

 

 

back.gif (1980 バイト)

home.gif (1907 バイト)

Copyright © MURA All rights reserved.