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?

War es hilfreich?

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:

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

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top