網絡校時-AUTOIT之小試牛刀

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"

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

相關文章
相關標籤/搜索