時刻同期

Windowsを使っていて、パフォーマンスやセキュリティを気にする時、起動サービスはできるだけ少ないほうが良いと思います。時刻同期を行うサービスはその一つです。W32timeは時刻の同期を維持する機能があります。しかし、時刻のずれをそんなに意識しない場合は停止していても良いサービスだと思われます。同期を取りたい場合のみサービスを起動してすれば十分です。そこで、時刻同期のシェルを作成しました。W32timeを起動して時刻同期の処理を行います。これを日時のタスクに登録しておけば、時刻の同期が1日ずつ行われ、W32timeは常時起動状態にせずに済みます。

set-PSDebug -strict
#------------------------------
# 時刻同期
#------------------------------
Function SetTime{
    
    # エラー メッセージを表示せずに処理を続ける
    $ErrorActionPreference = "SilentlyContinue"
    
    # サービス名
    $service_name = "W32Time"
    
    # サービスが停止中の場合、起動する
    $status = ( get-service $service_name ).status
    if ($status -eq "Stopped"){
        start-Service $service_name
    }
    
    # 時刻同期(最大2回リトライ)
    $result = [boolean]
    for($n=1; $n -le 3; $n++){
        w32tm /resync | out-null
        $result = $?
        if ($result){ break }
        start-Sleep -second 3
    }
    
    # サービスが起動中の場合、停止する
    $status = ( get-service $service_name ).status
    if ($status -eq "Running"){
        stop-Service $service_name
    }
    
    # 時刻同期失敗の場合
    if (!$result){ throw }
    
    # エラー捕捉
    trap {
        $msg = "時刻同期に失敗しました。"
        write-Host $msg
        $EventLog = new-Object system.Diagnostics.EventLog
        $EventLog.log = "Application"
        $Eventlog.source = "SetTime.ps1"
        $Eventlog.WriteEntry($msg, "Error", 111)
    }
}