-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathreboot_check.vbs
222 lines (217 loc) · 9.93 KB
/
reboot_check.vbs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
on error resume next
''ALWAYS RIGHT-CLICK SCRIPT, CHOOSE "PROPERTIES", CLICK "UNBLOCK"
''REGISTRY CONSTANTS
const HKCR = &H80000000
const HKLM = &H80000002
''SCRIPT VARIABLES
dim strCBS, strWUAU, strFRO
dim strCOMP, strIN, strNUL, strSEL, strRUN
dim objCCM, objCCMcu, objRBT, objPARAM, objREG
dim objIN, objOUT, objARG, objWSH, objFSO, objNET, objWMI, objLOG, objHOOK
''STDIN / STDOUT
set objIN = wscript.stdin
set objOUT = wscript.stdout
set objARG = wscript.arguments
''OBJECTS FOR LOCATING FOLDERS
set objWSH = createobject("wscript.shell")
set objFSO = createobject("scripting.filesystemobject")
''WMI OBJECTS
set objNET = createObject("WScript.Network")
set objWMI = createObject("WbemScripting.SWbemLocator")
''WMI OBJECTS FOR QUERYING REBOOT STATUS
strCOMP = "."
set objCCM = GetObject("winmgmts:\\" & strCOMP & "\root\ccm\ClientSDK")
set objCCMcu = objCCM.Get("CCM_ClientUtilities")
set objRBT = objCCMcu.Methods_("DetermineIfRebootPending").InParameters
set objPARAM = objCCMcu.ExecMethod_("DetermineIfRebootPending", objRBT)
''WMI OBJECTS FOR CONNECTING TO REGISTRY PROVIDER
Set objREG = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strCOMP & "\root\default:StdRegProv")
''SYSINFO OBJECT
set objSysInfo = CreateObject("Microsoft.Update.SystemInfo")
''PREPARE LOGFILE
if (objFSO.fileexists("C:\temp\reboot_check")) then ''LOGFILE EXISTS
objFSO.deletefile "C:\temp\reboot_check", true
set objLOG = objFSO.createtextfile("C:\temp\reboot_check")
objLOG.close
set objLOG = objFSO.opentextfile("C:\temp\reboot_check", 8)
else ''LOGFILE NEEDS TO BE CREATED
set objLOG = objFSO.createtextfile("C:\temp\reboot_check")
objLOG.close
set objLOG = objFSO.opentextfile("C:\temp\reboot_check", 8)
end if
''SET EXECUTION FLAG
strRUN = "false"
''EXECUTE REBOOT_CHECK
objOUT.write vbnewline & vbnewline & now & " - STARTING REBOOT_CHECK" & vbnewline
objLOG.write vbnewline & vbnewline & now & " - STARTING REBOOT_CHECK" & vbnewline
''CHECK WMI FOR PENDING REBOOTS
objOUT.write vbnewline & vbnewline & now & vbtab & " - CHECKING WMI FOR PENDING REBOOTS"
objLOG.write vbnewline & vbnewline & now & vbtab & " - CHECKING WMI FOR PENDING REBOOTS"
call chkWMI()
''CHECK REGISTRY FOR PENDING REBOOTS
objOUT.write vbnewline & vbnewline & now & vbtab & " - CHECKING REGISTRY FOR PENDING REBOOTS"
objLOG.write vbnewline & vbnewline & now & vbtab & " - CHECKING REGISTRY FOR PENDING REBOOTS"
call chkREG()
''CHECK SYSINFO FOR PENDING REBOOTS
objOUT.write vbnewline & vbnewline & now & vbtab & " - CHECKING SYSINFO FOR PENDING REBOOTS"
objLOG.write vbnewline & vbnewline & now & vbtab & " - CHECKING SYSINFO FOR PENDING REBOOTS"
call chkSYS()
''EXECUTE FORCED SHUTDOWN
if (strRUN = "true") then
objOUT.write vbnewline & vbnewline & now & vbtab & " - EXECUTING SHUTDOWN"
objLOG.write vbnewline & vbnewline & now & vbtab & " - EXECUTING SHUTDOWN"
'call HOOK("shutdown -r -t 1800 -c " & chr(34) & "This is a message from The ComputerWarriors, your system has been scheduled for a required reboot to maintain stability." & vbnewline & _
' "Please save all work and close all programs prior to the scheduled reboot time." & chr(34))
end if
''END SCRIPT
call CLEANUP()
''SUB-ROUTINES
sub chkWMI()''WMI REBOOT PENDING CHECK
'wscript.echo objPARAM.DisableHideTime
'wscript.echo objPARAM.InGracePeriod
'wscript.echo objPARAM.IsHardRebootPending
'wscript.echo objPARAM.NotifyUI
'wscript.echo objPARAM.RebootDeadline
objOUT.write vbnewline & vbtab & vbtab & " - WMI REBOOT REQUIRED : " & objPARAM.RebootPending
objLOG.write vbnewline & vbtab & vbtab & " - WMI REBOOT REQUIRED : " & objPARAM.RebootPending
'wscript.echo objPARAM.ReturnValue
if (lcase(objPARAM.RebootPending) = "true") then
objOUT.write " : SETTING EXECUTE REBOOT FLAG TO 'TRUE'"
objLOG.write " : SETTING EXECUTE REBOOT FLAG TO 'TRUE'"
strRUN = "true"
end if
end sub
sub chkREG()
dim arrVAL, keyVAL
on error resume next
''REGISTRY CHECK - COMPONENT BASED SERVICING PENDING REBOOT
''ENUMERATE ALL VALUES AT COMPONENT BASED SERVICING KEY
strCBS = "Software\Microsoft\Windows\CurrentVersion\Component Based Servicing"
objOUT.write vbnewline & vbtab & vbtab & " - SEARCHING : [" & HKLM & "\" & strCBS & "]"
objLOG.write vbnewline & vbtab & vbtab & " - SEARCHING : [" & HKLM & "\" & strCBS & "]"
objREG.EnumKey HKLM, strCBS, arrVAL
if (not isnull(arrVAL)) then
for each keyVAL in arrVAL ''SEARCH ALL VALUES AT COMPONENT BASED SERVICING KEY
''UNCOMMENT BELOW LINE TO OUTPUT ALL KEYS / VALUES
'objOUT.write vbnewline & keyVAL
if (keyVAL = "RebootPending") then
objOUT.write " : SETTING EXECUTE REBOOT FLAG TO 'TRUE'"
objLOG.write " : SETTING EXECUTE REBOOT FLAG TO 'TRUE'"
objOUT.write vbnewline & now & vbtab & vbtab & " - 'RebootPending' found in [" & HKLM & "\" & strCBS & "]"
objLOG.write vbnewline & now & vbtab & vbtab & " - 'RebootPending' found in [" & HKLM & "\" & strCBS & "]"
''SET SCRIPT TO EXECUTE REBOOT
strRUN = "true"
end if
next
end if
set keyVAL = nothing
set arrVAL = nothing
''REGISTRY CHECK - WINDOWS UPDATES PENDING REBOOT
''ENUMERATE ALL VALUES AT WINDOWS UPDATE KEY
strWUAU = "SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update"
objOUT.write vbnewline & vbtab & vbtab & " - SEARCHING : [" & HKLM & "\" & strWUAU & "]"
objLOG.write vbnewline & vbtab & vbtab & " - SEARCHING : [" & HKLM & "\" & strWUAU & "]"
objREG.EnumKey HKLM, strWUAU, arrVAL
if (not isnull(arrVAL)) then
for each keyVAL in arrVAL ''SEARCH ALL VALUES AT WINDOWS UPDATES KEY
''UNCOMMENT BELOW LINE TO OUTPUT ALL KEYS / VALUES
'objOUT.write vbnewline & keyVAL
if (keyVAL = "RebootRequired") then
objOUT.write " : SETTING EXECUTE REBOOT FLAG TO 'TRUE'"
objLOG.write " : SETTING EXECUTE REBOOT FLAG TO 'TRUE'"
objOUT.write vbnewline & now & vbtab & vbtab & " - 'RebootRequired' found in [" & HKLM & "\" & strWUAU & "]"
objLOG.write vbnewline & now & vbtab & vbtab & " - 'RebootRequired' found in [" & HKLM & "\" & strWUAU & "]"
''SET SCRIPT TO EXECUTE REBOOT
strRUN = "true"
end if
next
end if
set keyVAL = nothing
set arrVAL = nothing
''REGISTRY CHECK - FILE RENAME OPERATIONS PENDING REBOOT
''ENUMERATE ALL VALUES AT FILE RENAME OPERATIONS KEY
strFRO = "SYSTEM\CurrentControlSet\Control\Session Manager"
objOUT.write vbnewline & vbtab & vbtab & " - SEARCHING : [" & HKLM & "\" & strFRO & "]"
objLOG.write vbnewline & vbtab & vbtab & " - SEARCHING : [" & HKLM & "\" & strFRO & "]"
objREG.EnumKey HKLM, strFRO, arrVAL
if (not isnull(arrVAL)) then
for each keyVAL in arrVAL ''SEARCH ALL VALUES AT FILE RENAME OPERATIONS KEY
''UNCOMMENT BELOW LINE TO OUTPUT ALL KEYS / VALUES
'objOUT.write vbnewline & keyVAL
if (keyVAL = "RebootRequired") then
objOUT.write " : SETTING EXECUTE REBOOT FLAG TO 'TRUE'"
objLOG.write " : SETTING EXECUTE REBOOT FLAG TO 'TRUE'"
objOUT.write vbnewline & now & vbtab & vbtab & " - 'RebootRequired' found in [" & HKLM & "\" & strFRO & "]"
objLOG.write vbnewline & now & vbtab & vbtab & " - 'RebootRequired' found in [" & HKLM & "\" & strFRO & "]"
''SET SCRIPT TO EXECUTE REBOOT
strRUN = "true"
elseif (keyVAL = "FileRenameOperations") then
objOUT.write " : SETTING EXECUTE REBOOT FLAG TO 'TRUE'"
objLOG.write " : SETTING EXECUTE REBOOT FLAG TO 'TRUE'"
objOUT.write vbnewline & now & vbtab & vbtab & " - 'FileRenameOperations' found in [" & HKLM & "\" & strFRO & "]"
objLOG.write vbnewline & now & vbtab & vbtab & " - 'FileRenameOperations' found in [" & HKLM & "\" & strFRO & "]"
''SET SCRIPT TO EXECUTE REBOOT
strRUN = "true"
end if
next
end if
set keyVAL = nothing
set arrVAL = nothing
end sub
sub chkSYS()
objOUT.write vbnewline & vbtab & vbtab & " - SYSINFO REBOOT REQUIRED : " & objSysInfo.RebootRequired
objLOG.write vbnewline & vbtab & vbtab & " - SYSINFO REBOOT REQUIRED : " & objSysInfo.RebootRequired
if (lcase(objSysInfo.RebootRequired) = "true") then
objOUT.write " : SETTING EXECUTE REBOOT FLAG TO 'TRUE'"
objLOG.write " : SETTING EXECUTE REBOOT FLAG TO 'TRUE'"
strRUN = "true"
end if
end sub
sub HOOK(strCMD) ''CALL HOOK TO MONITOR OUTPUT OF CALLED COMMAND
on error resume next
'comspec = objWSH.ExpandEnvironmentStrings("%comspec%")
set objHOOK = objWSH.exec(strCMD)
'while (objHOOK.status = 0)
while (not objHOOK.stdout.atendofstream)
strIN = objHOOK.stdout.readline
if (strIN <> vbnullstring) then
objOUT.write vbnewline & now & vbtab & vbtab & strIN
objLOG.write vbnewline & now & vbtab & vbtab & strIN
end if
wend
wscript.sleep 10
'wend
strIN = objHOOK.stdout.readall
if (strIN <> vbnullstring) then
objOUT.write vbnewline & now & vbtab & vbtab & strIN
objLOG.write vbnewline & now & vbtab & vbtab & strIN
end if
'retSTOP = objHOOK.exitcode
set objHOOK = nothing
if (err.number <> 0) then
objOUT.write vbnewline & now & vbtab & vbtab & err.number & vbtab & err.description
objLOG.write vbnewline & now & vbtab & vbtab & err.number & vbtab & err.description
end if
end sub
sub CLEANUP() ''SCRIPT CLEANUP
objOUT.write vbnewline & vbnewline & now & " - REBOOT_CHECK COMPLETE" & vbnewline
objLOG.write vbnewline & vbnewline & now & " - REBOOT_CHECK COMPLETE" & vbnewline
objLOG.close
''EMPTY OBJECTS
set objSysInfo = nothing
set objREG = nothing
set objPARAM = nothing
set objRBT = nothing
set objCCMcu = nothing
set objCCM = nothing
set objLOG = nothing
set objWMI = nothing
set objNET = nothing
set objFSO = nothing
set objWSH = nothing
set objARG = nothing
set objOUT = nothing
set objIN = nothing
''END SCRIPT, RETURN ERROR NUMBER
wscript.quit err.number
end sub