sysadmin - Hvordan registrerer jeg, om en Windows-server er tilgængelig efter en genstart?

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg vil automatisere en Windows 2000 + server genstart proces ved hjælp af Task Scheduler eller lignende værktøj til fjernstart genstart en server og vente på, at det kommer op igen. Jeg kan udstede shutdown eller psshutdown for at genstarte, men jeg vil have noget bedre end sleep for at vente på, at det kommer tilbage. Jeg skal kontrollere, at det er tilbage online inden for n minutter eller kaste en fejl.


Ved 'back online' vil jeg gerne bekræfte mere end bare at det kan pinges, men måske svarer RFC-tjenesten eller et andet afgørende vitaltegn.


Jeg foretrækker en NT-script tilgang, men jeg udelukker ikke at skrive et brugerdefineret værktøj til at gøre dette.


Nogle ideer?

Bedste reference


Dit fjernt genstart script kunne starte serveren, vent et minut, og spørg derefter din RFC-tjeneste. Du kan også have et lokalt script på serveren gør det samme.

Andre referencer 1


Efter at have arbejdet på dette i et stykke tid, kom jeg op på følgende VBScript. Du er velkommen til at kommentere/forbedre.


'
' 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 & "
ootCIMV2").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 & "
ootCIMV2:Win32\_Service='" & ServiceName & "'")
   On Error GoTo 0
   If IsObject(Service) Then GetServiceState = Service.State
End Function

Andre referencer 2


Du kan bruge psservice til at søge status for RFC- eller Print Spooler-tjenesterne. Spooler er normalt en af ​​de sidste tjenester at starte. Du kan bruge syntaks som: [13]


psservice \someothermachine query spooler


Det vil vende tilbage noget som dette, når tjenesten kører.


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                                                                   


Hvis den anden maskine ikke er klar, får du noget lignende


Unable to connect to \someothermachine:                                                                  
The RPC server is unavailable. 

Andre referencer 3


Med VBScript (WSH) kan du tjekke det med .state ejendommen. Dette script viser, at egenskaben bruges i en anden applikation, men skal hjælpe med at illustrere ideen:


http://www.robvanderwoude.com/vbstech\_proc\_service.html[14]

Andre referencer 4


Brug nmap til at få en liste over åbne tjenester på maskinen og analysere resultaterne for at sikre, at hvad du har brug for, er aktiv. Det er også nyttigt at sikre, at ting, du ikke har brug for, er ikke aktive. [15]

Andre referencer 5


Du kan afstemme nogle kernetjenester for at se om den er startet:


sc "\server\_name" query EventSystem

Andre referencer 6


Nøglen her er, jeg skal script dette. Er der en renere måde at udtrække service status fra psservice/sc query? Jeg kan pipe den til findstr "RUNNING", men der skal være en bedre måde.