KeyWeb
11111111111Rating 1.00 (2 Votes)
Представим, что есть некий набор служб, например Print Spooler, который иногда по некоторым причинам останавливается и пока решается проблема по устранению причин останова, нужно что бы этот сервис работал и если он вдруг остановился, то в течении ближайших пяти минут он был снова запущен.

VBS скрипт

Здесь на помощь как всегда пришел VBScript + WMI, код рабочего скрипта:

On Error Resume Next
'Variables
Dim objWMIService, objProcess, colProcess, Status, strComputer, strService

'Assign Arguments
strComputer = WScript.Arguments(0)
strService = WScript.Arguments(1)
strServiceSysName = WScript.Arguments(2)
Status= false

'Action for service
Sub WaitUntil(Query)
Set wmi = GetObject("winmgmts://./root/cimv2")
Do Until wmi.ExecQuery(Query).Count > 0
WScript.Sleep 100
Loop
End Sub

Sub StartOrStopService(Action, ServiceName)
Set wmi = GetObject("winmgmts://./root/cimv2")

'Wscript.Echo "Trying to "+ Action +" service: " & ServiceName

qry = "SELECT * FROM Win32_Service WHERE Name='" & ServiceName & "'"
For Each s In wmi.ExecQuery(qry)
Select Case Action
Case "start": If s.State = "Stopped" Then
s.StartService
'Wscript.Echo "Wating for service to "& Action &": " & ServiceName
'WaitUntil qry & " AND State='Running'"
End If

Case "stop" : If s.State = "Running" Then
s.StopService
'Wscript.Echo "Wating for service to "& Action &": " & ServiceName
'WaitUntil qry & " AND State='Stopped'"
End If

Case "restart" :
StartOrStopService "stop", ServiceName
StartOrStopService "start", ServiceName
Case Else : 'WScript.Echo "Invalid action: " & action
End Select
Next
End Sub

'Check For Arguments - Quit If None Found
If Len(strService) < 1 Then
'Wscript.echo "No Arguments Entered - Exiting Script"
WScript.Quit
End If

'Setup WMI Objects
Set objWMIService = GetObject("winmgmts:"& "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colProcess = objWMIService.ExecQuery ("SELECT DisplayName, Status, State FROM Win32_Service WHERE DisplayName = '" & strService & "'")

'Check For Running Service
For Each objProcess in colProcess
If InStr(objProcess.DisplayName,strService) > 0 And objProcess.State = "Running" Then
Status = true
End If
Next

If Status = true Then
'Wscript.echo "Service: " & UCase(strComputer) & " " & strService & " Running"
'Perform Some Pass Logic Here
Else
'Wscript.echo "Service: " & UCase(strComputer) & " " & strService & " Not Running"
'Perform Some Failed Logic Here
StartOrStopService "start", strServiceSysName
End If

Часть эхо функций закомментирована, для того, что бы скрипт работал в планировщике задач, без останова. Если необходимо запускать скрипт в ручную, то для «интерфейсности» можно раскомментировать эти функции.

Выполнение в ручную

Как скрипт выполнять в командной строке, сначала смотрим наш сервис, нам необходимо три параметра сервиса — имя машины, в данном случае localhost, Display name и Service name
check service vbs
Скрипт можно «положить» куда угодно, запустить командную строку от имени администратора, перейти в папку со скриптом, выполнить:
cscript chkServices.vbs localhost "Print Spooler" "Spooler"
Если сервис был остановлен, он запустится.

Задача в шедулере

Далее необходимо создать задачу в TaskSheduler, с параметрами:
Триггеры — Ежедневно, Повтор каждые N минут

check service vbs2
Действие — Start a program, путь к скрипту, с параметрами localhost "Print Spooler" "Spooler"

check service vbs3

Готово, останавливаем службу, ждем N минут, радуемся )

Добавить комментарий


Обновить
Защитный код

KeyWeb

Сейчас 115 гостей и ни одного зарегистрированного пользователя на сайте

Вверх
Вниз