NetworkTimeProtocol(NTP)提供了準確時間,但因種種緣由,咱們的企業服務器、核心交換機、或者客戶終端沒能與之同步或者因時間源問題同步了錯誤的數據,可想而知形成一系列的後果。固然,因NTP服務是典型的CS架構,本着高效簡潔,咱們能夠在覈心交換機裏配置兩個或更多個的時間源,咱們能夠在企業內部構建NTP服務......那麼,終端層面上全部的問題都解決了麼?顯然不是。php
公司某臺終端域用戶打電話,沒法登陸進域了,後發現因其電腦時間是"2009/10/1514:00:06"之類;shell
因公司某終端系統時間錯誤,其某老版本的企業版卡巴殺毒變紅色失效了......windows
該死,公司的指紋打卡系統的時間不對了,你們怨聲載道.....服務器
因系統時間不正確,咱們電腦上一些軟件也工做不正常了.....網絡
那麼,對應的,及時地經過網絡給客戶端校時,給企業內部NTP源校時彷佛就OK了。架構
但是:一些只是工做組環境的中小企業呢?沒有外網只有局域網環境的企業呢?爲此,一個好友電話來電問到局域網終端校時的種種可能性及解決方法:dom
1.若公司有活動目錄,經過其組策略部署以下腳本下去,實現終端與domain進行時間同步(弊端是客戶端偏差若超過5分鐘會返回失敗,相關連接:http://gnaw0725.blog.51cto.com/156601/660268):ide
net time \\domain /set /y
2.經過網維通道、GPO(好比做爲開機策略)及CS架構的應用等等裏邊推送網絡校時,應朋友要求,結合網上一些開源的資源,通過加工修改整理以下,但願他能用得上。spa
A:使用時間源:time.windows.com(你們都懂這個源的,缺點是偶爾速度有點慢)進行的時間同步:code
#cs Au3 版本: v3.3.9.21 (Beta) 腳本做者:boyhong 技術介紹: http://boyhong.blog.51cto.com 腳本功能: 網絡校時 #ce #Include <Date.au3> ;若用於策略靜默推送,請自行去掉msgbox If _Hdate() Then MsgBox(0,_Now(),"時間已同步",3) Else MsgBox(16,"錯誤","同步失敗",30) EndIf Func _Hdate() Local $oHTTP,$H_time,$str,$Date Local $mon[13]=[12,"Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"] $oHTTP = ObjCreate("microsoft.xmlhttp") $oHTTP.Open("get","http://time.windows.com/",false) $oHTTP.setRequestHeader("ver", "1.2") $oHTTP.Send() $str = StringTrimLeft($oHTTP.getResponseHeader("Date"),4) For $i = 1 To 12 $str = StringReplace($str,$mon[$i],$i) Next $str = StringSplit($str," :") $tNew=_Date_Time_EncodeSystemTime($str[3],$str[2],$str[4],$str[5],$str[6],$str[7]) Return _Date_Time_SetSystemTime(DllStructGetPtr($tNew)) EndFunc
B:使用百度(www.baidu.com)的時間源進行時間同步:
#cs Au3 版本: v3.3.9.21 (Beta) 腳本做者:boyhong 技術介紹: http://boyhong.blog.51cto.com 腳本功能: 網絡校時 #ce #Include <Date.au3> ;若用於策略靜默推送,請自行去掉msgbox If TimeSync() Then MsgBox(0,_Now(),"時間已同步",3) Else MsgBox(16,"錯誤","同步失敗",30) EndIf Func TimeSync() $http = ObjCreate("microsoft.xmlhttp") $http.Open("Get","http://www.baidu.com/?" & _Now(),False) $http.Send("") $baidutime = $http.GetResponseHeader("Date") $S = StringSplit("Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec",",") For $i = 1 To 12 $baidutime = StringReplace($baidutime,$S[$i],$i) Next $S = StringSplit($baidutime,", :") $tNew = _Date_Time_EncodeSystemTime($S[4],$S[3],$S[5],$S[6],$S[7],$S[8]) Return _Date_Time_SetSystemTime(DllStructGetPtr($tNew)) EndFunc
C:使用某臺WEB服務器上的時間來進行校時:
#cs Au3 版本: v3.3.9.21 (Beta) 腳本做者:boyhong 技術介紹: http://boyhong.blog.51cto.com 腳本功能: 網絡校時 #ce #include <Inet.au3> #Include <Date.au3> $SHIJIAN = _INetGetSource('http://www.timedate.cn/worldclock/ti.asp') If $SHIJIAN <> "" Then Local $DATA = StringRegExp($SHIJIAN, "[nyear|nmonth|nday|nhrs|nmin|nsec]=(.{1,4});", 3) If IsArray($DATA) Then If StringLen($DATA[1]) < 2 Then $DATA[1] = "0" & $DATA[1] If StringLen($DATA[2]) < 2 Then $DATA[2] = "0" & $DATA[2] If StringLen($DATA[4]) < 2 Then $DATA[4] = "0" & $DATA[4] If StringLen($DATA[5]) < 2 Then $DATA[5] = "0" & $DATA[5] If StringLen($DATA[6]) < 2 Then $DATA[6] = "0" & $DATA[6] Dim $D_RIQI = $DATA[0] & "-" & $DATA[1] & "-" & $DATA[2] Dim $D_SHIJ = $DATA[4] & ":" & $DATA[5] & ":" & $DATA[6] If _DateIsValid($D_RIQI & " " & $D_SHIJ) Then RunWait(@ComSpec & " /c date " & $D_RIQI, @ScriptDir, @SW_HIDE) RunWait(@ComSpec & " /c time " & $D_SHIJ, @ScriptDir, @SW_HIDE) EndIf EndIf EndIf
在此,不難看出,若沒有外網環境沒有活動目錄呢?上邊的C方案若變通一下讓其架構在公司局域網環境呢?答案是可行的。朋友正好有一個PHP環境,在其服務器目錄下放置一個頁面:test.php,內容以下:
<? echo date ('Y-m-d G:i:s'); ?>
而後在每一個終端的部分是:
#cs Au3 版本: v3.3.9.21 (Beta) 腳本做者:boyhong 技術介紹: http://boyhong.blog.51cto.com 腳本功能: 網絡校時 #ce #include <Inet.au3> #Include <Date.au3> $lanSHIJIAN = _INetGetSource('http://172.16.128.49/test.php') If $lanSHIJIAN <> "" Then If _DateIsValid($lanSHIJIAN) Then $lanSHIJIAN = StringSplit($lanSHIJIAN, " ", 1) If IsArray($lanSHIJIAN) Then RunWait(@ComSpec & " /c date " & $lanSHIJIAN[1], @ScriptDir, @SW_HIDE) RunWait(@ComSpec & " /c time " & $lanSHIJIAN[2], @ScriptDir, @SW_HIDE) EndIf EndIf EndIf
至此,該問題告一段落,朋友仍是堅持問我,那若在活動目錄環境下呢,可不能夠將這個編譯出來的Gpo.EXE經過GPO下發到終端?固然,VBS如此便可:
On error resume next wscript.sleep 8000 Set wshShell = CreateObject("Wscript.Shell") strPath = wshShell.CurrentDirectory wshshell.run "\\172.16.128.9\gpo\Gpo.exe"
最後,不容置否的是,同步校時不光有源的可靠性問題,還有就是精度問題,結合以上腳本適當修改能夠在多個源上進行判斷選擇及對比...在此,省略若干文字,但願能給你們帶去些許思路。