Показать полную графическую версию : [решено] Остановка и запуск службы
SharkyEXE, я Вас вполне понимаю. Повторю: я не стану писать пять способов проверки того, что служба работает, если один-единственный способ уже даёт равнозначный гарантированный результат.
AutoItSetOption("MustDeclareVars", 1)
Local $sServiceName = "wscsvc"
Local $oSWbemLocator = ObjCreate("WbemScripting.SWbemLocator")
Local $oSWbemServicesEx = $oSWbemLocator.ConnectServer(".", "root\cimv2")
Local $oSWbemObjectEx = $oSWbemServicesEx.Get("Win32_Service.Name='" & $sServiceName & "'")
If $oSWbemObjectEx.State = "Running" Then
ConsoleWrite("Service [" & $sServiceName & "] running." & @CRLF)
;
; Place your code here
;
Else
ConsoleWrite("Service [" & $sServiceName & "] not running." & @CRLF)
EndIf
Exit(0)
P.S. Вы опять поменяли техзадание.
Что здесь плохого-то? »
Смысла не вижу ни малейшего.
SharkyEXE
25-12-2017, 01:57
P.S. Вы опять поменяли техзадание. »
Вы про что?
Предыдущий расширенный код работает как надо , проверено лично
один-единственный способ»
Вы извините меня , пожалуйста , но это Вы можете быть в этом уверены , а я вот не могут быть уверенным , что один единственный способ это вот прям вот что прям служба работает
Чем же wbem 100,1% лучше wmic или Powershell или стандартной родной комманде sc query или старому Net start, что можно верить только wbem ?
Я уважаю Ваш труд , я вообще не понимаю , как Вы это делаете , но просто по одной проверке никакого вывода сделать нельзя
А вот когда 5ть способов проверки мне отвечают , что служба работает - вопросов нет
А у меня вот есть уверенность , что после проверки sc query "{название службы}" | find "RUNNING" можно запускать мой скрипт
И еще есть у меня уверенность , что после проверки PowerShell ( Get-Service -name '{название службы}' ) можно запускать мой скрипт
...
Эх , что ж мне так все тяжело даётся то...
PS. А можете хоть написать , как из остальных 4х способов отловить слово RUNNING , сделать из нее переменную и сравнивать
If $Check1 = RUNNING Then
If $Check2 = RUNNING Then
If $Check3 = RUNNING Then
If $Check4 = RUNNING Then
If RunService("wscsvc") Then
ConsoleWrite("Service running." & @CRLF)
;
; Place your code here
;
Else
ConsoleWrite("Service not running." & @CRLF)
EndIf
Exit(0)
...
PS. А можете хоть написать , как из остальных 4х способов отловить слово RUNNING , сделать из нее переменную и сравнивать »
SharkyEXE, простите, просто не хочу.
SharkyEXE
25-12-2017, 02:29
Iska
Это Вы меня простите , что просто мне хочется один раз и на всю жизнь , чтобы больше к этому не возвращаться
А пока буду пользоваться Вашей расширенной версией , хотя , попробую потупить , может быть как-то где-то у меня поулчиться все-таки остальные 4ре способа проверки прикрутить
Просто обидно , почему меня не понимают , хотя я не программист , но чего-то в моих хотелках и пожеланиях есть тоже правильное
Еще раз спасибо!
SharkyEXE
25-12-2017, 09:12
Iska
И еще : а можете , пожалуйста , написать мне команду применительно к Вашему примеру , чтобы мне сделать Служба = Отключено , просто в конце рыботы моего скрипта мне требуется сделать службу Отключено , мне служба больше не нужна , чтобы работала
Чтобы было так
If RunService("wscsvc") Then
ConsoleWrite("Service running." & @CRLF)
;
; Place your code here
;
{отключить службу}
Зачем отключать? Правильным будет запоминать исходное состояние службы и её состояние StartMode и возвращать их после отработки Вашего кода.
SharkyEXE
25-12-2017, 12:33
Зачем отключать? »
А вот смотрите , кому день и ночь ставить обновления , ни могу не есть и не спать , лишь бы обновления установить , это про программистов на моей работе , а я до сих пор на Windows 7 SP0 ( откатился с SP1 ) сижу и меня все устраивает , ни одного вируса не поймал , стабильно усе.
Эта служба wscsvc у меня уже 3-4 года отключена и усе стабильно , ни единого глюка , синего экрана , зависания и прочего по причине отключения службы
Поэтому запуск службы wscsvc нужен только для моего скрипта , даже если служба wscsvc до запуска моего скрипта была как Автоматичекси + Рабоатет , после отработки моего скрипта эта служба мне больше никогда в жизни не потребуется , я уверен на все 100,1% , потому что 3-4 года эта служба у меня Отключена и я доволен - меньше работающих служб = быстрее работает компьютер
Поэтому я Вас очень прошу , сделайте тогда:
Отключить Службу
Запомнить это состояние
Сделать службу вручную
Запустить службу
Отработка моего скрипта
Вернуть состояние службы Отключено после отработки моего скрипта
SharkyEXE
26-12-2017, 09:41
Iska
Время идет , проблема стоит , мне хочется решения моей проблемы , написал самостоятельно по Вашему примеру Остановка и Отключить службу , все работает , только после Остановка и Отключение службы скрипт выполняется , похоже там таймер чего-то проверяет
StopAndDisabledService("wscsvc")
AutoItSetOption("MustDeclareVars", 1)
Func StopAndDisabledService($sServiceName)
Local $oSWbemLocator = ObjCreate("WbemScripting.SWbemLocator")
Local $oSWbemServicesEx = $oSWbemLocator.ConnectServer(".", "root\cimv2")
Local $oSWbemObjectEx = $oSWbemServicesEx.Get("Win32_Service.Name='" & $sServiceName & "'")
Local $iTimer = 0
Local $bDone = False
Do
$oSWbemObjectEx.StopService()
$oSWbemObjectEx.ChangeStartMode("Disabled")
Sleep(100)
$iTimer = $iTimer + 100
Until $iTimer > 60 * 100 * 10
EndFunc
Пожалуйста , поправьте мой скрипт с учетом таймера , не тупо удалить таймер - если Вы включили таймер , значит он нужен , а приспособить мои две строки к Вашему таймеру
Повторюсь , время идет , проблема стоит , мне хочется решения моей проблемы
Спасибо.
SharkyEXE
27-12-2017, 21:29
Iska
Пожалуйста , очистите Ваш почтовый ящик , а то я Вам не могу напистаь сообщение
Спасибо.
очистите Ваш почтовый ящик , а то я Вам не могу напистаь сообщение »
Поэтому я его и не чищу.
Поэтому я Вас очень прошу , сделайте тогда:
Отключить Службу
Запомнить это состояние
Сделать службу вручную
Запустить службу
Отработка моего скрипта
Вернуть состояние службы Отключено после отработки моего скрипта »
Вы описали крайне нелогичный алгоритм. Я сделаю иначе:
Запустить службу.
Если удалось — отрабатывает Ваш код.
Остановить службу.
Если удалось — сменить режим запуска на отключено.
Не проверялось:
AutoItSetOption("MustDeclareVars", 1)
Local $sServiceName = "wscsvc"
Local $oSWbemLocator = ObjCreate("WbemScripting.SWbemLocator")
Local $oSWbemServicesEx = $oSWbemLocator.ConnectServer(".", "root\cimv2")
Local $oSWbemObjectEx = $oSWbemServicesEx.Get("Win32_Service.Name='" & $sServiceName & "'")
If RunService() Then
ConsoleWrite("Service running." & @CRLF)
;
; Place your code here
;
If $oSWbemObjectEx.StopService() = 0 Then
ConsoleWrite("Service [" & $sServiceName & "] stopped successfully." & @CRLF)
If Not $oSWbemObjectEx.ChangeStartMode("Disabled") = 0 Then
ConsoleWrite("Can't change start mode of service [" & $sServiceName & "] to [Disabled]." & @CRLF)
EndIf
Else
ConsoleWrite("Can't stop service [" & $sServiceName & "]." & @CRLF)
EndIf
Else
ConsoleWrite("Service not running." & @CRLF)
EndIf
Exit(0)
Func RunService()
Local $iTimer = 0
Local $bDone = False
Do
Switch $oSWbemObjectEx.State
Case "Running"
ConsoleWrite("Service [" & $sServiceName & "] already running." & @CRLF)
Return True
Case "Stopped"
If $oSWbemObjectEx.StartMode = "Disabled" Then
If Not $oSWbemObjectEx.ChangeStartMode("Manual") = 0 Then
ConsoleWrite("Can't change start mode of service [" & $sServiceName & "] to [Manual]." & @CRLF)
Return False
EndIf
EndIf
If $oSWbemObjectEx.StartService() = 0 Then
ConsoleWrite("Service [" & $sServiceName & "] start successfully." & @CRLF)
Return True
Else
ConsoleWrite("Can't start service [" & $sServiceName & "]." & @CRLF)
Return False
EndIf
Case "Paused"
If $oSWbemObjectEx.ResumeService() = 0 Then
ConsoleWrite("Service [" & $sServiceName & "] resume successfully." & @CRLF)
Return True
Else
ConsoleWrite("Can't resume service [" & $sServiceName & "]." & @CRLF)
Return False
EndIf
Case "Unknown"
ConsoleWrite("Service [" & $sServiceName & "] is unknown state." & @CRLF)
Return False
Case "Start Pending"
Case "Stop Pending"
Case "Continue Pending"
Case "Pause Pending"
EndSwitch
Sleep(100)
$iTimer = $iTimer + 100
Until $iTimer > 60 * 100 * 10
ConsoleWrite("Timer out for pending operation for service [" & $sServiceName & "]." & @CRLF)
Return False
EndFunc
SharkyEXE
28-12-2017, 11:28
Поэтому я его и не чищу. »
Извините меня , пожалуйста , это полностью Ваше право , просто иного хочется помощи.
А вот можно вторую версию
1. Запустить службу.
2. Если удалось — отрабатывает Ваш код.
3. Режим запуска отключено службу.
4. Если удалось — остановить службу.
Просто в первой версии:
1) Может не остановиться служба
2) Тогда режим запуска службы не станет отключено
3) Тогда после перезагрузки ПК служба будет запускаться
А во второй версии:
1) Сразу после отработки моего кода служба Отключается
2) Скорее всего успешно , тогда будет остановка службы
3) Самое главное , после перезагрузки служба будет отключена
Спасибо.
1) Может не остановиться служба
2) Тогда режим запуска службы не станет отключено
3) Тогда после перезагрузки ПК служба будет запускаться »
Тут Вы, конечно, правы. Какой-то зависимости типа запуска от текущего состояния службы нет. Можно просто вынести смену типа запуска вовне условия:
AutoItSetOption("MustDeclareVars", 1)
Local $sServiceName = "wscsvc"
Local $oSWbemLocator = ObjCreate("WbemScripting.SWbemLocator")
Local $oSWbemServicesEx = $oSWbemLocator.ConnectServer(".", "root\cimv2")
Local $oSWbemObjectEx = $oSWbemServicesEx.Get("Win32_Service.Name='" & $sServiceName & "'")
If RunService() Then
ConsoleWrite("Service running." & @CRLF)
;
; Place your code here
;
If Not $oSWbemObjectEx.ChangeStartMode("Disabled") = 0 Then
ConsoleWrite("Can't change start mode of service [" & $sServiceName & "] to [Disabled]." & @CRLF)
EndIf
If $oSWbemObjectEx.StopService() = 0 Then
ConsoleWrite("Service [" & $sServiceName & "] stopped successfully." & @CRLF)
Else
ConsoleWrite("Can't stop service [" & $sServiceName & "]." & @CRLF)
EndIf
Else
ConsoleWrite("Service not running." & @CRLF)
EndIf
Exit(0)
Func RunService()
Local $iTimer = 0
Local $bDone = False
Do
Switch $oSWbemObjectEx.State
Case "Running"
ConsoleWrite("Service [" & $sServiceName & "] already running." & @CRLF)
Return True
Case "Stopped"
If $oSWbemObjectEx.StartMode = "Disabled" Then
If Not $oSWbemObjectEx.ChangeStartMode("Manual") = 0 Then
ConsoleWrite("Can't change start mode of service [" & $sServiceName & "] to [Manual]." & @CRLF)
Return False
EndIf
EndIf
If $oSWbemObjectEx.StartService() = 0 Then
ConsoleWrite("Service [" & $sServiceName & "] start successfully." & @CRLF)
Return True
Else
ConsoleWrite("Can't start service [" & $sServiceName & "]." & @CRLF)
Return False
EndIf
Case "Paused"
If $oSWbemObjectEx.ResumeService() = 0 Then
ConsoleWrite("Service [" & $sServiceName & "] resume successfully." & @CRLF)
Return True
Else
ConsoleWrite("Can't resume service [" & $sServiceName & "]." & @CRLF)
Return False
EndIf
Case "Unknown"
ConsoleWrite("Service [" & $sServiceName & "] is unknown state." & @CRLF)
Return False
Case "Start Pending"
Case "Stop Pending"
Case "Continue Pending"
Case "Pause Pending"
EndSwitch
Sleep(100)
$iTimer = $iTimer + 100
Until $iTimer > 60 * 100 * 10
ConsoleWrite("Timer out for pending operation for service [" & $sServiceName & "]." & @CRLF)
Return False
EndFunc
SharkyEXE
03-01-2018, 14:03
Iska
Здравствуйте.
В последней версии хочется понять, распространяется или нет Таймер для Отключить службу и Остановить службу после отработки моего скрипта
If Not $oSWbemObjectEx.ChangeStartMode("Disabled") = 0 Then
ConsoleWrite("Can't change start mode of service [" & $sServiceName & "] to [Disabled]." & @CRLF)
EndIf
If $oSWbemObjectEx.StopService() = 0 Then
ConsoleWrite("Service [" & $sServiceName & "] stopped successfully." & @CRLF)
Else
ConsoleWrite("Can't stop service [" & $sServiceName & "]." & @CRLF)
EndIf
Просто для Запуск службы и Смена типа службы перед отработкой моего скрипта Таймер есть, а почему Таймера нету для Отключить службу и Остановить службу после отработки моего скрипта?
Спасибо.
В последней версии »
Старайтесь указывать ссылку на сообщение. Ибо «в последней версии» для Вас и для меня могут сильно отличаться.
Просто для Запуск службы и Смена типа службы перед отработкой моего скрипта Таймер есть, »
Два раза нет. Смотрите внимательнее.
Во-первых, не «Запуск службы и Смена типа службы перед отработкой»: в задачи функции RunService() входит запуск службы и возврат булевого значения — True, в случае, если сие удалось, и False — если не удалось.
Во-вторых, таймер отрабатывает только для случаев:
Case "Start Pending"
Case "Stop Pending"
Case "Continue Pending"
Case "Pause Pending"
когда служба находится в процессе смены одного состояния на другое, и нужно подождать, когда служба перейдёт в то или иное стабильное состояние.
а почему Таймера нету для Отключить службу и Остановить службу после отработки моего скрипта? »
Потому что а) нам известно текущее состояние службы, и б) см. «во-вторых» выше.
SharkyEXE
03-01-2018, 14:55
Iska
Здравствуйте.
1) Скрипт этот (http://forum.oszone.net/post-2788229-32.html)
2) Я про что - а разве когда Служба Работает и Служба надо Остановить после отработки моего скрипта, разве не надо после команды Остановить подождать - процесс смены одного состояния на другое
3) Я про что - а разве когда Тип запуска службы Вручную или Тип запуска службы Автоматически и ее надо Тип запуска службы Отключить после отработки моего скрипта, разве не надо после команды Отключить подождать - процесс смены одного состояния на другое
разве когда служба Работает и ее надо Остановить после отработки моего скрипта, разве не надо после команды Остановить подождать - процесс смены одного состояния на другое »
А в чём смысл ожидания?
разве когда служба Вручную или Автоматически и ее надо Отключить после отработки моего скрипта, разве не надо после команды Отключить подождать - процесс смены одного состояния на другое »
Я уже писал выше, что нет такой зависимости.
SharkyEXE
03-01-2018, 15:07
А в чём смысл ожидания? »
Если служба не сделается Остановить, подождать, пока служба не сделается Остановить
Просто как я понял для запуска службы, подождать используется
А почему для остановки подождать не нужно использовать?
Если служба не сделается Остановить, подождать, пока служба не сделается Остановить »
1. Зачем ждать?
2. Предположим, она никогда не сделается «Остановить». Будем ждать вечно?
А почему для остановки подождать не нужно использовать? »
Повторю ещё раз: зачем ждать?
SharkyEXE
03-01-2018, 15:15
Iska
А можете простой пример работы Вашего таймера написать, типа Служба Остановлена, или служба Отключена и как работает Таймер?
Пример в коде чем не устраивает?
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.