SHOW:
|
|
- or go back to the newest paste.
1 | Option Explicit | |
2 | ||
3 | Type TIME_OF_DAY_INFO | |
4 | tod_elapsedt As Long | |
5 | tod_msecs As Long | |
6 | tod_hours As Long | |
7 | tod_mins As Long | |
8 | tod_secs As Long | |
9 | tod_hunds As Long | |
10 | tod_timezone As Long | |
11 | tod_tinterval As Long | |
12 | tod_day As Long | |
13 | tod_month As Long | |
14 | tod_year As Long | |
15 | tod_weekday As Long | |
16 | End Type | |
17 | ||
18 | Declare Function NetRemoteTOD Lib "NetApi32" (ByRef UncServerName As Any, ByRef BufferPtr As Any) As Long | |
19 | - | |
19 | + | |
20 | Private LogBuffer As BStr | |
21 | ||
22 | '==================================================================== | |
23 | Public Sub Main() | |
24 | asRegisterAppPath | |
25 | InitCommonControls | |
26 | If Not asIsInIDE Then asSetWindowResIconAll asGetThunderMainHandle(), IDI_APPICON | |
27 | ||
28 | Dim Cmd As BStr | |
29 | Dim MachineNames() As BStr | |
30 | Dim TMP As Variant | |
31 | Dim Success As Boolean | |
32 | ||
33 | Cmd = asTrimEx(Command) | |
34 | - | Cmd = asTrimEx2(Command, True, True, True, True, True) |
34 | + | Cmd = asDestroyDoubleSpaces(Cmd) |
35 | Cmd = UCase(Cmd) | |
36 | - | If Cmd = "" Then Cmd = "." |
36 | + | |
37 | If Cmd = "" Then | |
38 | ShowUsage | |
39 | - | MachineName = StrConv(Cmd & NUL, vbFromUnicode) |
39 | + | Exit Sub |
40 | End If | |
41 | - | MachineName = Cmd & NUL |
41 | + | |
42 | MachineNames = Split(Cmd, " ") | |
43 | Success = False | |
44 | ||
45 | For Each TMP In MachineNames | |
46 | - | asLogError "NetRemoteTOD() failed." & CRLF & _ |
46 | + | TMP = asTrimEx2(CStr(TMP), True, True, True, True, True) |
47 | - | "Error " & asGetErrorNumber(RC) & ":" & CRLF & _ |
47 | + | If TMP <> "" Then |
48 | - | asGetAPIErrorMessage(RC) |
48 | + | If TryToFixTime(TMP) Then |
49 | Success = True | |
50 | Exit For | |
51 | End If | |
52 | End If | |
53 | Next TMP | |
54 | - | asLogError "NetRemoteTOD() returns NULL pointer." |
54 | + | |
55 | If Not Success Then LogEvent "All tries were failed." | |
56 | DumpLog Success | |
57 | End Sub | |
58 | ||
59 | '==================================================================== | |
60 | Private Sub LogEvent(ByVal Text As BStr) | |
61 | Dim Lines() As BStr | |
62 | Dim TMP As Variant | |
63 | ||
64 | Lines = Split(Text, CRLF) | |
65 | ||
66 | For Each TMP In Lines | |
67 | TMP = asTrimEx(CStr(TMP)) | |
68 | If TMP <> "" Then | |
69 | LogBuffer = LogBuffer & "[" & asSystemTimeToStringTime2(Now) & "] " & _ | |
70 | "[" & asSystemTimeToStringDate2(Now, False) & "] " & _ | |
71 | TMP & CRLF | |
72 | End If | |
73 | - | "Remote system name: " & Cmd & CRLFCRLF & _ |
73 | + | Next TMP |
74 | End Sub | |
75 | ||
76 | Private Sub DumpLog(ByVal Success As Boolean) | |
77 | If Success Then | |
78 | - | asLogWarning "Failed to set SE_SYSTEMTIME_NAME privilege." |
78 | + | asLogInfo asTrimCRLF(LogBuffer) |
79 | Else | |
80 | asLogError asTrimCRLF(LogBuffer) | |
81 | End If | |
82 | End Sub | |
83 | ||
84 | '==================================================================== | |
85 | Private Function TryToFixTime(ByVal sMachineName As BStr) As Boolean | |
86 | Dim TOD As TIME_OF_DAY_INFO | |
87 | Dim lpTOD As Long | |
88 | Dim MachineName() As Byte | |
89 | Dim RC As Long | |
90 | Dim ST As SYSTEMTIME | |
91 | - | asLogError "SetSystemTime() failed." & CRLFCRLF & TXT |
91 | + | |
92 | ||
93 | - | asLogInfo "System time was updated successfully." & CRLFCRLF & TXT |
93 | + | ' На всякий пожарный... |
94 | TryToFixTime = False | |
95 | ||
96 | LogEvent "Trying machine " & sMachineName & "." | |
97 | ||
98 | #If SIMULATE_ERROR Then | |
99 | LogEvent "Error simulation mode." | |
100 | MachineName = StrConv(sMachineName & NUL, vbFromUnicode) | |
101 | #Else | |
102 | MachineName = sMachineName & NUL | |
103 | #End If | |
104 | ||
105 | RC = NetRemoteTOD(MachineName(0), lpTOD) | |
106 | If RC <> 0 Then | |
107 | LogEvent "NetRemoteTOD() failed. " & _ | |
108 | "Error " & asGetErrorNumber(RC) & ": " & _ | |
109 | asGetAPIErrorMessage(RC) | |
110 | Else | |
111 | ' On return a pointer to the return information structure | |
112 | ' TIME_OF_DAY_INFO is returned in the address pointed to | |
113 | ' by BufferPtr. | |
114 | If lpTOD = 0 Then | |
115 | LogEvent "NetRemoteTOD() returns NULL pointer." | |
116 | Else | |
117 | CopyMemory TOD.tod_elapsedt, ByVal lpTOD, Len(TOD) | |
118 | GetSystemTime ST | |
119 | ||
120 | TXT = "Local date & time: " & ST.wDay & "." & _ | |
121 | Format(ST.wMonth, "00") & "." & _ | |
122 | Format(ST.wYear, "0000") & " " & _ | |
123 | ST.wHour & ":" & _ | |
124 | Format(ST.wMinute, "00") & ":" & _ | |
125 | Format(ST.wSecond, "00") & "." & _ | |
126 | ST.wMilliseconds & CRLF & _ | |
127 | "Remote date & time: " & TOD.tod_day & "." & _ | |
128 | Format(TOD.tod_month, "00") & "." & _ | |
129 | Format(TOD.tod_year, "0000") & " " & _ | |
130 | TOD.tod_hours & ":" & _ | |
131 | Format(TOD.tod_mins, "00") & ":" & _ | |
132 | Format(TOD.tod_secs, "00") & "." & _ | |
133 | TOD.tod_hunds & CRLF & _ | |
134 | "Please note both times are in UTC format." | |
135 | Debug.Print TXT | |
136 | LogEvent TXT | |
137 | ||
138 | If Not asSetPrivilegeForProcess(SE_SYSTEMTIME_NAME, True) Then | |
139 | LogEvent "Failed to set SE_SYSTEMTIME_NAME privilege." | |
140 | End If | |
141 | ||
142 | ST.wDay = TOD.tod_day | |
143 | ST.wDayOfWeek = 0 | |
144 | ST.wHour = TOD.tod_hours | |
145 | ST.wMilliseconds = TOD.tod_hunds | |
146 | ST.wMinute = TOD.tod_mins | |
147 | ST.wMonth = TOD.tod_month | |
148 | ST.wSecond = TOD.tod_secs | |
149 | ST.wYear = TOD.tod_year | |
150 | ||
151 | If SetSystemTime(ST) = C_FALSE Then | |
152 | LogEvent "SetSystemTime() failed." | |
153 | Else | |
154 | LogEvent "System time was updated successfully." | |
155 | TryToFixTime = True | |
156 | End If | |
157 | End If | |
158 | End If | |
159 | End Function | |
160 | ||
161 | '==================================================================== | |
162 | Private Sub ShowUsage() | |
163 | MsgBox "Usage: " & App.EXEName & "[.EXE] HostName [HostName [HostName [...]]]", vbInformation | |
164 | End Sub |