Что нового

Получение состояния службы Windows

Hardoman

Новичок
Сообщения
14
Репутация
0
Есть ли возможность узнать, запущена ли та или иная виндовая служба?
По возможности, приведите пример кода...
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Hardoman
Присмотрись к списку внизу, там где «Похожие темы» ;)
Поиском пользоваться не суждено?
 

sngr

AutoIT Гуру
Сообщения
1,010
Репутация
408
Код:
$pid=Run('sc query dhcp','','',0x2)
$read=''
While 1
    $read &= StdoutRead($pid)
    If @error Then ExitLoop
    Sleep(1)
WEnd
$str=StringRegExp($read,'STATE.*?:\s\d.\s{1,}(\S+)',1)
MsgBox(0,'',$str[0])
 
Автор
H

Hardoman

Новичок
Сообщения
14
Репутация
0
sngr, спасибо огромное!
CreatoR, я не нашел ни в одной теме именно проверки, есть старт-стоп служб.

Как я вижу, течнически разница в реализации большая
 
Автор
H

Hardoman

Новичок
Сообщения
14
Репутация
0
Помогите, пожалуйста..
сам по себе этот код работает, но когда его вставляешь куда-либо, то выдает Serice is 0
Я понимаю, что StringRegExp должен возвращать одномерный массив, котоырй мы передаем в $str, однако у меня не получается получить его содержимое.

А если написать GUICtrlCreateLabel("Service is " & $str[0], 10, 50), то ругается...
Subscript used with non-Array variable.:
GUICtrlCreateLabel("Service is " & $str[0], 10, 50)
GUICtrlCreateLabel("Service is " & $str^ ERROR

Код:
#include <GUIConstants.au3>

GUICreate("Service")
GUICtrlCreateLabel("Enter service name:", 10, 10)
$s = GUICtrlRead(GUICtrlCreateInput("", 10, 30))
$ok_but = GUICtrlCreateButton ("OK",120,30)
GUISetState ()
Do
    $msg = GUIGetMsg()
Until $msg = $GUI_EVENT_PRIMARYDOWN

$pid=Run('sc query $s','','',0x2)
$read=''
While 1
    $read &= StdoutRead($pid)
    If @error Then ExitLoop
    Sleep(1)
WEnd
$str=StringRegExp($read,'STATE.*?:\s\d.\s{1,}(\S+)',1)
; MsgBox(0,'',$str[0])

GUICtrlCreateLabel("Service is " & $str, 10, 50)
$u = GUICtrlCreateInput("", 10, 30)
$but_start = GUICtrlCreateButton ("Start",10,110)
;GUICtrlSetState(-1,$GUI_FOCUS)          ; the focus is on this button
$but_stop = GUICtrlCreateButton ("Stop",40,110)

GUISetState ()

; Run the GUI until the dialog is closed
Do
    $msg = GUIGetMsg()
    if $msg = $but_start then
        RunWait(@ComSpec &' /c net start ' & $s,'', @SW_HIDE)
	Else
		RunWait(@ComSpec &' /c net stop ' & $s,'', @SW_HIDE)
    endif
Until $msg = $GUI_EVENT_CLOSE


Я пытался и через _ArrayToClip и ClipGet() передать - не получается :(
 

snoitaleR

AutoIT Гуру
Сообщения
855
Репутация
223
Hardoman
Предлагаю еще один вариант проверки состояния службы...

Код:
; НАЧАЛО

 $NAME=InputBox("Проверка состояния службы","Введите название службы","wuauserv")

 $KEY="HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\"&$NAME

 $VALUE=RegRead($KEY,"Start")

 Switch $VALUE
  Case 2
   $STATE="Автоматически"
  Case 3
   $STATE="Вручную"
  Case 4
   $STATE="Остановлена"
  Case Else
   $STATE="Не определено"
 EndSwitch

 MsgBox(0,"Состояние",$STATE)

; КОНЕЦ
 
Автор
H

Hardoman

Новичок
Сообщения
14
Репутация
0
snoitaleR
Спасибо большое за ваш вариант, он тоже интересен. Однако, если я правильно понимаю, он показывает, как служба должна запускаться при старте, но, если она закрэшилась или её кто-то руками во время сессии, то здесь получится иной результат.

---Zak---
Спасибо, но там иначе: там листинг всех служб, а мне нужен был один только текущий статус одной службы.

sngr
Все-таки, я бы хотел узнать, как справиться с этим массивом. Почему через MsgBox(0,'',$str[0]) не прочитать как у вас, если приведенный вами код вставить в другой код? Работает, тока если ваш код запустить отдельно.
(См. подробнее ответ №5)
 

sngr

AutoIT Гуру
Сообщения
1,010
Репутация
408
Код:
$s='dhcp'
$pid=Run('sc query '&$s,'',@SW_HIDE,0x2)
$read=''
While 1
    $read &= StdoutRead($pid)
    If @error Then ExitLoop
    Sleep(1)
WEnd
;~ MsgBox(0,'',$read)
If StringInStr($read,'STATE')=0 Then MsgBox(0,'','проблемы в коде выше')
$str=StringRegExp($read,'STATE.*?:\s\d.\s{1,}(\S+)',1)
MsgBox(0,'',$str[0])

Проблема не в массиве, а в вашей спешке. Не пытайтесь делать всё сразу, если нет в этом опыта. Разбиритесь в начале с моим кодом, а после лепите gui к нему. И вот здесь почитайте:
Код:
Run('sc')
 

---Zak---

Скриптер
Сообщения
455
Репутация
120
Код:
_Service_GetState()


Код:
#Include <Services.au3>
ConsoleWrite(_Service_GetState("Dhcp"))


Пример (отредактирован):
Код:
#Include <Services.au3>
#Include <GUIConstantsEx.au3>

$Form1 = GUICreate("Service", 211, 288, 585, 140)
   $Label1 = GUICtrlCreateLabel("Enter service name:", 16, 8, 98, 17)
   $Input1 = GUICtrlCreateInput("", 32, 24, 161, 21)
   $Button1 = GUICtrlCreateButton("OK", 120, 48, 75, 25)
   $Label2 = GUICtrlCreateLabel("", 16, 104, 180, 20)
   $Button2 = GUICtrlCreateButton("Start Service", 24, 152, 75, 25)
	  GUICtrlSetState($Button2, $GUI_DISABLE)
   $Button3 = GUICtrlCreateButton("Stop Service", 104, 152, 75, 25)
	  GUICtrlSetState($Button3, $GUI_DISABLE)
GUISetState(@SW_SHOW)

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
	    Case $Button1
			 _SRV_TEST()
	    Case $Button2
			 _SRV_START()
	    Case $Button3
			 _SRV_STOP()
	EndSwitch
WEnd
;~ Проверяем состояние службы
Func _SRV_TEST()
   Local $SRV_TEST = _Service_GetState(GUICtrlRead($Input1))
	GUICtrlSetState($Button2, $GUI_DISABLE)
	GUICtrlSetState($Button3, $GUI_DISABLE)
   If (GUICtrlRead($Input1) <> "") Then
	  If ($SRV_TEST == "Running") Then
		 GUICtrlSetData($Label2, "Service is "&$SRV_TEST)
		 GUICtrlSetState($Button3, $GUI_ENABLE)
	  ElseIf ($SRV_TEST == "Stopped") Then
		 GUICtrlSetData($Label2, "Service is "&$SRV_TEST)
		 GUICtrlSetState($Button2, $GUI_ENABLE)
	  Else
		 GUICtrlSetData($Label2, "ERROR: Service not found !!!")
	  EndIf	 
   Else
	  GUICtrlSetData($Label2, "ERROR: enter service name !!!")
   EndIf
EndFunc
;~ Запускаем службу
Func _SRV_START()
   _Service_Start(GUICtrlRead($Input1))
	GUICtrlSetState($Button2, $GUI_DISABLE)
	GUICtrlSetState($Button3, $GUI_ENABLE)
	GUICtrlSetData($Label2, "Service is "&_Service_GetState(GUICtrlRead($Input1)))
EndFunc 
;~ Останавливаем службу
Func _SRV_STOP()
   _Service_Stop(GUICtrlRead($Input1))
	GUICtrlSetState($Button2, $GUI_ENABLE)
    GUICtrlSetState($Button3, $GUI_DISABLE)
	GUICtrlSetData($Label2, "Service is "&_Service_GetState(GUICtrlRead($Input1)))
EndFunc
 
Автор
H

Hardoman

Новичок
Сообщения
14
Репутация
0
sngr [?]
Проблема не в массиве, а в вашей спешке

Прошу прощения, но все-таки хочу этот вопрос добить. После того, как подправил синтаксис $pid=Run('sc query '&$s,'',@SW_HIDE,0x2) все отлично заработало.
Но почему-то всегда статус RUNNING у службы пишет, если я это вставляю ваш код в свой gui. По отдельности статус службы показывает верно. Подскажите пожалуйста, где теперь может быть ошибка?



Добавлено:
Сообщение автоматически объединено:

---Zak--- [?]

Увы, у меня нет Services.au3, у меня стандартная поставка 3.3.8.1. Где взять?
 

---Zak---

Скриптер
Сообщения
455
Репутация
120

sngr

AutoIT Гуру
Сообщения
1,010
Репутация
408
Код:
Func sc ($s='dhcp')
$pid=Run('sc query '&$s,'',@SW_HIDE,0x2)
$read=''
While 1
    $read &= StdoutRead($pid)
    If @error Then ExitLoop
    Sleep(1)
WEnd
If StringInStr($read,'STATE')=0 Then MsgBox(0,'','проблемы в коде выше')
$str=StringRegExp($read,'STATE.*?:\s\d.\s{1,}(\S+)',1)
MsgBox(0,'',$str[0])
EndFunc

$Gui=GUICreate("123")
	$Button_1 = GUICtrlCreateButton("тык", 10, 50, 120)
	$combo=GUICtrlCreateCombo('w32time',1,1)
	GUICtrlSetData ($combo,'netlogon|dhcp|cisvc')
	GUISetState()

	While 1
		$msg = GUIGetMsg()
		Switch $msg
			Case -3
				ExitLoop
			Case $Button_1
				$s=GUICtrlRead($combo)
				sc($s)
		EndSwitch
	WEnd
 
Автор
H

Hardoman

Новичок
Сообщения
14
Репутация
0
Спасибо всем огромное, особенно sngr
Благодаря вашему коду я нашел ошибку у себя и все поправил!
 

SharkyEXE

Новичок
Сообщения
134
Репутация
0
Здравствуйте.

Прошу прощения , не наказывайте меня , пожалуйста , однако если служба запущена , если состояние службы Работает , то при запуске этого скрипта перейти
Код:
$pid=Run('sc query dhcp','','',0x2)
$read=''
While 1
    $read &= StdoutRead($pid)
    If @error Then ExitLoop
    Sleep(1)
WEnd
$str=StringRegExp($read,'STATE.*?:\s\d.\s{1,}(\S+)',1)
MsgBox(0,'',$str[0])
выдается ошибка
Код:
"D:\SSD\Users\-\Desktop\11111111.au3" (9) : ==> Subscript used on non-accessible variable.:
MsgBox(0,'',$str[0])
MsgBox(0,'',$str^ ERROR
Спасибо.
 

sngr

AutoIT Гуру
Сообщения
1,010
Репутация
408
Тут гадать нечего - регулярка не находит выражение и возвращает ошибку, стотри что у тебя там.
Код:
$pid=Run('sc query dhcp','','',0x2)
$read=''
While 1
    $read &= StdoutRead($pid)
    If @error Then ExitLoop
    Sleep(1)
WEnd
clipput($read)
MsgBox(0,'',$read)
;$str=StringRegExp($read,'STATE.*?:\s\d.\s{1,}(\S+)',1)
;MsgBox(0,'',$str[0])
 

SharkyEXE

Новичок
Сообщения
134
Репутация
0
sngr

Вот что

А можно , пожалуйста , сделать просто вывод статусов , что написано в строке STATE , после двоеточия
STOPPED
RUNNING
PAUSED

Спасибо.
 

Вложения

  • 2017-12-24_0001.jpg
    2017-12-24_0001.jpg
    26.6 КБ · Просмотры: 22

sngr

AutoIT Гуру
Сообщения
1,010
Репутация
408
Код:
$pid=Run('sc query dhcp','','',0x2)
$read=''
While 1
    $read &= StdoutRead($pid)
    If @error Then ExitLoop
    Sleep(1)
WEnd
$str=StringRegExp($read,'STATE.*?:[^A-z]*([A-z]+)',1)
MsgBox(0,'',$str[0])
 

SharkyEXE

Новичок
Сообщения
134
Репутация
0
sngr

Здравствуйте.

Большое Вам спасибо.

Проверялось на этой службе ( Winmgmt = Инструментарий управления Windows )
https://cloud.mail.ru/public/FsMR/S2o85Cs8n
https://cloud.mail.ru/public/JZdi/8PzUyVVWj
https://cloud.mail.ru/public/8wtE/e1GrtvxsS

Когда служба Winmgmt остановлена - все отлично

А вот :

1) когда служба Winmgmt приостановлена , выдается это
Код:
"E:\D\A\MS\W\7\Twk\Pack\Old\1 (2).au3" (9) : ==> Subscript used on non-accessible variable.:
MsgBox(0,'',$str[0])
MsgBox(0,'',$str^ ERROR

2) когда служба Winmgmt запущена , выдается это
Код:
"E:\D\A\MS\W\7\Twk\Pack\Old\1 (2).au3" (9) : ==> Subscript used on non-accessible variable.:
MsgBox(0,'',$str[0])
MsgBox(0,'',$str^ ERROR
 

Вложения

  • 2017-12-24_0004.jpg
    2017-12-24_0004.jpg
    5.3 КБ · Просмотры: 83

firex

AutoIT Гуру
Сообщения
943
Репутация
208
SharkyEXE
Лучше обратите внимание на QueryServiceStatusEx

Полная документация:
https://msdn.microsoft.com/ru-ru/library/windows/desktop/ms685942(v=vs.85).aspx

Пара завалявшихся примеров (QueryServiceStatusEx придется дописать):
Код:
Global $STANDARD_RIGHTS = 0x000F0000

Global $SCMAN_ALL_ACCESS = BitOR( $STANDARD_RIGHTS, 0x0000003F )
Global Const $SCMAN_CONNECT = 0x00000001, _
	$SCMAN_CREATE_SERVICE = 0x00000002, _
	$SCMAN_ENUMERATE_SERVICE = 0x00000004, _
	$SCMAN_LOCK = 0x00000008, _
	$SCMAN_QUERY_LOCK_STATUS = 0x00000010, _
	$SCMAN_MODIFY_BOOT_CONFIG = 0x00000020

Global $SVC_ALL_ACCESS = BitOR( $STANDARD_RIGHTS, 0x000001FF )
Global Const $SVC_QUERY_CONFIG = 0x00000001, _
	$SVC_CHANGE_CONFIG = 0x00000002, _
	$SVC_QUERY_STATUS = 0x00000004, _
	$SVC_ENUMERATE_DEPENDENTS = 0x00000008, _
	$SVC_START = 0x00000010, _
	$SVC_STOP = 0x00000020, _
	$SVC_PAUSE_CONTINUE = 0x00000040, _
	$SVC_INTERROGATE = 0x00000080, _
	$SVC_USER_DEFINED_CONTROL = 0x00000100

Global Const $SVC_CONTROL_STOP = 0x00000001, _
	$SVC_CONTROL_PAUSE = 0x00000002, _
	$SVC_CONTROL_INTERROGATE = 0x00000004

Global Const $SVC_KERNEL_DRIVER = 0x00000001, _
	$SVC_FILE_SYSTEM_DRIVER = 0x00000002, _
	$SVC_ADAPTER = 0x00000004, _
	$SVC_RECOGNIZER_DRIVER = 0x00000008, _
	$SVC_WIN32_OWN_PROCESS = 0x00000010, _
	$SVC_WIN32_SHARE_PROCESS = 0x00000020, _
	$SVC_INTERACTIVE_PROCESS = 0x100

Global Enum $SVC_BOOT_START, _
	$SVC_SYSTEM_START, _
	$SVC_AUTO_START, _
	$SVC_DEMAND_START, _
	$SVC_DISABLED

Global Enum $SVC_ERROR_IGNORE, _
	$SVC_ERROR_NORMAL, _
	$SVC_ERROR_SEVERE, _
	$SVC_ERROR_CRITICAL

;===============================================================================
; Description: Starts a service on a computer
;===============================================================================
Func _StartService($hService, $sComputerName = "")
	Local $vRet = DllCall("advapi32.dll", "int", "StartService", "handle", $hService, "long", 0, "str", "")
	If Not IsArray( $vRet ) Or Not $vRet[0] Then _
		$vRet = _GetServiceError()

	Return $vRet[0]
EndFunc

;===============================================================================
; Description: Stops a service on a computer
;===============================================================================
Func _StopService($hService, $sComputerName = "")
	Local $vRet = DllCall("advapi32.dll", "int", "ControlService", "handle", $hService, "long", $SVC_CONTROL_STOP, "str", "")
	If Not IsArray( $vRet ) Or Not $vRet[0] Then _
		$vRet = _GetServiceError()

	Return $vRet[0]
EndFunc

;===============================================================================
; Description: Checks if a service is running on a computer
;===============================================================================
Func _ServiceRunning($hService, $sComputerName = "")
	Local $vRet = DllCall("advapi32.dll", "int", "ControlService", "handle", $hService, "long", $SVC_CONTROL_INTERROGATE, "str", "")
	If Not IsArray( $vRet ) Then _
		$vRet = Null

   Return $vRet[0]
EndFunc

;===============================================================================
; Description: Deletes a service on a computer
;===============================================================================
Func _DeleteService($hService, $sComputerName = "")
	Local $vRet = DllCall("advapi32.dll", "int", "DeleteService", "handle", $hService)
	If Not IsArray( $vRet ) Or Not $vRet[0] Then _
		$vRet = _GetServiceError()

	Return $vRet[0]
EndFunc

;===============================================================================
; Description: Creates a service on a computer
;===============================================================================
Func _CreateService($hSCMan, $sServiceName, $sDisplayName, $iDesiredAccess, $iType, $iStartType, $iErrorControl, $sPath)
	Local $vRet = DllCall("advapi32.dll", "handle", "CreateService", "handle", $hSCMan, "str", $sServiceName, "str", $sDisplayName, "dword", $iDesiredAccess, _
		"dword", $iType, "dword", $iStartType, "dword", $iErrorControl, "str", $sPath, "ptr", 0, "ptr", 0, "ptr", 0, "ptr", 0, "ptr", 0 )
	If Not IsArray( $vRet ) Or Not $vRet[0] Then _
		$vRet = _GetServiceError()

	Return $vRet[0]
EndFunc

Func _OpenSCManager($sComputerName, $iDesiredAccess)
	Local $vRet = DllCall( "advapi32.dll", "handle", "OpenSCManager", "str", $sComputerName, "str", "ServicesActive", "dword", $iDesiredAccess )
	If IsArray( $vRet ) Then _
		Return $vRet[0]

	Return Null
EndFunc ;==> OpenSCManager

Func _OpenService($hSCMan, $sServiceName, $iDesiredAccess)
	Local $vRet = DllCall( "advapi32.dll", "handle", "OpenService", "handle", $hSCMan, "str", $sServiceName, "dword", $iDesiredAccess )
	If IsArray( $vRet ) Then _
		Return $vRet[0]

	Return Null
EndFunc ;==> OpenService

Func _CloseServiceHandle($hSCObject)
	Local $vRet = DllCall( "advapi32.dll", "int", "CloseServiceHandle", "handle", $hSCObject )
	If IsArray( $vRet ) Then _
		Return $vRet[0]

	Return Null
EndFunc ;==> CloseServiceHandle

Func _GetServiceError($iType=0)
	Local $aRet = DllCall("kernel32.dll", "long", "GetLastError")
	$aRet[0] *= -1
	If $iType Then $aRet = $aRet[0]

	Return $aRet
EndFunc

Func _IsServiceFail($vRet)
	Return ( IsInt( $vRet ) And ( $vRet < 0 ) )
EndFunc
 
Верх