Comment puis-je détecter si un serveur Windows est disponible après un redémarrage?

StackOverflow https://stackoverflow.com/questions/56644

  •  09-06-2019
  •  | 
  •  

Question

Je veux automatiser un Windows 2000+ de redémarrer le serveur de processus en utilisant le Planificateur de Tâches ou d'un outil similaire, à distance, de redémarrer un serveur et d'attendre qu'il se remette en place.Je ne peux émettre shutdown ou psshutdown à distance de redémarrage, mais je veux quelque chose de mieux que sleep attendre pour lui de revenir.J'ai besoin de vérifier qu'il est de retour en ligne dans n minutes ou de jeter une erreur.

Par "retour en ligne", je voudrais vérifier plus que juste qu'elle peut être exécutée, mais peut-être que son RFC service est de répondre ou de certains autres déterminée signe vital.

Je préfère un NT script approche, mais je ne suis pas écarté de la rédaction d'un outil personnalisé pour ce faire.

Des idées?

Était-ce utile?

La solution

Votre télécommande de redémarrer le script pourrait démarrer le serveur, n attendez minutes, puis d'interroger vos RFC service.Vous pouvez également avoir un script local sur le serveur de faire la même chose.

Autres conseils

Après avoir travaillé sur cette question depuis un certain temps, je suis venu avec le VBScript suivant.N'hésitez pas à commenter/améliorer.

'
' 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

Vous pouvez utiliser psservice pour interroger le statut de la RFC ou Spouleur d'Impression des services.Le Spouleur est généralement l'un des derniers services à démarrer.Vous pouvez utiliser une syntaxe du type:

psservice \\someothermachine query spooler

Qui sera de retour quelque chose comme cela, une fois que le service est en cours d'exécution.

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                                                                   

Si l'autre machine n'est pas prête, vous obtiendrez quelque chose comme

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

Avec VBScript (WSH), vous pourriez vérifier avec l' .propriété de l'etat.Ce script montre que la propriété d'être utilisés dans une application différente, mais devrait aider à illustrer l'idée:

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

Utilisation nmap pour obtenir une liste de services sur la machine et d'analyser les résultats de veiller à ce que vous avez besoin est active.Il est également utile de s'assurer que les choses que vous ne pas besoin sont pas active.

Vous pouvez interroger certaines service de base pour voir si elle a commencé:

sc "\\server_name" query EventSystem

La clé ici est que j'ai besoin de ce script.Est-il le moyen le plus propre à l'extrait de l'état des services de psservice/sc query?Je suis capable de le diriger vers findstr "RUNNING", mais il doit y avoir une meilleure façon.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top