Существует ли возможность восстановления для запуска службы независимо от состояния службы? - PullRequest
0 голосов
/ 10 апреля 2019

Критические службы ServiceB, ServiceC и ServiceD должны быть запущены после некритического ServiceA (ServiceA контролирует B, C и D, но не критично для работы).

Если есть какие-либо проблемы с запуском ServiceA, нам все равно нужно запустить B, C и D. В противном случае мы всегда хотим сначала запустить ServiceA. Мы бы предпочли не останавливать B, C или D, если A падает (останавливается во время работы)

Все службы настроены на автоматический запуск. (Мы не можем использовать отложенный запуск для B, C и D, так как время не подходит, и мы не хотим менять 2 минуты по умолчанию для других отложенных служб)

Зависимости установлены для службы B, C и D, чтобы они всегда запускали необходимую службу, если она не запущена. Они остановятся, если ServiceA остановлен.

Команда ниже для установки зависимости:

sc config ServiceB depend= ServiceA

Мы изучаем систему для вариантов восстановления, которые запустят B, C и D, независимо от того, не будет ли запущен A после нескольких попыток.

Если невозможно выполнить настройку с помощью SC.exe или с помощью настройки Windows 10, мы можем вернуться к использованию сценария запуска или настраиваемого приложения для управления службами, поскольку я уже построил оба, но предпочел бы этот более чистый вариант настройки OS.

Существуют ли группы служб, которые могут быть настроены с другим значением ожидания отложенного запуска?

Любые предложения или изменения приветствуются. ТИА

1 Ответ

0 голосов
/ 10 апреля 2019

Так как мы уже запустили скрипт запуска, я быстро соединил его.Это не идеально и немного неэффективно, но работает.Настройка ServiceB, C и D на ручной запуск и использование этого для их запуска может привести к желаемому результату без необходимости использования вышеуказанных зависимостей.

Set WshShell = WScript.CreateObject("WScript.Shell")
If WScript.Arguments.Length = 0 Then
  Set ObjShell = CreateObject("Shell.Application")
  ObjShell.ShellExecute "wscript.exe" _
    , """" & WScript.ScriptFullName & """ RunAsAdministrator", , "runas", 1
  WScript.Quit
End If

If Not ServiceAction("ServiceA", -1) = "RUNNING" Then 
    'Stop the services if they are running
    ServiceAction "ServiceB", 0
    ServiceAction "ServiceC", 0
    ServiceAction "ServiceD", 0
    'Start the services in sequence
    ServiceAction "ServiceA", 1
    ServiceAction "ServiceB", 1
    ServiceAction "ServiceC", 1
    ServiceAction "ServiceD", 1
End If

Function ServiceAction(service_name, service_action)
    'Start Service
    Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
    Set colListOfServices = objWMIService.ExecQuery ("Select * from Win32_Service Where Name ='" & service_name & "'")
    For Each objService in colListOfServices
        If service_action = -1 Then 
            ServiceAction = UCase(objService.State)
        ElseIf service_action = 1 Then 
            ServiceAction = objService.StartService()
        ElseIf service_action = 0 Then
            ServiceAction = objService.StopService()
        End If
    Next
    'For debugging
    WScript.Echo "WMI CODE: "&ServiceAction
End Function
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...