網絡校時-AUTOIT之小試牛刀

NetworkTimeProtocol(NTP)提供了準確時間,但因種種原因,我們的企業服務器、核心交換機、或者客戶終端沒能與之同步或者因時間源問題同步了錯誤的數據,可想而知造成一系列的後果。當然,因NTP服務是典型的CS架構,本着高效簡潔,我們可以在覈心交換機裏配置兩個或更多個的時間源,我們可以在企業內部構建NTP服務......那麼,終端層面上所有的問題都解決了麼?顯然不是。

公司某臺終端域用戶打電話,無法登錄進域了,後發現因其電腦時間是"2009/10/1514:00:06"之類;

因公司某終端系統時間錯誤,其某老版本的企業版卡巴殺毒變紅色失效了......

該死,公司的指紋打卡系統的時間不對了,大家怨聲載道.....

因系統時間不正確,我們電腦上一些軟件也工作不正常了.....

那麼,對應的,及時地通過網絡給客戶端校時,給企業內部NTP源校時似乎就OK了。

可是:一些只是工作組環境的中小企業呢?沒有外網只有局域網環境的企業呢?爲此,一個好友電話來電問到局域網終端校時的種種可能性及解決方法:

1.若公司有活動目錄,通過其組策略部署如下腳本下去,實現終端與domain進行時間同步(弊端是客戶端誤差若超過5分鐘會返回失敗,相關鏈接:http://gnaw0725.blog.51cto.com/156601/660268)

net time \\domain  /set /y

2.通過網維通道、GPO(比如作爲開機策略)及CS架構的應用等等裏邊推送網絡校時,應朋友要求,結合網上一些開源的資源,經過加工修改整理如下,希望他能用得上。

A:使用時間源:time.windows.com(大家都懂這個源的,缺點是偶爾速度有點慢)進行的時間同步:

#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"

最後,不容置否的是,同步校時不光有源的可靠性問題,還有就是精度問題,結合以上腳本適當修改可以在多個源上進行判斷選擇及對比...在此,省略若干文字,希望能給大家帶去些許思路。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章