Wie kann ich erkennen, ob ein Windows-server verfügbar ist, nachdem ein Neustart?
Frage
Ich möchte automatisieren, Windows-2000+ server Neustart-Prozess mithilfe des Task-Scheduler oder ein ähnliches Werkzeug, um aus der Ferne starten Sie einen server und warten für es zu kommen zurück.Ich kann Problem shutdown
oder psshutdown
Remote-Neustart, aber ich will etwas besseres als sleep
warten für Sie zu kommen zurück.Ich muss überprüfen, ob es wieder online in n
Minuten oder einen Fehler auslösen.
Durch "wieder online', ich würde wie zu überprüfen, mehr als nur, dass es ein Pingsignal gesendet werden kann, aber vielleicht hat der RFC-service reagiert oder einen anderen determinate wichtige Zeichen.
Ich würde es vorziehen, ein NT-script, aber ich bin nicht ausschließt, schreiben Sie ein benutzerdefiniertes Werkzeug, dies zu tun.
Irgendwelche Ideen?
Lösung
Ihr Remote-Restart-Skript kann den Server starten, n Minuten warten, dann RFC-Dienst abfragen. Sie können auch ein lokales Skript auf dem Server das gleiche zu tun haben.
Andere Tipps
Nach einer Weile daran gearbeitet, kam ich mit der folgenden VBScript-up. Fühlen Sie sich frei zu äußern / verbessern.
'
' 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
Sie könnten verwenden psservice den Status der RFC abfragen oder Print Spooler Dienstleistungen. Der Spooler ist in der Regel einer der letzten Dienste zu starten. Sie könnten Syntax wie verwenden:
psservice \\someothermachine query spooler
Das wird so etwas wie dieses einmal kehrt der Dienst ausgeführt wird.
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
Wenn das andere Gerät nicht bereit ist, werden Sie so etwas wie bekommen
Unable to connect to \\someothermachine: The RPC server is unavailable.
Mit VBScript (WSH), könnten Sie es mit der .state Eigenschaft überprüfen. Dieses Skript zeigt diese Eigenschaft in einer anderen Anwendung verwendet wird, soll aber die Idee helfen verdeutlichen:
Verwenden Sie nmap eine Liste der offenen Dienste auf der Maschine zu bekommen und die Ergebnisse zu analysieren, um sicherzustellen, was Sie brauchen, ist aktiv. Es ist auch nützlich, um sicherzustellen, dass Dinge, die Sie nicht Notwendigkeit ist nicht aktiv.
Sie können einig Kerndienst abfragen, um zu sehen, ob es begonnen hat:
sc "\\server_name" query EventSystem
Der Schlüssel hier ist Ich muss das Skript. Gibt es einen sauberen Weg, um den Service-Status von psservice
/ sc query
zu extrahieren? Ich bin in der Lage zu Pipe an findstr "RUNNING"
, aber es muss ein besserer Weg sein.