Форум программистов, компьютерный форум, киберфорум
VBScript/JScript/WSH/WMI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.66/101: Рейтинг темы: голосов - 101, средняя оценка - 4.66
0 / 0 / 0
Регистрация: 27.05.2015
Сообщений: 16
VBS

Запуск службы и её перезапуск в случае непредвиденной остановки

27.05.2015, 20:21. Показов 21856. Ответов 35
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет.
Столкнулся с проблемой - нужно сделать скрипт, который запускает определённую службу, при чём если служба остановлена, или её вручную останавливают, скрипт должен опять её запустить и так постоянно. Как запустить службу в скрипте через bat файл я нашёл, а вот как сделать так, чтобы он ещё отслеживал состояние службы и запускал её не нашёл.
сам скрипт такой

Visual Basic
1
2
3
Set WshShell = CreateObject("WScript.Shell")
WshShell.Run chr(34) & "D:\Distrib\123.bat" & Chr(34), 0
Set WshShell = Nothing
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
27.05.2015, 20:21
Ответы с готовыми решениями:

Asyncio корректное завершение в случае непредвиденной остановки программы
Есть скрипт (выложен не полностью) @asyncio.coroutine def do_work(data): for adres, ip_list in data.items(): if len(ip_list)...

Перезапуск службы
Добрый день. Хочу осуществить перезапуск службы через bat-файл. Написал пока так sc stop %1 & sc start %1 %2 В...

Перезапуск службы
В общем у меня есть свои собственные службы, например: Service1, Service2, Service3 ... ServiceN. Данные службы связаны друг с другом и...

35
2619 / 549 / 109
Регистрация: 21.03.2012
Сообщений: 1,051
29.05.2015, 12:36
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Arhon Посмотреть сообщение
... может есть вариант отслеживания её иначе?
Да дело-то пока не в отслеживании состояния службы, а в её запуске в случае остановки. Сценарий 1 запустит такой процесс, какой вы ему укажете.

В качестве теста сценария 2 попробуйте запускать с его помощью какую-нибудь другую остановленную службу. Единственное условие - служба не должна иметь зависимостей от других служб (ни "родительских", ни "дочерних").

Кстати, можно вообще не следить за текущим состоянием службы, а лишь периодически с помощью планировщика просто пытаться её запускать (вашим "батником", например).
0
0 / 0 / 0
Регистрация: 27.05.2015
Сообщений: 16
29.05.2015, 12:44  [ТС]
вот пока обхожусь планировщиком заданий, только не уверен что он правильно отрабатывает тригер
0
0 / 0 / 0
Регистрация: 27.05.2015
Сообщений: 16
15.06.2015, 22:47  [ТС]
возник другой вопрос: брандмауэр windows можно отключить не через остановку службы, а через панель управления - брандмауэр - включение\отключение брандмауэра. так вот, можно ли добавить в скрипт параметры, которые бы включали брандмауэр, если его отключили через панель управления
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18035 / 7738 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
16.06.2015, 11:25
Цитата Сообщение от Arhon Посмотреть сообщение
галочка стоит, а вот кнопка "Остановить" всё равно активна. Даже антивирус переустанавливал
Если лицензия, посоветую Вам обратится в их службу технической поддержки.
0
0 / 0 / 0
Регистрация: 17.08.2015
Сообщений: 14
18.08.2015, 16:23
А как просто написать скрипт запуска службы?
0
2619 / 549 / 109
Регистрация: 21.03.2012
Сообщений: 1,051
18.08.2015, 23:22
cherfull22, смотрите в этой теме сообщение #2, сценарий 2.
0
0 / 0 / 0
Регистрация: 11.08.2016
Сообщений: 4
11.08.2016, 08:12
А можно сделать тоже самое только наоборот, скрипт следит за службой и когда она перейдет в состояние "Running", то по истечении 10 минут её останавливал и продолжал следить?
0
2619 / 549 / 109
Регистрация: 21.03.2012
Сообщений: 1,051
11.08.2016, 09:05
flom01, внесите соответствующие изменения в сценарии:
- в первом сценарии выражение TargetInstance.State='Stopped' замените на TargetInstance.State='Running'
- второй сценарий приведите к подобному виду
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
Dim objWMI, objCollection, objItem
Dim strService, blnSkip, blnHasError, intTemp, strTemp
 
strService = "wuauserv"
On Error Resume Next
Set objWMI = GetObject("winmgmts:\\.\root\cimv2")
If Err.Number = 0 Then
    Set objCollection = objWMI.ExecQuery("SELECT State,StartMode FROM Win32_Service WHERE Name='" & strService & "'")
    If Err.Number = 0 Then
        For Each objItem In objCollection
            If StrComp(objItem.State, "Running", vbTextCompare) = 0 Then
                If StrComp(objItem.StartMode, "Manual", vbTextCompare) <> 0 Then
                    intTemp = objItem.ChangeStartMode("Manual")
                    If intTemp = 0 Then
                        strTemp = "Режим запуска службы установлен в ""Manual"""
                        WScript.Sleep 600000
                        intTemp = objItem.StopService
                        If intTemp <> 0 Then
                            strTemp = strTemp & vbNewLine & "Ошибка при остановке службы: " & intTemp
                            blnHasError = True
                        End If
                    Else
                        strTemp = "Ошибка изменения режима запуска службы: " & intTemp
                        blnHasError = True
                    End If
                Else
                    strTemp = "Текущеий режим запуска службы: " & UCase(objItem.StartMode)
                End If                
            ElseIf StrComp(objItem.State, "Stopped", vbTextCompare) = 0 Then
                strTemp = "Служба уже остановлена"
                blnSkip = True
            Else
                strTemp = "Текущее состояниние службы: " & UCase(objItem.State)
            End If
        Next
    Else
        strTemp = "Ошибка выполнения запроса: " & Err.Number & vbNewLine & Err.Description
        Err.Clear
        blnHasError = True
    End If
Else
    strTemp = "Ошибка подключения к WMI-пространству: " & Err.Number & vbNewLine & Err.Description
    Err.Clear
    blnHasError = True
End If
If Not (blnHasError Or blnSkip) Then
    WScript.Sleep 5000
    Set objCollection = objWMI.ExecQuery("SELECT State FROM Win32_Service WHERE Name='" & strService & "'")
    If Err.Number = 0 Then
        For Each objItem In objCollection
            If StrComp(objItem.State, "Stopped", vbTextCompare) = 0 Then
                strTemp = strTemp & vbNewLine & "Служба остановлена"
            Else
                strTemp = strTemp & vbNewLine & "Не удалось остановить службу"
            End If
        Next
    Else
        strTemp = strTemp & vbNewLine & "Ошибка выполнения запроса: " & Err.Number & vbNewLine & Err.Description
        Err.Clear
    End If
End If
Set objItem = Nothing: Set objCollection = Nothing: Set objWMI = Nothing
'WScript.Echo strTemp
WScript.Quit 0
0
0 / 0 / 0
Регистрация: 11.08.2016
Сообщений: 4
11.08.2016, 10:27
второй скрипт не хочет работать, меню имя службы на свое, запускаю второй скрипт, но ничего не происходит. В процессах появляется wscript.exe на 5 сек. и исчезает...
0
2619 / 549 / 109
Регистрация: 21.03.2012
Сообщений: 1,051
11.08.2016, 13:24
Чтобы увидеть диагностическое сообщение сценария, "раскомментируйте" предпоследний оператор.
Кстати, запускать сценарий необходимо от имени администратора.
0
0 / 0 / 0
Регистрация: 11.08.2016
Сообщений: 4
11.08.2016, 14:11
Раскоментировал оператор, создаю ярлык скрипта, разрешаю запуск от имени Администратора

вылазит ошибка
0
2619 / 549 / 109
Регистрация: 21.03.2012
Сообщений: 1,051
11.08.2016, 14:46
Лучший ответ Сообщение было отмечено ComSpec как решение

Решение

Какая ОС? Какая служба?

Добавлено через 23 минуты
Замените строки с 12 по 28 фрагментом:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
If StrComp(objItem.StartMode, "Manual", vbTextCompare) <> 0 Then
    intTemp = objItem.ChangeStartMode("Manual")
    If intTemp = 0 Then
        strTemp = "Режим запуска службы установлен в ""Manual"""
    Else
        strTemp = "Ошибка изменения режима запуска службы: " & intTemp
        blnHasError = True
    End If
Else
    strTemp = "Текущий режим запуска службы: " & UCase(objItem.StartMode)
End If
If Not blnHasError Then
    WScript.Sleep 600000
    intTemp = objItem.StopService
    If intTemp <> 0 Then
        strTemp = strTemp & vbNewLine & "Ошибка при остановке службы: " & intTemp
        blnHasError = True
    End If
End If
0
0 / 0 / 0
Регистрация: 11.08.2016
Сообщений: 4
12.08.2016, 08:06
Огромное, большое СПАСИБО!!! Все работает!
0
32 / 36 / 1
Регистрация: 22.11.2012
Сообщений: 302
20.01.2017, 08:47
а попроще ничего нет? ведь в .bat останвка выполнение с ожиданием завершения и следующие строки не запускает пока эта строка не отработает:
Windows Batch file
1
2
3
@echo OFF
net stop MSSQL$SQLEXPRESS
net start MSSQL$SQLEXPRESS
Можно ли так же просто в VBS, а то он пульнул команду и шпарит дальше не ожидая завершения выполнения команды.

Добавлено через 11 минут
имел ввиду что без WScript.Sleep. потому что на педальных компах служба запускается долго и универсальность скрипта теряется из-за загрузки компа. сколько слипать - не понятно. нет ли способа запускать и останавливать службу с ожиданием завершения команды?
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18035 / 7738 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
20.01.2017, 17:00
Если .StopService асинхронна (сам не проверял), то просто проверяйте в цикле её состояние. Когда оно изменится, давайте команду на запуск службы.
0
0 / 0 / 0
Регистрация: 02.05.2020
Сообщений: 1
02.05.2020, 07:04
Может кому-то пригодится.
Немного модифицировал под свои задачи:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
Dim objWMI, objCollection, objItem
Dim strMsg
 
Sub Close(strMsg)
    
    Set objItem         = Nothing
    Set objCollection   = Nothing
    Set objWMI          = Nothing
    
    Err.Clear
    
    If strMsg <> "" Then
        MsgBox strMsg,, "Check Point Service"
    End If
    
    WScript.Quit 0
    
End Sub
 
Sub addMsg(strTemp)
    
    If strMsg = "" Then
        strMsg = strTemp
    Else
        strMsg = strMsg & vbNewLine & strTemp
    End If
    
End Sub
 
On Error Resume Next
 
Set objWMI = GetObject("winmgmts:\\.\root\cimv2")
If Err.Number <> 0 Then
    Close "Ошибка подключения к WMI-пространству: " & Err.Number & vbNewLine & Err.Description
End If
 
Set objCollection = objWMI.ExecQuery("SELECT State,StartMode FROM Win32_Service WHERE Name='EPWD' or Name='TracSrvWrapper'")
If Err.Number <> 0 Then
    Close "Ошибка выполнения запроса: " & Err.Number & vbNewLine & Err.Description
End If
 
strMsg = ""
 
For Each objItem In objCollection
    
    If LCase(objItem.StartMode) <> "manual" Then
        intTemp = objItem.ChangeStartMode("manual")
        If intTemp = 0 Then
            addMsg "Изменен режим запуска службы: " & objItem.Name & " (Вручную)"
        ElseIf intTemp = 2 Then
            addMsg "Не достаточно прав для изменения режима запуска службы: " & objItem.Name
        Else
            addMsg "Ошибка изменения режима запуска службы: " & objItem.Name
        End If
    End If
    
    If LCase(objItem.State) = "stopped" Then
        intTemp = objItem.StartService
        If intTemp = 0 Then
            addMsg "Запущена служба: " & objItem.Name
        ElseIf intTemp = 2 Then
            addMsg "Не достаточно прав для запуска службы: " & objItem.Name
        Else
            addMsg "Ошибка при запуске службы: " & objItem.Name
        End If
        
    ElseIf LCase(objItem.State) = "running" Then
        addMsg "Служба " & objItem.Name & " работает"
                
    Else
        addMsg "Текущее состояниние службы: " & UCase(objItem.State)
        
    End If
    
Next
 
Close(strMsg)
Для запуска с UAC создал ярлык.
Запуск скрипта с повышенными привилегиями [руководство]
Миниатюры
Запуск службы и её перезапуск в случае непредвиденной остановки  
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
02.05.2020, 07:04

Перезапуск службы
У меня служба, которая запускается и которая не должна останавливаться. Глобальный BroadcastReceiver получает сообщения и запускает...

Остановка и запуск службы(сервиса) из другой службы или из приложения не используя консоль
Добрый день! Компилятор Embarcadero XE8 Скажите, как можно остановить и запустить некую службу(сервис) зная его имя (например...

Программный перезапуск службы-виндовс
Всем доброго времени суток. Как перезапустить службу виндовс? И возможно ли, что бы служба перезапустила саму себя?

D7, запуск службы из под службы, возможно ли такое?
Hello All. Необходимо написать службу которая будет через определенное время (каждые 5 минут) проверять существует (зарегистрирована) ли...

К системным администраторам. Перезапуск службы SSH
Здравствуйте. Имею виртуальный сервер. Там стоит система SentOS. В файле sshd_config прописал порт 41790. На всякий тоже самое сделал в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
36
Ответ Создать тему
Новые блоги и статьи
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru