Войти

Показать полную графическую версию : [решено] Остановка и запуск службы


Страниц : 1 [2] 3

Iska
25-12-2017, 01:51
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)
...

Iska
25-12-2017, 02:24
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
;
{отключить службу}

Iska
25-12-2017, 09:56
Зачем отключать? Правильным будет запоминать исходное состояние службы и её состояние 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

Пожалуйста , очистите Ваш почтовый ящик , а то я Вам не могу напистаь сообщение

Спасибо.

Iska
28-12-2017, 07:28
очистите Ваш почтовый ящик , а то я Вам не могу напистаь сообщение »
Поэтому я его и не чищу.

Поэтому я Вас очень прошу , сделайте тогда:
Отключить Службу
Запомнить это состояние
Сделать службу вручную
Запустить службу
Отработка моего скрипта
Вернуть состояние службы Отключено после отработки моего скрипта »
Вы описали крайне нелогичный алгоритм. Я сделаю иначе:

Запустить службу.
Если удалось — отрабатывает Ваш код.
Остановить службу.
Если удалось — сменить режим запуска на отключено.


Не проверялось:
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) Самое главное , после перезагрузки служба будет отключена

Спасибо.

Iska
31-12-2017, 11:47
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
Просто для Запуск службы и Смена типа службы перед отработкой моего скрипта Таймер есть, а почему Таймера нету для Отключить службу и Остановить службу после отработки моего скрипта?

Спасибо.

Iska
03-01-2018, 14:29
В последней версии »
Старайтесь указывать ссылку на сообщение. Ибо «в последней версии» для Вас и для меня могут сильно отличаться.

Просто для Запуск службы и Смена типа службы перед отработкой моего скрипта Таймер есть, »
Два раза нет. Смотрите внимательнее.

Во-первых, не «Запуск службы и Смена типа службы перед отработкой»: в задачи функции 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) Я про что - а разве когда Тип запуска службы Вручную или Тип запуска службы Автоматически и ее надо Тип запуска службы Отключить после отработки моего скрипта, разве не надо после команды Отключить подождать - процесс смены одного состояния на другое

Iska
03-01-2018, 15:01
разве когда служба Работает и ее надо Остановить после отработки моего скрипта, разве не надо после команды Остановить подождать - процесс смены одного состояния на другое »
А в чём смысл ожидания?

разве когда служба Вручную или Автоматически и ее надо Отключить после отработки моего скрипта, разве не надо после команды Отключить подождать - процесс смены одного состояния на другое »
Я уже писал выше, что нет такой зависимости.

SharkyEXE
03-01-2018, 15:07
А в чём смысл ожидания? »
Если служба не сделается Остановить, подождать, пока служба не сделается Остановить

Просто как я понял для запуска службы, подождать используется

А почему для остановки подождать не нужно использовать?

Iska
03-01-2018, 15:12
Если служба не сделается Остановить, подождать, пока служба не сделается Остановить »
1. Зачем ждать?
2. Предположим, она никогда не сделается «Остановить». Будем ждать вечно?

А почему для остановки подождать не нужно использовать? »
Повторю ещё раз: зачем ждать?

SharkyEXE
03-01-2018, 15:15
Iska

А можете простой пример работы Вашего таймера написать, типа Служба Остановлена, или служба Отключена и как работает Таймер?

Iska
03-01-2018, 17:50
Пример в коде чем не устраивает?




© OSzone.net 2001-2012