'********************************************************************
'*
'* File: Restart.vbs
'* Created: March 1999
'* Version: 1.0
'*
'* Main Function: Shutsdown, PowerOff, LogOff, Restarts a machine.
'*
'* Restart.vbs /S <server> [/U <username>] [/W <password>]
'* [/O <outputfile>] [/L} [/P] [/R] [/Q] [/F] [/T <time in seconds>]
'*
'* Copyright (C) 1999 Microsoft Corporation
'*
'********************************************************************
OPTION EXPLICIT
'Define constants
CONST CONST_ERROR = 0
CONST CONST_WSCRIPT = 1
CONST CONST_CSCRIPT = 2
CONST CONST_SHOW_USAGE = 3
CONST CONST_PROCEED = 4
'Shutdown Method Constants
CONST CONST_SHUTDOWN = 1
CONST CONST_LOGOFF = 0
CONST CONST_POWEROFF = 8
CONST CONST_REBOOT = 2
CONST CONST_FORCE_REBOOT = 6
CONST CONST_FORCE_POWEROFF = 12
CONST CONST_FORCE_LOGOFF = 4
CONST CONST_FORCE_SHUTDOWN = 5
'Declare variables
Dim intOpMode, i
Dim strServer, strUserName, strPassword, strOutputFile
Dim blnLogoff, blnPowerOff, blnReBoot, blnShutDown
Dim blnForce
Dim intTimer
Dim UserArray(3)
Dim MyCount
'Make sure the host is csript, if not then abort
VerifyHostIsCscript()
'Parse the command line
intOpMode = intParseCmdLine(strServer , _
strUserName , _
strPassword , _
strOutputFile , _
blnLogoff , _
blnPowerOff , _
blnReBoot , _
blnShutdown , _
blnForce , _
intTimer )
Select Case intOpMode
Case CONST_SHOW_USAGE
Call ShowUsage()
Case CONST_PROCEED
Call Reboot(strServer , _
strOutputFile , _
strUserName , _
strPassword , _
blnReboot , _
blnForce , _
intTimer )
Call LogOff(strServer , _
strOutputFile , _
strUserName , _
strPassword , _
blnLogoff , _
blnForce , _
intTimer )
Call PowerOff(strServer , _
strOutputFile , _
strUserName , _
strPassword , _
blnPowerOff , _
blnForce , _
intTimer )
Call ShutDown(strServer , _
strOutputFile , _
strUserName , _
strPassword , _
blnShutDown , _
blnForce , _
intTimer )
Case CONST_ERROR
'Do Nothing
Case Else 'Default -- should never happen
Call Wscript.Echo("Error occurred in passing parameters.")
End Select
'********************************************************************
'*
'* Sub Reboot()
'*
'* Purpose: Reboots a machine.
'*
'* Input: strServer a machine name
'* strOutputFile an output file name
'* strUserName the current user's name
'* strPassword the current user's password
'* blnForce specifies whether to force the logoff
'* intTimer specifies the amount of time to perform the function
'*
'* Output: Results are either printed on screen or saved in strOutputFile.
'*
'********************************************************************
Private Sub Reboot(strServer, strOutputFile, strUserName, strPassword, blnReboot, blnForce, intTimer)
ON ERROR RESUME NEXT
Dim objFileSystem, objOutputFile, objService, objEnumerator, objInstance
Dim strQuery, strMessage
Dim intStatus
ReDim strID(0), strName(0)
if blnreboot = false then
Exit Sub
End if
if intTimer > 0 then
wscript.echo "Rebooting machine " & strServer & " in " & intTimer & " seconds..."
wscript.sleep (intTimer * 1000)
End if
'Open a text file for output if the file is requested
If Not IsEmpty(strOutputFile) Then
If (NOT blnOpenFile(strOutputFile, objOutputFile)) Then
Call Wscript.Echo ("Could not open an output file.")
Exit Sub
End If
End If
'Establish a connection with the server.
If blnConnect("root\cimv2" , _
strUserName , _
strPassword , _
strServer , _
objService ) Then
Call Wscript.Echo("")
Call Wscript.Echo("Please check the server name, " _
& "credentials and WBEM Core.")
Exit Sub
End If
strID(0) = ""
strName(0) = ""
strMessage = ""
strQuery = "Select * From Win32_OperatingSystem"
Set objEnumerator = objService.ExecQuery(strQuery,,0)
If Err.Number Then
Print "Error 0x" & CStr(Hex(Err.Number)) & " occurred during the query."
If Err.Description <> "" Then
Print "Error description: " & Err.Description & "."
End If
Err.Clear
Exit Sub
End If
i = 0
For Each objInstance in objEnumerator
If blnForce Then
intStatus = objInstance.Win32ShutDown(CONST_FORCE_REBOOT)
Else
intStatus = objInstance.Win32ShutDown(CONST_REBOOT)
End If
IF intStatus = 0 Then
strMessage = "Reboot a machine " & strServer & "."
Else
strMessage = "Failed to reboot a machine " & strServer & "."
End If
Call WriteLine(strMessage,objOutputFile)
Next
If IsObject(objOutputFile) Then
objOutputFile.Close
Call Wscript.Echo ("Results are saved in file " & strOutputFile & ".")
End If
End Sub
'********************************************************************
'*
'* Sub LogOff()
'*
'* Purpose: Logs off the user currently logged onto a machine.
'*
'* Input: strServer a machine name
'* strOutputFile an output file name
'* strUserName the current user's name
'* strPassword the current user's password
'* blnForce specifies whether to force the logoff
'* intTimer specifies the amount of time to preform the function
'*
'* Output: Results are either printed on screen or saved in strOutputFile.
'*
'********************************************************************
Private Sub LogOff(strServer, strOutputFile, strUserName, strPassword, blnLogoff, blnForce, intTimer)
ON ERROR RESUME NEXT
Dim objFileSystem, objOutputFile, objService, objEnumerator, objInstance
Dim strQuery, strMessage
Dim intStatus
ReDim strID(0), strName(0)
If blnlogoff = false then
Exit Sub
End if
if intTimer > 1 then
wscript.echo "Logging off machine " & strServer & " in " & intTimer & " seconds..."
wscript.sleep (intTimer * 1000)
End if
'Open a text file for output if the file is requested
If Not IsEmpty(strOutputFile) Then
If (NOT blnOpenFile(strOutputFile, objOutputFile)) Then
Call Wscript.Echo ("Could not open an output file.")
Exit Sub
End If
End If
'Establish a connection with the server.
If blnConnect("root\cimv2" , _
strUserName , _
strPassword , _
strServer , _
objService ) Then
Call Wscript.Echo("")
Call Wscript.Echo("Please check the server name, " _
& "credentials and WBEM Core.")
Exit Sub
End If
strID(0) = ""
strName(0) = ""
strMessage = ""
strQuery = "Select * From Win32_OperatingSystem"
Set objEnumerator = objService.ExecQuery(strQuery,,0)
If Err.Number Then
Print "Error 0x" & CStr(Hex(Err.Number)) & " occurred during the query."
If Err.Description <> "" Then
Print "Error description: " & Err.Description & "."
End If
Err.Clear
Exit Sub
End If
i = 0
For Each objInstance in objEnumerator
If blnForce Then
intStatus = objInstance.Win32ShutDown(CONST_FORCE_LOGOFF)
Else
intStatus = objInstance.Win32ShutDown(CONST_LOGOFF)
End If
IF intStatus = 0 Then
strMessage = "Logging off the current user on machine " & _
strServer & "..."
Else
strMessage = "Failed to log off the current user from machine " _
& strServer & "."
End If
Call WriteLine(strMessage,objOutputFile)
Next
If IsObject(objOutputFile) Then
objOutputFile.Close
Call Wscript.Echo ("Results are saved in file " & strOutputFile & ".")
End If
End Sub
'********************************************************************
'*
'* Sub PowerOff()
'*
'* Purpose: Powers off a machine.
'*
'* Input: strServer a machine name
'* strOutputFile an output file name
'* strUserName the current user's name
'* strPassword the current user's password
'* blnForce specifies whether to force the logoff
'* intTimer specifies the amount of time to perform the function
'*
'* Output: Results are either printed on screen or saved in strOutputFile.
'*
'********************************************************************
Private Sub PowerOff(strServer, strOutputFile, strUserName, strPassword, blnPowerOff, blnForce, intTimer)
ON ERROR RESUME NEXT
Dim objFileSystem, objOutputFile, objService, objEnumerator, objInstance
Dim strQuery, strMessage
Dim intStatus
ReDim strID(0), strName(0)
if blnPoweroff = false then
Exit sub
End if
If intTimer > 0 then
wscript.echo "Powering off machine " & strServer & " in " & intTimer & " seconds..."
wscript.sleep (intTimer * 1000)
End if
'Open a text file for output if the file is requested
If Not IsEmpty(strOutputFile) Then
If (NOT blnOpenFile(strOutputFile, objOutputFile)) Then
Call Wscript.Echo ("Could not open an output file.")
Exit Sub
End If
End If
'Establish a connection with the server.
If blnConnect("root\cimv2" , _
strUserName , _
strPassword , _
strServer , _
objService ) Then
Call Wscript.Echo("")
Call Wscript.Echo("Please check the server name, " _
& "credentials and WBEM Core.")
Exit Sub
End If
strID(0) = ""
strName(0) = ""
strMessage = ""
strQuery = "Select * From Win32_OperatingSystem"
Set objEnumerator = objService.ExecQuery(strQuery,,0)
If Err.Number Then
Print "Error 0x" & CStr(Hex(Err.Number)) & " occurred during the query."
If Err.Description <> "" Then
Print "Error description: " & Err.Description & "."
End If
Err.Clear
Exit Sub
End If
i = 0
For Each objInstance in objEnumerator
If blnForce Then
intStatus = objInstance.Win32ShutDown(CONST_FORCE_POWEROFF)
Else
intStatus = objInstance.Win32ShutDown(CONST_POWEROFF)
End If
IF intStatus = 0 Then
strMessage = "Power off machine " & strServer & "."
Else
strMessage = "Failed to power off machine " & strServer & "."
End If
Call WriteLine(strMessage,objOutputFile)
Next
If IsObject(objOutputFile) Then
objOutputFile.Close
Call Wscript.Echo ("Results are saved in file " & strOutputFile & ".")
End If
End Sub
'********************************************************************
'*
'* Sub Shutdown()
'*
'* Purpose: Shutsdown a machine.
'*
'* Input: strServer a machine name
'* strOutputFile an output file name
'* strUserName the current user's name
'* strPassword the current user's password
'* blnForce specifies whether to force the logoff
'* intTimer specifies the amount of time to perform the function
'*
'* Output: Results are either printed on screen or saved in strOutputFile.
'*
'********************************************************************
Private Sub Shutdown(strServer, strOutputFile, strUserName, strPassword, blnShutDown, blnForce, intTimer)
ON ERROR RESUME NEXT
Dim objFileSystem, objOutputFile, objService, objEnumerator, objInstance
Dim strQuery, strMessage
Dim intStatus
ReDim strID(0), strName(0)
If blnShutdown = False then
Exit Sub
End if
if intTimer > 0 then
wscript.echo "Shutting down computer " & strServer & " in " & intTimer & " seconds..."
wscript.sleep (intTimer * 1000)
End if
'Open a text file for output if the file is requested
If Not IsEmpty(strOutputFile) Then
If (NOT blnOpenFile(strOutputFile, objOutputFile)) Then
Call Wscript.Echo ("Could not open an output file.")
Exit Sub
End If
End If
'Establish a connection with the server.
If blnConnect("root\cimv2" , _
strUserName , _
strPassword , _
strServer , _
objService ) Then
Call Wscript.Echo("")
Call Wscript.Echo("Please check the server name, " _
& "credentials and WBEM Core.")
Exit Sub
End If
strID(0) = ""
strName(0) = ""
strMessage = ""
strQuery = "Select * From Win32_OperatingSystem"
Set objEnumerator = objService.ExecQuery(strQuery,,0)
If Err.Number Then
Print "Error 0x" & CStr(Hex(Err.Number)) & " occurred during the query."
If Err.Description <> "" Then
Print "Error description: " & Err.Description & "."
End If
Err.Clear
Exit Sub
End If
i = 0
For Each objInstance in objEnumerator
If blnForce Then
intStatus = objInstance.Win32ShutDown(CONST_FORCE_SHUTDOWN)
Else
intStatus = objInstance.Win32ShutDown(CONST_SHUTDOWN)
End If
IF intStatus = 0 Then
strMessage = "Shuts down machine " & strServer & "."
Else
strMessage = "Failed to shutdown machine " & strServer & "."
End If
Call WriteLine(strMessage,objOutputFile)
Next
If IsObject(objOutputFile) Then
objOutputFile.Close
Call Wscript.Echo ("Results are saved in file " & strOutputFile & ".")
End If
End Sub
'********************************************************************
'*
'* Function intParseCmdLine()
'*
'* Purpose: Parses the command line.
'* Input:
'*
'* Output: strServer a remote server ("" = local server")
'* strUserName the current user's name
'* strPassword the current user's password
'* strOutputFile an output file name
'* intTimer amount of time in seconds
'*
'********************************************************************
Private Function intParseCmdLine( ByRef strServer, _
ByRef strUserName, _
ByRef strPassword, _
ByRef strOutputFile, _
ByRef blnLogoff, _
ByRef blnShutdown, _
ByRef blnReboot, _
ByRef blnPowerOff, _
ByRef blnForce, _
ByRef intTimer )
ON ERROR RESUME NEXT
Dim strFlag
Dim intState, intArgIter
Dim objFileSystem
If Wscript.Arguments.Count > 0 Then
strFlag = Wscript.arguments.Item(0)
End If
If IsEmpty(strFlag) Then 'No arguments have been received
Wscript.Echo("Arguments are Required.")
intParseCmdLine = CONST_ERROR
Exit Function
End If
'Check if the user is asking for help or is just confused
If (strFlag="help") OR (strFlag="/h") OR (strFlag="\h") OR (strFlag="-h") _
OR (strFlag = "\?") OR (strFlag = "/?") OR (strFlag = "?") _
OR (strFlag="h") Then
intParseCmdLine = CONST_SHOW_USAGE
Exit Function
End If
'Retrieve the command line and set appropriate variables
intArgIter = 0
Do While intArgIter <= Wscript.arguments.Count - 1
Select Case Left(LCase(Wscript.arguments.Item(intArgIter)),2)
Case "/s"
intParseCmdLine = CONST_PROCEED
If Not blnGetArg("Server", strServer, intArgIter) Then
intParseCmdLine = CONST_ERROR
Exit Function
End If
intArgIter = intArgIter + 1
Case "/o"
If Not blnGetArg("Output File", strOutputFile, intArgIter) Then
intParseCmdLine = CONST_ERROR
Exit Function
End If
intArgIter = intArgIter + 1
Case "/u"
If Not blnGetArg("User Name", strUserName, intArgIter) Then
intParseCmdLine = CONST_ERROR
Exit Function
End If
intArgIter = intArgIter + 1
Case "/w"
If Not blnGetArg("User Password", strPassword, intArgIter) Then
intParseCmdLine = CONST_ERROR
Exit Function
End If
intArgIter = intArgIter + 1
Case "/f"
blnForce = True
intArgIter = intArgIter + 1
Case "/r"
blnReBoot = True
userarray(0) = blnReBoot
intArgIter = intArgIter + 1
Case "/q"
blnPowerOff = True
userarray(1) = blnPowerOff
intArgIter = intArgIter + 1
Case "/l"
blnLogOff = True
userarray(2) = blnLogoff
intArgIter = intArgIter + 1
Case "/p"
blnShutDown = True
userarray(3) = blnShutDown
intArgIter = intArgIter + 1
Case "/t"
If Not blnGetArg("Timer", intTimer, intArgIter) Then
intParseCmdLine = CONST_ERROR
Exit Function
End If
intArgIter = intArgIter + 1
Case Else 'We shouldn't get here
Call Wscript.Echo("Invalid or misplaced parameter: " _
& Wscript.arguments.Item(intArgIter) & vbCRLF _
& "Please check the input and try again," & vbCRLF _
& "or invoke with '/?' for help with the syntax.")
Wscript.Quit
End Select
Loop '** intArgIter <= Wscript.arguments.Count - 1
MyCount = 0
for i = 0 to 3
if userarray(i) = True then
MyCount = Mycount + 1
End if
Next
if Mycount > 1 then
intParseCmdLine = CONST_SHOW_USAGE
End if
If IsEmpty(intParseCmdLine) Then
intParseCmdLine = CONST_ERROR
Wscript.Echo("Arguments are Required.")
End If
End Function
'********************************************************************
'*
'* Sub ShowUsage()
'*
'* Purpose: Shows the correct usage to the user.
'*
'* Input: None
'*
'* Output: Help messages are displayed on screen.
'*
'********************************************************************
Private Sub ShowUsage()
Wscript.Echo ""
Wscript.Echo "Logoffs, Reboots, Powers Off, or Shuts Down a machine."
Wscript.Echo ""
Wscript.Echo "SYNTAX:"
Wscript.Echo " Restart.vbs [/S <server>] [/U <username>] [/W <password>]"
Wscript.Echo " [/O <outputfile>] </L> </R> </P> </Q> </F> [/T <time in seconds>]"
Wscript.Echo ""
Wscript.Echo "PARAMETER SPECIFIERS:"
wscript.echo " /T Amount of time to perform the function."
Wscript.Echo " /Q Perform Shutdown."
Wscript.Echo " /P Perform Poweroff."
Wscript.Echo " /R Perform Reboot."
Wscript.Echo " /L Perform Logoff."
Wscript.Echo " /F Force Function."
Wscript.Echo " server A machine name."
Wscript.Echo " username The current user's name."
Wscript.Echo " password Password of the current user."
Wscript.Echo " outputfile The output file name."
Wscript.Echo ""
Wscript.Echo "EXAMPLE:"
Wscript.Echo "1. cscript Restart.vbs /S MyMachine2 /R"
Wscript.Echo " Reboots the current machine MyMachine2."
Wscript.Echo "2. cscript Restart.vbs /S MyMachine2 /R /F"
Wscript.Echo " Forces MyMachine2 to reboot."
Wscript.Echo "3. cscript Restart.vbs /S MyMachine2 /R /T 30"
Wscript.Echo " Reboots the current machine MyMachine2 in 30 seconds."
Wscript.Echo "NOTE:"
Wscript.Echo " The force option will make the machine perform the function even " _
& "if there are"
Wscript.Echo " open and unsaved docuements on the screen."
End Sub
'********************************************************************
'* General Routines
'********************************************************************
'********************************************************************
'*
'* Function strPackString()
'*
'* Purpose: Attaches spaces to a string to increase the length to intWidth.
'*
'* Input: strString a string
'* intWidth the intended length of the string
'* blnAfter Should spaces be added after the string?
'* blnTruncate specifies whether to truncate the string or not if
'* the string length is longer than intWidth
'*
'* Output: strPackString is returned as the packed string.
'*
'********************************************************************
Private Function strPackString( ByVal strString, _
ByVal intWidth, _
ByVal blnAfter, _
ByVal blnTruncate)
ON ERROR RESUME NEXT
intWidth = CInt(intWidth)
blnAfter = CBool(blnAfter)
blnTruncate = CBool(blnTruncate)
If Err.Number Then
Call Wscript.Echo ("Argument type is incorrect!") <