How to determine if a Windows server is available after a reboot?

I want to automate the process of rebooting a Windows 2000+ server using the task scheduler or a similar tool to remotely reboot the server and wait for it to return. I can release shutdown or psshutdown to remotely reboot, but I need something better than sleep to wait for it to return. I need to check that it is online for n minutes or gives an error.

Going online, I would like to check more than just pinging it, but maybe its RFC service is responding or some other definable life sign.

I would prefer the NT script approach, but I do not exclude that I am creating a special tool for this.

Any ideas?

+5
windows sysadmin reboot
source share
7 answers

Remote restarting the script can start the server, wait n minutes, and then request the RFC service. You can also use the local script on the server the same.

+2
source share

After working on this for a while, I came up with the following VBScript. Feel free to comment / improve.

 ' ' Remotely reboot a server and ' wait for server to come back up. ' ' Usage: cscript /nologo /E:VBScript RebootWait.vbs <Server Name> ' ' Shawn Poulson, 2008.09.11 ' ' ' Get server name from command line ' If WScript.Arguments.Count <> 1 Then ShowUsage() WScript.Quit(1) End If ServerName = WScript.Arguments(0) ' ' Verify server is currently up ' WScript.StdOut.WriteLine Now & ": Verify server '" & ServerName & "' is currently up..." If Not IsAvailable(ServerName) Then WScript.StdOut.WriteLine "Error: Server is down. Reboot aborted!" WScript.Quit(1) End If WScript.StdOut.WriteLine Now & ": Server is up." ' ' Reboot server ' WScript.StdOut.WriteLine Now & ": Rebooting server '" & ServerName & "'..." RebootStatus = RebootServer(ServerName) If RebootStatus < 0 Then WScript.StdOut.WriteLine "Error: Reboot returned error " & RebootStatus WScript.Quit(1) End If WScript.StdOut.WriteLine Now & ": Reboot command was successful" ' ' Wait for server to come down ' WScript.StdOut.Write Now & ": Waiting for server '" & ServerName & "' to go down..." WaitCount = 0 Do While IsAvailable(ServerName) WaitCount = WaitCount + 1 If WaitCount > 60 Then ' 5 min timeout WScript.StdOut.WriteLine "Error: Timeout waiting for server to come down!" WScript.Quit(1) End If WScript.StdOut.Write(".") WScript.Sleep(5000) Loop WScript.StdOut.WriteLine "Success!" WScript.StdOut.WriteLine Now & ": Server is down." ' ' Wait for server to come back up ' WScript.StdOut.Write Now & ": Waiting for server '" & ServerName & "' to come back up..." WaitCount = 0 Do While Not IsAvailable(ServerName) WaitCount = WaitCount + 1 If WaitCount > 240 Then ' 20 min timeout WScript.StdOut.WriteLine "Error: Timeout waiting for server to come back up!" WScript.Quit(1) End If WScript.StdOut.Write(".") WScript.Sleep(5000) Loop WScript.StdOut.WriteLine "Success!" WScript.StdOut.WriteLine Now & ": Server is back up after reboot." ' ' Success! ' WScript.Quit(0) Sub ShowUsage() WScript.Echo "Usage: " & WScript.ScriptName & " <Server name>" End Sub ' Returns: ' 1 = Successfully issued reboot command ' -2 = Could not reach server ' -3 = Reboot command failed Function RebootServer(ServerName) Dim OpSystem On Error Resume Next For Each OpSystem in GetObject("winmgmts:{(Shutdown)}!\\" & ServerName & "\root\CIMV2").ExecQuery("select * from Win32_OperatingSystem where Primary=true") On Error GoTo 0 If IsObject(OpSystem) Then ' Invoke forced reboot If OpSystem.Win32Shutdown(6, 0) = 0 Then ' Success RebootServer = 1 Else ' Command failed RebootServer = -3 End If Else RebootServer = -2 End If Next End Function ' Return True if available Function IsAvailable(ServerName) ' Use Windows RPC service state as vital sign IsAvailable = (GetServiceState(ServerName, "RpcSs") = "Running") End Function ' Return one of: ' Stopped, Start Pending, Stop Pending, ' Running, Continue Pending, Pause Pending, ' Paused, Unknown Function GetServiceState(ServerName, ServiceName) Dim Service On Error Resume Next Set Service = GetObject("winmgmts:\\" & ServerName & "\root\CIMV2:Win32_Service='" & ServiceName & "'") On Error GoTo 0 If IsObject(Service) Then GetServiceState = Service.State End Function 
+8
source share

You can use psservice to request the status of an RFC or print spooler. A spooler is usually one of the last services to start. You can use the syntax, for example:

 psservice \\someothermachine query spooler 

This will return something like this once the service is started.

  SERVICE_NAME: Spooler                                                                             
 DISPLAY_NAME: Print Spooler                                                                       
 Manages all local and network print queues and controls all printing jobs.  If this service is stop
 ped, printing on the local machine will be unavailable.  If this service is disabled, any services 
 that explicitly depend on it will fail to start.                                                  
         GROUP: SpoolerGroup                                                          
         TYPE: 110 WIN32_OWN_PROCESS INTERACTIVE_PROCESS                             
         STATE: 4 RUNNING                                                            
                                (STOPPABLE, NOT_PAUSABLE, ACCEPTS_SHUTDOWN)                          
         WIN32_EXIT_CODE: 0 (0x0)                                                              
         SERVICE_EXIT_CODE: 0 (0x0)                                                              
         CHECKPOINT: 0x0                                                                   
         WAIT_HINT: 0x0 

If the other machine is not ready, you will get something like

  Unable to connect to \\ someothermachine:                                                                  
 The RPC server is unavailable. 
+2
source share

With VBScript (WSH), you can test it using the .state property. This script shows that the property is being used in another application, but should help illustrate the idea:

http://www.robvanderwoude.com/vbstech_proc_service.html

+1
source share

You can interview some basic services to see if it started:

 sc "\\server_name" query EventSystem 
0
source share

Use nmap to get a list of open services on the machine and analyze the results to make sure you are active. It is also useful to make sure that you do not need things that you do not need.

0
source share

The key is here - I need a script for this. Is there a cleaner way to fetch service status from psservice / sc query ? I can pass it to findstr "RUNNING" , but there should be a better way.

0
source share

All Articles