كيف يمكنني اكتشاف ما إذا كان نظام التشغيل Windows server متاح بعد إعادة التشغيل ؟

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

  •  09-06-2019
  •  | 
  •  

سؤال

أريد أن أتمتة نظام التشغيل Windows 2000+ server إعادة تشغيل العملية باستخدام "جدولة المهام" أو أداة مشابهة بعد إعادة تشغيل ملقم وانتظر حتى تعودي.لا يمكن إصدار shutdown أو psshutdown بعد إعادة التشغيل, ولكن أريد شيئا أفضل من sleep الانتظار حتى أعود.كنت بحاجة للتحقق من ذلك هو العودة على الانترنت في غضون n دقيقة أو رمي خطأ.

بواسطة 'مرة أخرى على الإنترنت' ، أود أن تحقق أكثر من مجرد أنه يمكن أن يوصل ، ولكن ربما RFC خدمة الاستجابة أو بعوض علامة حيوية.

أنا أفضل NT النصي النهج ، لكن أنا لست الحكم من الكتابة أداة مخصصة للقيام بذلك.

أي أفكار ؟

هل كانت مفيدة؟

المحلول

جهاز التحكم عن بعد تشغيل البرنامج النصي يمكن بدء تشغيل الملقم الانتظار n دقائق ، ثم الاستعلام الخاص بك RFC الخدمة.هل يمكن أن يكون أيضا المحلي النصي على الخادم تفعل الشيء نفسه.

نصائح أخرى

بعد أن عمل على هذا لفترة من الوقت ، جاء مع VBScript التالية.لا تتردد في التعليق/تحسين.

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

هل يمكن استخدام psservice الاستعلام عن حالة RFC أو التخزين المؤقت للطباعة الخدمات.التخزين المؤقت هو عادة واحدة من آخر الخدمات للبدء.يمكنك استخدام بناء الجملة مثل:

psservice \\someothermachine query spooler

من شأنها أن تعيد شيئا من هذا القبيل مرة واحدة يتم تشغيل الخدمة.

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                                                                   

إذا كان الجهاز الآخر غير جاهز, سوف تحصل على شيء مثل

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

مع VBScript (WSH) يمكن أن تحقق ذلك مع .ممتلكات الدولة.هذا النص يدل على أن المنشأة تستخدم في تطبيقات مختلفة ولكن ينبغي أن تساعد في توضيح الفكرة:

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

استخدام nmap للحصول على قائمة من الخدمات المفتوحة على الجهاز و تحليل النتائج للتأكد من ما تحتاجه هو نشط.من المفيد أيضا للتأكد من أن الأمور لك لا تحتاج هي لا نشط.

يمكنك استطلاع بعض الخدمات الأساسية لمعرفة ما إذا كانت قد بدأت:

sc "\\server_name" query EventSystem

المفتاح هنا هو أنني بحاجة إلى هذا السيناريو.هل هناك نظافة طريقة استخراج حالة الخدمة من psservice/sc query?أنا قادرة على الأنابيب إلى findstr "RUNNING", ولكن يجب أن يكون هناك طريقة أفضل.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top