Avatar of itzhakbm
itzhakbm
 asked on

Shut Down a Remote servers -Script

Hello,

My question I have virtual server that is connected to a UPS via USB and I want to turn off 5 servers in case that the fall supply voltage.

I have managed with VBScript turn off the servers but only an administrator's password is the same to all of the servers:

'This Scrip Will Work Only if the Root password is the same'
strComputer = "Enter Remote Computer Name"
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate,(Shutdown)}!\\" & _
        strComputer & "\root\cimv2")
Set colOperatingSystems = objWMIService.ExecQuery _
    ("Select * from Win32_OperatingSystem")
For Each objOperatingSystem in colOperatingSystems
    ObjOperatingSystem.Shutdown(1)
Next

Open in new window


Can anyone advise me where to continue???

Thanks
ItzhakBM
Microsoft Legacy OS

Avatar of undefined
Last Comment
itzhakbm

8/22/2022 - Mon
ASKER CERTIFIED SOLUTION
arnold

THIS SOLUTION ONLY AVAILABLE TO MEMBERS.
View this solution by signing up for a free trial.
Members can start a 7-Day free trial and enjoy unlimited access to the platform.
See Pricing Options
Start Free Trial
GET A PERSONALIZED SOLUTION
Ask your own question & get feedback from real experts
Find out why thousands trust the EE community with their toughest problems.
itzhakbm

ASKER
Hi,

Very much helped to understand ,It is new for VBscript

It took me a few days to understand the script.

but i did not manage to run the script automatic .


Dim strComputer, RestartMode, debug, strUsername, strPasswd

Debug = 1

'declare arguments variable
Set objArgs = WScript.Arguments

'if there are command-line arguments, then...
If objargs.Count Then

For I = 0 to objArgs.Count - 1
'If debug = 1 Then wscript.echo "argument: " & objargs(i)

'check to find the computername that is specified
If InStr(1,LCase(objargs(I)),"computer:") Then
On Error Resume Next
'split into an array, using : as a delimiter
strMDArray = split(objargs(I),":") 
'set strcomputer to be what follows the ':'
strComputer = strMDArray(1)
'Next, find what action you wish to perform on strcomputer 
ElseIf InStr(1,LCase(objargs(I)),"action:") Then
'split into array again
strActionArray = split(objargs(I),":")
'set restartmode to what follows the ':'
restartmode = Trim(LCase(strActionArray(1)))
' Sam Add Some code start here
ElseIf InStr(1,LCase(objargs(I)),"User:") Then
'split into array again
strActionArray = split(objargs(I),":")
'set restartmode to what follows the ':'
strUsername = Trim(LCase(strActionArray(1)))

ElseIf InStr(1,LCase(objargs(I)),"Password:") Then
'split into array again
strActionArray = split(objargs(I),":")
'set restartmode to what follows the ':'
strPasswd = Trim(LCase(strActionArray(1)))
' Sam Add Some code end here
End If
Next
'call chkcomputername to verify that there is something
' entered.
Call ChkComputerName
'if the word reboot appears in the restartmode var, then...
If InStr(LCase(restartmode),"reboot") Then 
    RestartMode = 0
ElseIf InStr(LCase(restartmode),"logoff") Then 
RestartMode = 2
ElseIf InStr(LCase(restartmode),"shutdown") Then
    RestartMode = 1
Else
'if the restartmode variable is not correct, then quit
wscript.echo "You must use the following syntax when defining an action: reboot|logoff|shutdown" & vbcrlf _
& vbcrlf & "Invalid syntax: [" & restartmode & "] now quitting."    
wscript.quit
End If
Else
'if no command-line parameters were passed, then prompt with inputbox
' first for the computername 
strComputer=InputBox("Perform restart action on what computer?","Enter Computer Name",strComputer)
'find out if computername is valid
Call ChkComputerName
'prompt for restartmode using inputbox
RestartMode = InputBox("I would like to perform the following action on " & strComputer & ":" & vbcrlf & vbcrlf _ 
& "0 - Restart " & strComputer & vbcrlf _
& "1 - Logoff " & strComputer & vbcrlf _
& "2 - Shutdown " & strComputer & vbcrlf _ 
& vbcrlf,"Restart action",RestartMode)
'if no restartmode was specified, then quit
If RestartMode = "" Then 
wscript.echo "No restart action was specified, now quitting."
wscript.quit
'if restartmode does not fall between 0 and 2, then quit
ElseIf RestartMode < 0 or Restartmode > 2 Then
wscript.echo "You must select a valid option between 0 and 3. Script will now exit."
wscript.quit
End If

End If

'put computername into uppercase
strComputer = UCase(strComputer)

'Call actual code to restart the PC
Call RestartAction

Sub ChkComputerName
'if no computername is specified (blank), then quit
If strComputer = "" Then 
wscript.echo "You must define a computer name after the computer: argument. None " _
& "were specified, now quitting."
wscript.quit
'if computername contains two backslashes, then quit
ElseIf InStr(strComputer,"\\") Then
wscript.echo "Please specify the computer name without the leading backslashes. " _
& "Now quitting." 
wscript.quit
End If
End Sub

Sub RestartAction
    On Error GoTo 0
         
' Sam Comment out some lines of code, and add a prompt box to get the username and password input from user.
    ' ===== Sam added & modified codes start here =====  
strUsername=InputBox("Please input remote user's account?","Enter the account",strUsername)  
    strPasswd=InputBox("Please input remote user's password?","Enter the password",strPasswd)
	Set objSWbemLocator = CreateObject("WbemScripting.SWbemLocator")
	Set objSWbemServices = objSWbemLocator.ConnectServer _
    		(strComputer, "root\cimv2", strUsername, strPasswd)
	objSWbemServices.Security_.ImpersonationLevel = 3 
	
'Call WMI query to collect parameters for reboot action
    'Set OpSysSet = GetObject("winmgmts:{(Shutdown)}//"_ 
     '& strComputer & "/root/cimv2").ExecQuery("select * from Win32_OperatingSystem"_
     '& " where Primary=true") 

Set OpSysSet = objSWbemServices.ExecQuery("select * from Win32_OperatingSystem"_
    & " where Primary=true") 
    
 ' ===== Sam added & modified code end here =====

Dim OpSysSet, OpSys
    If debug = 1 Then wscript.echo "Computer: " & strComputer & vbcrlf _
     & "Restart Action: " & RestartMode
     
'set PC to reboot
If RestartMode = 0 Then

        For each OpSys in OpSysSet 
            opSys.Reboot()
        Next 

'set PC to logoff
ElseIf RestartMode = 1 Then
        
        Const EWX_LOGOFF = 0 
        For each OpSys in OpSysSet 
            opSys.win32shutdown EWX_LOGOFF
        Next 

'set PC to shutdown
ElseIf RestartMode = 2 Then
                
        For each OpSys in OpSysSet 
            opSys.Shutdown()
        Next 
                
    End If
End Sub 

Open in new window




Thanks
ItzhakBM
Experts Exchange has (a) saved my job multiple times, (b) saved me hours, days, and even weeks of work, and often (c) makes me look like a superhero! This place is MAGIC!
Walt Forbes