2015年4月5日 星期日

windows 時間自動校正

作業系統:win7
[預設的時間校時]
winodws 在「控制台」->「日期和時間」->「網際網路時間」->「變更設定」裡面的「與網際網路時間伺服器同步處理」,可以按「立即更新」來校正時間。
但是這邊沒辦法設定多久自動校時一次,而且內建的時間伺服器(例如time.windows.com)如果校正失敗,也沒辦法在這裡手動新增其他時間伺服器。

[新增預設的時間校時伺服器下拉選單內容]
如果要修改上述的時間伺服器下拉選單。
可執行 regedit 編輯系統登錄檔,在 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\DateTime\Servers] 裡面可以新增修改可用的時間伺服器下拉選單。

[設定多久校時一次:NTPClock、Windows Time(W32Time)]
如果要設定多久自動校時一次,可以下載國家時間與頻率標準實驗室的 NTPClock 校時程式。
或是用系統內建的 Windows Time(W32Time) 服務來設定。
以下介紹 Windows Time(W32Time) 。

[啟動 W32Time]
先使用 w32tm /query /peers 看目前 W32Time 的時間伺服器有哪些,如果顯示服務尚未啟動。則先到「服務」中,將 Windows Time 啟動,並將啟動類型設定為「自動(延遲開始)」(沒設定延遲開始,重開機似乎會無法啟動)。
C:\Windows\system32>w32tm /query /peers
發生下列錯誤: 服務尚未啟動。 (0x80070426)
如果有正常啟動,執行 w32tm /query /peers 就可看到目前的時間伺服器設定(這邊的伺服器清單跟「網際網路時間」那邊的下拉清單不同)
C:\Windows\system32>w32tm /query /peers
#對等: 1

對等: time.windows.com,0x9
狀態: 擱置中
剩餘時間: 603689.4865209s
模式: 0 (保留)
組織層: 0 (未指定)
對等輪詢間隔: 0 (未指定)
主機輪詢間隔: 0 (未指定)

[修改 W32Time 的校時伺服器清單]
我將時間伺服器修改成使用國家時間與頻率標準實驗室的 Server,多台 Server 用空白間隔。(server 後面有加上「0x1」的話,之後可使用 regedit 編輯系統登錄檔的 SpecialPollInterval 設定,來設定校時的間隔時間。)
C:\Windows\system32>w32tm /config /update /manualpeerlist:"tock.stdtime.gov.tw,0x1 watch.stdtime.gov.tw,0x1"
C:\Windows\system32>w32tm /query /peers
#對等: 2

對等: tock.stdtime.gov.tw,0x1
狀態: 使用中
剩餘時間: 4.1709780s
模式: 3 (用戶端)
組織層: 2 (次要參照 - 依 (S)NTP 同步處理)
對等輪詢間隔: 10 (1024s)
主機輪詢間隔: 10 (1024s)

對等: watch.stdtime.gov.tw,0x1
狀態: 使用中
剩餘時間: 4.6397280s
模式: 3 (用戶端)
組織層: 2 (次要參照 - 依 (S)NTP 同步處理)
對等輪詢間隔: 10 (1024s)
主機輪詢間隔: 10 (1024s)


[修改 W32Time 教時的時間間隔 ](當 server 有加上「0x1」設定時)
使用 regedit 編輯系統登錄檔,修改 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpClient] 底下的 SpecialPollInterval 設定值,設定隔多少秒校時一次(似乎要重新啟動系統才會生效)
(預設是604800秒,7天)


[手動執行 w32tm /resync 校時]
手動校時,可執行 w32tm /resync 指令。
C:\Windows\system32>w32tm /resync
正在傳送 resync 命令給本機電腦
命令已經成功完成。


[使用工作排程校時]
如果不想經由修改系統登錄檔,來設定校時的時間間隔。也可選擇使用工作排程器,定時執行 w32tm /resync 指令來校時。

[執行批次檔校時]
或是使用批次檔,每隔一段時間執行一次 w32tm /resync 校時指令
@echo off
cd c:
c:

:aa

for /f "tokens=1-4 delims=-/ " %%i IN ("%date%") DO (
set year=%%i
set month=%%j
set day=%%k
)

SET fname=%year%-%month%-%day%
SET fname=%fname: =0%
REM 將執行結果存放在 c:\my_ntp_log\
SET fname=c:\my_ntp_log\%fname%.txt

echo start: %date% %time% >> %fname%
w32tm /resync >> %fname%
echo end: %date% %time% >> %fname%

timeout  /t 900 /nobreak
goto aa

pause


查看跟某台時間伺服器(例如:tock.stdtime.gov.tw)的時間差異,/samples:5 顯示5筆樣本資料,/僅顯示資料,不顯示圖形
w32tm /stripchart /computer:tock.stdtime.gov.tw /samples:5 /dataonly

(其他時間伺服器:w32tm /config /update /manualpeerlist:"tock.stdtime.gov.tw watch.stdtime.gov.tw time.stdtime.gov.tw clock.stdtime.gov.tw tick.stdtime.gov.tw")


參考:
windows time 服务无法启动解决方法:w32tm /register
https://technet.microsoft.com/en-us/library/cc773263.aspx
[Windows] w32tm 應用:簡單的 Script 讓 Windows 進行時間同步
如何調整 Windows 作業系統的時間正確性 ( 終極指令版 )
網域主控站(DC)如何正確設定 Windows 時間服務 (w32tm)

4 則留言:

  1. [修改 W32Time 教時的時間間隔 ](當 server 有加上「0x1」設定時)

    路徑應該是 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpClient] 才對哦!

    回覆刪除
  2. 你好,
    請問在PDC上的校時設定,是否也可以用command設定server 後面有加上「0x1」,之後使用 regedit 編輯系統登錄檔的 SpecialPollInterval 設定,來設定校時的間隔時間?
    如下設定可以嗎?
    w32tm /config /manualpeerlist:"tock.stdtime.gov.tw,0x1 watch.stdtime.gov.tw,0x1"
    /syncfromflags:manual /reliable:yes /update

    回覆刪除
    回覆
    1. 您好,不好意思,我第一次聽到 PDC,本想測試看看,
      但 google PDC 後,才發現我手邊沒這樣的環境,無法測試 Orz
      所以只能建議您如果測試後不行,一時也找不到解決方法、或最後發現真的無法設定校時間隔,
      或許可考慮用文章後面的批次檔自訂校時間隔,之前我用批次檔校時跑幾年都正常。

      刪除