Автор Тема: Запуск/остановка системной службы  (Прочитано 12326 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн arfey [?]

  • Новичок
  • *
  • Сообщений: 25
  • Репутация: 2
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.10.2
Подскажите, как возможностями AutoIt запустить и остановить системную службу?

Русское сообщество AutoIt

Запуск/остановка системной службы
« Отправлен: Октябрь 28, 2009, 03:15:52 »

Оффлайн amel27 [?]

  • VIP
  • *
  • Сообщений: 146
  • Репутация: 55
  • Пол: Мужской
    • Награды
Re: Запуск/остановка системной службы
« Ответ #1, Отправлен: Октябрь 28, 2009, 04:00:02 »
Подскажите, как возможностями AutoIt запустить и остановить системную службу?

Код: AutoIt [Выделить]
Func _Service_Start($sService, $Computer = ".")
  Local $objWMI = ObjGet("winmgmts:\\" & $Computer & "\root\cimv2")
  If Not(IsObj($objWMI)) Then Return SetError(-2)
  Local $strQuery = "Select * from Win32_Service Where State = 'Stopped' And " & _
      "Mame Like '"& $sService & "'"
  Local $colItems = $objWMI.ExecQuery($strQuery)
  If Not(IsObj($colItems)) Then Return SetError(-2)

  For $objItem in $colItems
    Return $objItem.StartService($objItem.Name)
  Next
  Return SetError(-1)
EndFunc   ;==> _Service_Start()

Func _Service_Stop($sService, $Computer = ".")
  Local $objWMI = ObjGet("winmgmts:\\" & $Computer & "\root\cimv2")
  If Not(IsObj($objWMI)) Then Return SetError(-2)
  Local $strQuery = "Select * from Win32_Service Where State = 'Running' And " & _
      "name like '"& $sService &"'"
  Local $colItems = $objWMI.ExecQuery($strQuery)
  If Not(IsObj($colItems)) Then Return SetError(-2)

  For $objItem In $colItems
    Return $objItem.StopService($objItem.Name)
  Next
  Return SetError(-1)
EndFunc  ;==> _Service_Stop()
 


при успехе возвращается 0, иначе:
Цитировать
0   Success
1   Not Supported
2   Access Denied
3   Dependent Services Running
4   Invalid Service Control
5   Service Cannot Accept Control
6   Service Not Active
7   Service Request Timeout
8   Unknown Failure
9   Path Not Found
10   Service Already Running
11   Service Database Locked
12   Service Dependency Deleted
13   Service Dependency Failure
14   Service Disabled
15   Service Logon Failure
16   Service Marked For Deletion
17    Service No Thread
18   Status Circular Dependency
19   Status Duplicate Name
20   Status Invalid Name
21   Status Invalid Parameter
22   Status Invalid Service Account
23   Status Service Exists
24   Service Already Paused

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7809
  • Репутация: 2281
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Re: Запуск/остановка системной службы
« Ответ #2, Отправлен: Октябрь 28, 2009, 04:27:56 »
Вариант через системную net:

Код: AutoIt [Выделить]
$aRet_Info = _Service_Proc("iPod Service", "stop")
$sFoematted_Info = StringFormat("Std Out Return:\t%s\nStd Error Return:\t%s\n", $aRet_Info[0], $aRet_Info[1])
MsgBox(64, 'Title', $sFoematted_Info)

$aRet_Info = _Service_Proc("iPod Service", "start")
$sFoematted_Info = StringFormat("Std Out Return:\t%s\nStd Error Return:\t%s\n", $aRet_Info[0], $aRet_Info[1])
MsgBox(64, 'Title', $sFoematted_Info)

Func _Service_Proc($sService, $sAction)
    Local $iPID = Run('net ' & $sAction & ' "' & $sService & '"', '', @SW_HIDE, 2 + 4)
    Local $sStdRead, $sStdErrRead, $stBuffer, $aRet, $aRet[2]
   
    While 1
        $sStdRead &= StdoutRead($iPID)
        If @error Then ExitLoop
       
        $sStdErrRead &= StderrRead($iPID)
        If @error Then ExitLoop
    WEnd
   
    $aRet[0] = $sStdRead
    $aRet[1] = $sStdErrRead
   
    For $i = 0 To 1
        $stBuffer = DllStructCreate("char[" & StringLen($aRet[$i])+1 & "]")
        $aOemToChar = DllCall("User32.dll", "int", "OemToChar", "str", $aRet[$i], "ptr", DllStructGetPtr($stBuffer))
       
        If Not IsArray($aOemToChar) Then ContinueLoop ;ошибка DLL
        If $aOemToChar[0] = 0 Then ContinueLoop ;ошибка функции
       
        $aRet[$i] = DllStructGetData($stBuffer, 1)
    Next
   
    Return $aRet
EndFunc



Добавлено: Октябрь 28, 2009, 04:31:13
amel27 [?]
Цитировать
при успехе возвращается 0, иначе:
У меня возвращает 1 при попытке запустить только что остановленную службу :(


Правила, Поиск, Супер тема


AutoIt is simple, subtle, elegant.


«Не оказываю тех. поддержку через ПМ/ICQ, и по электронной почте - для этого есть форум. (C)»
«Законы Мэрфи неоспоримы!»


Мои работы

Оффлайн r35p3ct [?]

  • Продвинутый
  • ***
  • Сообщений: 222
  • Репутация: 60
  • Пол: Мужской
    • Награды
Re: Запуск/остановка системной службы
« Ответ #3, Отправлен: Октябрь 28, 2009, 12:21:37 »
Незнаю сильно ли отличается от примеров выше, _WinServices UDF
UPD:
Код: AutoIt [Выделить]
#cs ----------------------------------------------------------------------------

 AutoIt Version         :   3.3.0.0
 Author                 :   Sriptonize
 File name              :   _WinServices.au3
 UDF Version            :   1.3
 Updated on             :   21-08-2009 (dd-mm-yyyy)

 Function(s)            :   _IsPossiblePauseService($nService)
                            _IsPossibleStopService($nService)
                            _IsServiceState($nService,$nServiceState)
                            _PauseService($nService)
                            _ServiceExists($nService)
                            _StartService($nService)
                            _StopService($nService)

 Requirements           :   WindowsXP Pro, SP-3 (other OS versions and/or service-packs may work, but havn't been tested)

 Source                 :   http://msdn.microsoft.com

#ce ----------------------------------------------------------------------------

#include-once
Global $DebugMode = 0

Func _IsPossiblePauseService($nService)
#cs ----------------------------------------------------------------------------
 AutoIt Version         :   3.3.0.0
 Author                 :   Sriptonize
 UDF Version            :   1.3
 Updated on             :   21-08-2009 (dd-mm-yyyy)

 Function               :   Checks if a service can be paused

 Return values          :     0 (It is possible to set this service in a pause state)
                              1 (It is not possible to set this service in a pause state)
                            110 (Object error: Not an Object)

 Requirements           :   WindowsXP Pro, SP-3 (other OS versions and/or service-packs may work, but havn't been tested)

 Source                 :   http://msdn.microsoft.com
#ce ----------------------------------------------------------------------------


    Local $objWMIService            ; Main object
    Local $objQueryCollection       ; Result of query
    Local $hObj                     ; Current selected Object in $objQueryCollection

    If $DebugMode = 1 Then ConsoleWrite(@CR)
    If $DebugMode = 1 Then ConsoleWrite("_IsPossiblePauseService($nService)" & @CR)
    If $DebugMode = 1 Then ConsoleWrite("_IsPossiblePauseService($nService)=  " & $nService & @CR)

    ;Before proceeding, first check if the service exists
    If  _ServiceExists($nService) = -1 Then
        Return 4
    EndIf


    $objWMIService = ObjGet("winmgmts:\\" & @ComputerName & "\root\CIMV2")
    If IsObj($objWMIService) then
        If $DebugMode = 1 Then ConsoleWrite("$objWMIService is an Object" & @CR)
        $objQueryCollection = $objWMIService.ExecQuery("SELECT * FROM Win32_Service Where AcceptPause = True AND Where Name = '" & $nService & "'")
    Else
        Return 110
    EndIf

    If IsObj($objQueryCollection) then
        If $DebugMode = 1 Then ConsoleWrite("Collection returned by Query on $objWMIService)" & @CR)

        For $hObj In $objQueryCollection
            If $hObj.Name = $nService Then                  ;If we have found the service and the service can be paused, return 0
                If $DebugMode = 1 Then ConsoleWrite("Current $objWMIService.Name= " & $objWMIService.Name() & " Current $objWMIService.AcceptPause= " & $objWMIService.AcceptPause() & " Returning 0" & @CR)
                Return 0                                    ;If we have found the service and the service can be paused, return 0
            Else
                If $DebugMode = 1 Then ConsoleWrite("Current $objWMIService.Name= " & $objWMIService.Name() & " Current $objWMIService.AcceptPause= " & $objWMIService.AcceptPause() & " Returning 1" & @CR)
                Return 1
            EndIf
        Next                                                ;$hObj In $objQueryCollection
    Else
        Return 110                                          ;Obj error
    EndIf

EndFunc

Func _IsPossibleStopService($nService)
#cs ----------------------------------------------------------------------------
 AutoIt Version         :   3.3.0.0
 Author                 :   Sriptonize
 UDF Version            :   1.3
 Updated on             :   21-08-2009 (dd-mm-yyyy)

 Function               :   Checks if a service can be stopped

 Return values          :     0 (It is possible to set this service in a stopped state)
                              1 (It is not possible to set this service in a stopped state)
                            110 (Object error: Not an Object)

 Requirements           :   WindowsXP Pro, SP-3 (other OS versions and/or service-packs may work, but havn't been tested)

 Source                 :   http://msdn.microsoft.com
#ce ----------------------------------------------------------------------------


    Local $objWMIService            ; Main object
    Local $objQueryCollection       ; Result of query
    Local $hObj                     ; Current selected Object in $objQueryCollection

    If $DebugMode = 1 Then ConsoleWrite(@CR)
    If $DebugMode = 1 Then ConsoleWrite("_IsPossibleStopService($nService)" & @CR)
    If $DebugMode = 1 Then ConsoleWrite("_IsPossibleStopService($nService)=  " & $nService & @CR)

    ;Before proceeding, first check if the service exists
    If  _ServiceExists($nService) = -1 Then
        Return 4
    EndIf

    $objWMIService = ObjGet("winmgmts:\\" & @ComputerName & "\root\CIMV2")
    If IsObj($objWMIService) then
        If $DebugMode = 1 Then ConsoleWrite("$objWMIService is an Object" & @CR)
        $objQueryCollection = $objWMIService.ExecQuery("SELECT * FROM Win32_Service Where AcceptStop = True AND Where Name = '" & $nService & "'")
    Else
        Return 110
    EndIf

    If IsObj($objQueryCollection) then
        If $DebugMode = 1 Then ConsoleWrite("Collection returned by Query on $objWMIService)" & @CR)

        For $hObj In $objQueryCollection
            If $hObj.Name = $nService Then
                If $DebugMode = 1 Then ConsoleWrite("Current $objWMIService.Name= " & $objWMIService.Name() & " Current $objWMIService.AcceptPause= " & $objWMIService.AcceptPause() & " Returning 0" & @CR)
                Return 0                                    ;If we have found the service and the service can be stopped, return 0
            Else
                If $DebugMode = 1 Then ConsoleWrite("Current $objWMIService.Name= " & $objWMIService.Name() & " Current $objWMIService.AcceptPause= " & $objWMIService.AcceptPause() & " Returning 1" & @CR)
                Return 1                                    ;the service can not be stopped, return 1
            EndIf
        Next                                                ;$hObj In $objQueryCollection
    Else
        Return 110                                          ;Obj error
    EndIf

EndFunc

Func _IsServiceState($nService,$nServiceState)
#cs ----------------------------------------------------------------------------
 AutoIt Version         :   3.3.0.0
 Author                 :   Sriptonize
 UDF Version            :   1.3
 Updated on             :   21-08-2009 (dd-mm-yyyy)

 Function               :   Checks if the state of the service equals the state as provided

 Handled Parameters for $nServiceState:
                            Stopped
                            Stopping
                            Running
                            Starting
                            Paused
                            Unknown

 Return values          :     0 (Success, service state equals the provided state)
                              1 (Failure, service state does not equal the provided state)
                            110 (Object error: Not an Object)
                            200 (Invalid state provided)

 Requirements           :   WindowsXP Pro, SP-3 (other OS versions and/or service-packs may work, but havn't been tested)

 Source                 :   http://msdn.microsoft.com
#ce ----------------------------------------------------------------------------


    Local $objWMIService            ; Main object
    Local $objQueryCollection       ; Result of query
    Local $hObj                     ; Current selected Object in $objQueryCollection

    If $DebugMode = 1 Then ConsoleWrite(@CR)
    If $DebugMode = 1 Then ConsoleWrite("_IsServiceState($nService,$nServiceState)" & @CR)
    If $DebugMode = 1 Then ConsoleWrite("_IsServiceState($nService,$nServiceState)=  " & $nService & "," & $nServiceState & @CR)

    ;Before proceeding, first check if the service exists
    If  _ServiceExists($nService) = -1 Then
        Return 4
    EndIf

    ;Check input...
    Select
        Case $nServiceState = "Stopped"

        Case $nServiceState = "Stopping"

        Case $nServiceState = "Running"

        Case $nServiceState = "Starting"

        Case $nServiceState = "Paused"

        Case $nServiceState = "Unknown"

        Case Else
            Return 200
    EndSelect

    $objWMIService = ObjGet("winmgmts:\\" & @ComputerName & "\root\CIMV2")
    If IsObj($objWMIService) then
        If $DebugMode = 1 Then ConsoleWrite("$objWMIService is an Object" & @CR)
        $objQueryCollection = $objWMIService.ExecQuery("SELECT * FROM Win32_Service Where Name = '" & $nService & "'")
    Else
        Return 110
    EndIf

    If IsObj($objQueryCollection) then
        If $DebugMode = 1 Then ConsoleWrite("Collection returned by Query on $objWMIService)" & @CR)
        For $hObj In $objQueryCollection
            If $hObj.Name = $nService Then
                If $DebugMode = 1 Then ConsoleWrite("Current value of $hObj.Name= '" & $hObj.Name & "' Proceeding with state" & @CR)
                If $hObj.State = $nServiceState Then                                    ;If the service is in the correct state return 0
                    If $DebugMode = 1 Then ConsoleWrite("Current value of $hObj.State= '" & $hObj.State & "' Returning 0" & @CR)
                    Return 0
                Else
                    If $DebugMode = 1 Then ConsoleWrite("Current value of $hObj.State= '" & $hObj.State & "' Returning -1" & @CR)
                    Return -1
                EndIf
            EndIf

        Next ;<== $hObj In $objQueryCollection
    Else
        Return 110
    EndIf

EndFunc

Func _PauseService($nService)
#cs ----------------------------------------------------------------------------
 AutoIt Version         :   3.3.0.0
 Author                 :   Sriptonize
 UDF Version            :   1.3
 Updated on             :   21-08-2009 (dd-mm-yyyy)
 Function               :   Starts a service

 Return values          :     0 (Success)
                              1 (Not supported)
                              2 (Access denied)
                              3 (Dependend services running)
                              4 (Invalid service control)
                              5 (Service cannot accept control)
                              6 (Service not active)
                              7 (Servie request timeout)
                              8 (Unknown failure)
                              9 (path not found)
                             10 (service allready running)
                             11 (Service database locked)
                             12 (Service dependency deleted)
                             13 (Service dependency failure)
                             14 (Service disabled)
                             15 (Service logon failure)
                             16 (Service marked for deletion)
                             17 (Service no thread)
                             18 (Status circular dependency)
                             19 (Status duplicate name)
                             20 (Status invalid name)
                             21 (Status invalid parameter)
                             22 (Status invalid service account)
                             23 (Status service exists)
                             24 (service already paused)
                            100 (Object error)
                            110 (Object error: Not an Object)
#ce ----------------------------------------------------------------------------



    Local $objWMIService            ; Main object
    Local $objQueryCollection       ; Result of query
    Local $hObj                     ; Current selected Object in $objQueryCollection

    Local $hErr,$hResult,$i

    If $DebugMode = 1 Then ConsoleWrite(@CR)
    If $DebugMode = 1 Then ConsoleWrite("_PauseService($nService)" & @CR)
    If $DebugMode = 1 Then ConsoleWrite("_PauseService($nService)=  " & $nService & @CR)

    ;Before proceeding, first check if the service exists
    If _ServiceExists($nService) = -1 Then
        Return 4
    EndIf

    ;If service does exists start the service
    $objWMIService = ObjGet("winmgmts:\\" & @ComputerName & "\root\CIMV2")
    If IsObj($objWMIService) Then
        If $DebugMode = 1 Then ConsoleWrite("$objWMIService is an Object" & @CR)
            $objQueryCollection = $objWMIService.ExecQuery("SELECT * FROM Win32_Service Where Name = '" & $nService & "'")

        If IsObj($objQueryCollection) Then
            If $DebugMode = 1 Then ConsoleWrite("Collection returned by Query on $objWMIService)" & @CR)

            ;Try to pause the service
            For $hObj In $objQueryCollection
                $hResult = $hObj.PauseService()
                $hErr = @error
                If $DebugMode = 1 Then ConsoleWrite("$hObj.PauseService()= " & $hResult & @CR)
                If $DebugMode = 1 Then ConsoleWrite("@error= " & $hErr & @CR)
                ;Give the service some time to pause...
                For $i = 1 to 10
                    Sleep(100)
                Next
                Return $hErr
            Next
        Else
            Return 100
        EndIf
    Else
        Return 110
    EndIf

EndFunc

Func _ResumeService($nService)
#cs ----------------------------------------------------------------------------
 AutoIt Version         :   3.3.0.0
 Author                 :   Sriptonize
 UDF Version            :   1.3
 Updated on             :   21-08-2009 (dd-mm-yyyy)
 Function               :   Starts a service

 Return values          :     0 (Success)
                              1 (Not supported)
                              2 (Access denied)
                              3 (Dependend services running)
                              4 (Invalid service control)
                              5 (Service cannot accept control)
                              6 (Service not active)
                              7 (Servie request timeout)
                              8 (Unknown failure)
                              9 (path not found)
                             10 (service allready running)
                             11 (Service database locked)
                             12 (Service dependency deleted)
                             13 (Service dependency failure)
                             14 (Service disabled)
                             15 (Service logon failure)
                             16 (Service marked for deletion)
                             17 (Service no thread)
                             18 (Status circular dependency)
                             19 (Status duplicate name)
                             20 (Status invalid name)
                             21 (Status invalid parameter)
                             22 (Status invalid service account)
                             23 (Status service exists)
                             24 (service already paused)
                            100 (Object error)
                            110 (Object error: Not an Object)
#ce ----------------------------------------------------------------------------



    Local $objWMIService            ; Main object
    Local $objQueryCollection       ; Result of query
    Local $hObj                     ; Current selected Object in $objQueryCollection

    Local $hErr,$hResult,$i

    If $DebugMode = 1 Then ConsoleWrite(@CR)
    If $DebugMode = 1 Then ConsoleWrite("_ResumeService($nService)" & @CR)
    If $DebugMode = 1 Then ConsoleWrite("_ResumeService($nService)=  " & $nService & @CR)

    ;Before proceeding, first check if the service exists
    If _ServiceExists($nService) = -1 Then
        Return 4
    EndIf

    ;If service does exists start the service
    $objWMIService = ObjGet("winmgmts:\\" & @ComputerName & "\root\CIMV2")
    If IsObj($objWMIService) Then
        If $DebugMode = 1 Then ConsoleWrite("$objWMIService is an Object" & @CR)
            $objQueryCollection = $objWMIService.ExecQuery("SELECT * FROM Win32_Service Where Name = '" & $nService & "'")

        If IsObj($objQueryCollection) Then
            If $DebugMode = 1 Then ConsoleWrite("Collection returned by Query on $objWMIService)" & @CR)

            ;Try to resume the service
            For $hObj In $objQueryCollection
                $hResult = $hObj.ResumeService()
                $hErr = @error
                If $DebugMode = 1 Then ConsoleWrite("$hObj.ResumeService()= " & $hResult & @CR)
                If $DebugMode = 1 Then ConsoleWrite("@error= " & $hErr & @CR)
                ;Give the service some time to resume...
                For $i = 1 to 10
                    Sleep(100)
                Next
                Return $hErr
            Next
        Else
            Return 100
        EndIf
    Else
        Return 110
    EndIf

EndFunc

Func _ServiceExists($nService)
#cs ----------------------------------------------------------------------------
 AutoIt Version         :   3.3.0.0
 Author                 :   Sriptonize
 UDF Version            :   1.3
 Updated on             :   21-08-2009 (dd-mm-yyyy)

 Function               :   Checks if a service exists

 Return values          :     0 (Success, service was found)
                             -1 (Failure, service was not found)
                            110 (Object error: Not an Object)

 Requirements           :   WindowsXP Pro, SP-3 (other OS versions and/or service-packs may work, but havn't been tested)

 Source                 :   http://msdn.microsoft.com
#ce ----------------------------------------------------------------------------


    Local $objWMIService            ; Main object
    Local $objQueryCollection       ; Result of query
    Local $hObj                     ; Current selected Object in $objQueryCollection

    If $DebugMode = 1 Then ConsoleWrite(@CR)
    If $DebugMode = 1 Then ConsoleWrite("_ServiceExists($nService)" & @CR)
    If $DebugMode = 1 Then ConsoleWrite("_ServiceExists($nService)=  " & $nService & @CR)

    $objWMIService = ObjGet("winmgmts:\\" & @ComputerName & "\root\CIMV2")

    If IsObj($objWMIService) Then
        If $DebugMode = 1 Then ConsoleWrite("$objWMIService is an Object" & @CR)
        $objQueryCollection = $objWMIService.ExecQuery("SELECT * FROM Win32_Service Where Name = '" & $nService & "'")
    Else
        Return 110
    EndIf

    If IsObj($objQueryCollection) then
        If $DebugMode = 1 Then ConsoleWrite("Collection returned by Query on $objWMIService)" & @CR)

        For $hObj In $objQueryCollection
            If $hObj.Name = $nService Then Return 0     ;Service found, return 0
        Next                                            ;<== $objWMIService In $hObj
    Else
        Return 110                                      ;Obj error
    EndIf


    Return -1                                               ;Service not found, return -1

EndFunc

Func _StartService($nService)
#cs ----------------------------------------------------------------------------
 AutoIt Version         :   3.3.0.0
 Author                 :   Sriptonize
 UDF Version            :   1.3
 Updated on             :   21-08-2009 (dd-mm-yyyy)
 Function               :   Starts a service

 Return values          :     0 (Success)
                              1 (Not supported)
                              2 (Access denied)
                              3 (Dependend services running)
                              4 (Invalid service control)
                              5 (Service cannot accept control)
                              6 (Service not active)
                              7 (Servie request timeout)
                              8 (Unknown failure)
                              9 (path not found)
                             10 (service allready running)
                             11 (Service database locked)
                             12 (Service dependency deleted)
                             13 (Service dependency failure)
                             14 (Service disabled)
                             15 (Service logon failure)
                             16 (Service marked for deletion)
                             17 (Service no thread)
                             18 (Status circular dependency)
                             19 (Status duplicate name)
                             20 (Status invalid name)
                             21 (Status invalid parameter)
                             22 (Status invalid service account)
                             23 (Status service exists)
                             24 (service already paused)
                            100 (Object error)
                            110 (Object error: Not an Object)
#ce ----------------------------------------------------------------------------



    Local $objWMIService            ; Main object
    Local $objQueryCollection       ; Result of query
    Local $hObj                     ; Current selected Object in $objQueryCollection

    Local $hErr,$hResult,$i

    If $DebugMode = 1 Then ConsoleWrite(@CR)
    If $DebugMode = 1 Then ConsoleWrite("_StartService($nService)" & @CR)
    If $DebugMode = 1 Then ConsoleWrite("_StartService($nService)=  " & $nService & @CR)

    ;Before proceeding, first check if the service exists
    If _ServiceExists($nService) = -1 Then
        Return 4
    EndIf

    ;If service does exists start the service
    $objWMIService = ObjGet("winmgmts:\\" & @ComputerName & "\root\CIMV2")
    If IsObj($objWMIService) Then
        If $DebugMode = 1 Then ConsoleWrite("$objWMIService is an Object" & @CR)
            $objQueryCollection = $objWMIService.ExecQuery("SELECT * FROM Win32_Service Where Name = '" & $nService & "'")

        If IsObj($objQueryCollection) Then
            If $DebugMode = 1 Then ConsoleWrite("Collection returned by Query on $objWMIService)" & @CR)

            ;Try to start the service
            For $hObj In $objQueryCollection
                $hResult = $hObj.StartService()
                $hErr = @error
                If $DebugMode = 1 Then ConsoleWrite("$hObj.StartService()= " & $hResult & @CR)
                If $DebugMode = 1 Then ConsoleWrite("@error= " & $hErr & @CR)
                ;Give the service some time to start up...
                For $i = 1 to 10
                    Sleep(100)
                Next
                Return $hErr
            Next
        Else
            Return 100
        EndIf
    Else
        Return 110
    EndIf

EndFunc

Func _StopService($nService)
#cs ----------------------------------------------------------------------------
 AutoIt Version         :   3.3.0.0
 Author                 :   Sriptonize
 UDF Version            :   1.3
 Updated on             :   21-08-2009 (dd-mm-yyyy)
 Function               :   Stops a service

 Return values          :     0 (Success)
                              1 (Not supported)
                              2 (Access denied)
                              3 (Dependend services running)
                              4 (Invalid service control)
                              5 (Service cannot accept control)
                              6 (Service not active)
                              7 (Servie request timeout)
                              8 (Unknown failure)
                              9 (path not found)
                             10 (service allready running)
                             11 (Service database locked)
                             12 (Service dependency deleted)
                             13 (Service dependency failure)
                             14 (Service disabled)
                             15 (Service logon failure)
                             16 (Service marked for deletion)
                             17 (Service no thread)
                             18 (Status circular dependency)
                             19 (Status duplicate name)
                             20 (Status invalid name)
                             21 (Status invalid parameter)
                             22 (Status invalid service account)
                             23 (Status service exists)
                             24 (service already paused)
                            100 (Object error)
                            110 (Object error: Not an Object)
#ce ----------------------------------------------------------------------------



    Local $objWMIService            ; Main object
    Local $objQueryCollection       ; Result of query
    Local $hObj                     ; Current selected Object in $objQueryCollection

    Local $hErr,$hResult,$i

    If $DebugMode = 1 Then ConsoleWrite(@CR)
    If $DebugMode = 1 Then ConsoleWrite("_StopService($nService)" & @CR)
    If $DebugMode = 1 Then ConsoleWrite("_StopService($nService)=  " & $nService & @CR)

    ;Before proceeding, first check if the service exists
    If _ServiceExists($nService) = -1 Then
        Return 4
    EndIf

    ;If service does exists stop the service
    $objWMIService = ObjGet("winmgmts:\\" & @ComputerName & "\root\CIMV2")
    If IsObj($objWMIService) Then
        If $DebugMode = 1 Then ConsoleWrite("$objWMIService is an Object" & @CR)
            $objQueryCollection = $objWMIService.ExecQuery("SELECT * FROM Win32_Service Where Name = '" & $nService & "'")

        If IsObj($objQueryCollection) Then
            If $DebugMode = 1 Then ConsoleWrite("Collection returned by Query on $objWMIService)" & @CR)

            ;Try to start the service
            For $hObj In $objQueryCollection
                $hResult = $hObj.StopService()
                $hErr = @error
                If $DebugMode = 1 Then ConsoleWrite("$hObj.StopService()= " & $hResult & @CR)
                If $DebugMode = 1 Then ConsoleWrite("@error= " & $hErr & @CR)
                ;Give the service some time to stop...
                For $i = 1 to 10
                    Sleep(100)
                Next
                Return $hErr
            Next
        Else
            Return 100
        EndIf
    Else
        Return 110
    EndIf

EndFunc
 

_StartService($nService)
_StopService($nService)
« Последнее редактирование: Октябрь 28, 2009, 13:36:35 от r35p3ct »

Русское сообщество AutoIt

Re: Запуск/остановка системной службы
« Ответ #3 Отправлен: Октябрь 28, 2009, 12:21:37 »

Оффлайн arfey [?]

  • Новичок
  • *
  • Сообщений: 25

  • Автор темы
  • Репутация: 2
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.10.2
Re: Запуск/остановка системной службы
« Ответ #4, Отправлен: Октябрь 28, 2009, 13:24:46 »
Можно оперировать простыми функциями?
Если бы я понимал команды DLL*, то не спрашивал бы.

Пост с использованием Obj мне вообще непонятен, так как прочитав его эдак раз 5, пришел к выводу, что из-за неописанных переменных он работать не будет. К примеру в autoit команды "StopService" нет.

Извините за мою требовательность.

Оффлайн r35p3ct [?]

  • Продвинутый
  • ***
  • Сообщений: 222
  • Репутация: 60
  • Пол: Мужской
    • Награды
Re: Запуск/остановка системной службы
« Ответ #5, Отправлен: Октябрь 28, 2009, 13:37:52 »
В моем посте как раз как ты хочешь.

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7809
  • Репутация: 2281
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Re: Запуск/остановка системной службы
« Ответ #6, Отправлен: Октябрь 28, 2009, 13:39:05 »
arfey [?]
Цитировать
Можно оперировать простыми функциями?
А чем не простые функций выше?

Цитировать
Пост с использованием Obj мне вообще непонятен, так как прочитав его эдак раз 5, пришел к выводу, что из-за неописанных переменных он работать не будет.
А проверить? Ну а код с net, тоже не подходит?

Оффлайн arfey [?]

  • Новичок
  • *
  • Сообщений: 25

  • Автор темы
  • Репутация: 2
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.10.2
Re: Запуск/остановка системной службы
« Ответ #7, Отправлен: Октябрь 28, 2009, 15:19:29 »
Первый код не работает на win7 x64.
Второй код похоже функционален, только на платформе "семерки" х64 ему смерть из-за прав доступа.

net и sc так же спотыкаются о права доступа. Но так как код пишется под ХР 32-bit, то подобная чепуха с правами отпадает сама-собой.

Объяснять каждую строку кода мне никто не будет, а понимание работы к примеру DllStructCreate с неба не придет.

2 r35p3ct:
Извини, но код слишком огромен.

Спасибо за предложенные варианты и извините за многословие. Похоже я был слишком наивен в своем вопросе.

Русское сообщество AutoIt

Re: Запуск/остановка системной службы
« Ответ #7 Отправлен: Октябрь 28, 2009, 15:19:29 »

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7809
  • Репутация: 2281
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Re: Запуск/остановка системной службы
« Ответ #8, Отправлен: Октябрь 28, 2009, 15:25:30 »
arfey [?]
Цитировать
так как код пишется под ХР 32-bit, то подобная чепуха с правами отпадает сама-собой.
Ну так в чём проблема?

Цитировать
Объяснять каждую строку кода мне никто не будет, а понимание работы к примеру DllStructCreate с неба не придет.
А зачем это понимать? в моём примере оно используется лишь для конвертирования строки в OEM возвращаемоей с консоли (net).

Оффлайн amel27 [?]

  • VIP
  • *
  • Сообщений: 146
  • Репутация: 55
  • Пол: Мужской
    • Награды
Re: Запуск/остановка системной службы
« Ответ #9, Отправлен: Октябрь 29, 2009, 11:14:28 »
Первый код не работает на win7 x64.
Второй код похоже функционален, только на платформе "семерки" х64 ему смерть из-за прав доступа.

net и sc так же спотыкаются о права доступа.
не путайте задачи администрирования ОС и программирования – одно не заменяет другое… если прав нет, их надо просто предоставить, а не пытаться “обмануть” систему безопасности

В моем посте как раз как ты хочешь.
в моём посте практически то же самое (сравни код)

У меня возвращает 1 при попытке запустить только что остановленную службу
аналог твоей UDF на WMI, но для работы требуется установка перехвата COM ошибок...
в любом случае, при работе с WMI это крайне желательно:

Код: AutoIt [Выделить]
$oServiceErrorHandler = ObjEvent("AutoIt.Error", "_Service_ErrorHandler")

_Service_WaitSetState("alerter", "Stop")
_Service_WaitSetState("alerter", "Start")

Func _Service_WaitSetState($sService, $sState, $iTimeout = -1, $sComputer = ".")
  Local $iRet, $iState, $oEventSource, $oEvent, $iState=-1
  Local Const $aSets[4][4] = [ _
    ["Start" , "StartService" , "Stopped", "Running"], _
    ["Stop"  , "StopService"  , "Running", "Stopped"], _
    ["Resume", "ResumeService", "Paused" , "Running"], _
    ["Pause" , "PauseService" , "Running", "Paused" ]]
  For $i=0 To 3
    If $sState=$aSets[$i][0] Then $iState=$i
  Next
  If $iState<0 Then Return SetError(1, 0, False) ; Ошибка: Недопустимое состояние
  If $iTimeout >0 Then $iTimeout*=1000
  If $iTimeout<=0 Then $iTimeout=-1

  Local $oWMI = ObjGet("winmgmts:\\" & $sComputer & "\root\cimv2")
  If Not(IsObj($oWMI)) Then Return SetError(5, 1, False) ; Ошибка WMI
  Local $sQuery = "Select * From Win32_Service Where Name='"& $sService &"'"
  Local $sNotify= "Select * From __InstanceModificationEvent Within 5 " & _
    "Where TargetInstance ISA 'Win32_Service' AND TargetInstance.Name='"& _
    $sService &"' AND TargetInstance.State='"& $aSets[$iState][3] &"'"
  Local $cItems = $oWMI.ExecQuery($sQuery)
  If Not(IsObj($cItems)) Then Return SetError(5, 2, False) ; Ошибка WMI

  For $oItem In $cItems
    If $oItem.State = $aSets[$iState][3] Then Return True ; Сервис уже в нужном состоянии
    If $oItem.State <>$aSets[$iState][2] Then Return SetError(3, 0, False) ; Недопустимое исходное состояние
    $oEventSource = $oWMI.ExecNotificationQuery($sNotify)
    If Not(IsObj($oEventSource)) Then Return SetError(5, 3, False) ; Ошибка WMI
   
    $iRet = Execute("$oItem."& $aSets[$iState][1])
    If $iRet Then Return SetError(4, $iRet, False) ; Cервис вернул ошибку
    $oEvent = $oEventSource.NextEvent($iTimeout)
    If IsObj($oEvent) Then Return True ; Сервис переверен в нужное состояние
    Return SetError(1, 0, False) ; Ошибка таймаута
  Next
  Return SetError(2, 0, False) ; Ошибка: сервис не найден
EndFunc  ;==> _Service_WaitSetState

Func _Service_ErrorHandler()
    SetError(5, $oServiceErrorHandler.Number)
EndFunc   ;==> _Service_ErrorHandler()


Оффлайн madmasles [?]

  • Глобальный модератор
  • *
  • Сообщений: 7790
  • Репутация: 2314
  • Пол: Мужской
  • Награды За модерирование форума
    • Награды
  • Версия AutoIt: 3.3.x.x
Re: Запуск/остановка системной службы
« Ответ #10, Отправлен: Ноябрь 30, 2009, 02:04:28 »
Объясните, пожалуйста, начинающему. Если мне надо остановить или запустить spoolsv.exe, $nService = что?, $sService = что?, alerter= что? Если у меня локальный компьютер, то $Computer = "." (что должно быть вместо *).
Очень надо.

Оффлайн sirin [?]

  • Новичок
  • *
  • Сообщений: 1
  • Репутация: 0
  • Пол: Мужской
    • Награды
Re: Запуск/остановка системной службы
« Ответ #11, Отправлен: Ноябрь 20, 2013, 11:39:52 »
не поверите:

RunWait(@ComSpec & ' /C Net Stop NameService')
RunWait(@ComSpec & ' /C Net Start NameService')

ссылка:http://forum.oszone.net/thread-200940.html [nonactive]

Оффлайн madmasles [?]

  • Глобальный модератор
  • *
  • Сообщений: 7790
  • Репутация: 2314
  • Пол: Мужской
  • Награды За модерирование форума
    • Награды
  • Версия AutoIt: 3.3.x.x
Re: Запуск/остановка системной службы
« Ответ #12, Отправлен: Ноябрь 20, 2013, 12:46:46 »
sirin,
Не занимайтесь некрофилией и плюс:
ПредупреждениеЗа нарушение правил форума (пункт В.11):
Цитировать
Любые отрывки AutoIt кода необходимо заключать в тег [autoit] (подробнее), а обычный код соответственно в тег [code] (подробнее). Также большие выдержки текста помещайте под тег [spoiler] (подробнее), там где это поддерживается естественно. Как в случае с названием темы, также короткое и эргономичное сообщение привлекает больше внимания, и шансы на получение конкретного ответа увеличиваются.


С уважением, ваш Глобальный модератор.

OffTopicPS
Если это ответ на мой вопрос, то, если Вы считаете, что за 4 года я не научился останавливать(запускать) службы, Вы ошибаетесь.
« Последнее редактирование: Ноябрь 20, 2013, 14:24:13 от madmasles »

Оффлайн БлагоѨръ [?]

  • НОД Украина
  • Новичок
  • *
  • Сообщений: 26
  • Репутация: 0
  • Пол: Мужской
  • Русь Великая, Очнись! Поднимись с колен Родная!
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Запуск/остановка системной службы
« Ответ #13, Отправлен: Ноябрь 14, 2017, 22:32:10 »
amel27
а если _Service_Start @error выдаёт "-1", то это воспринимать как "1" или ...?

И если "1", то не поддерживается - значит для определённой службы или для ОС?
ПС. Windows 7 x64


Маленький "косяк", вместо Name Like написано Mame Like
Поправил с переводом каретки для запуска/завершения множества служб:
Код: AutoIt [Выделить]
Func _Service_Start($sService, $Computer = ".")
  ConsoleWrite($sService & @CRLF)
  Local $objWMI = ObjGet("winmgmts:\\" & $Computer & "\root\cimv2")
  If Not(IsObj($objWMI)) Then Return SetError(-2)
  Local $strQuery = "Select * from Win32_Service Where State = 'Stopped' And " & _
      "Name Like '"& $sService & "'"
  Local $colItems = $objWMI.ExecQuery($strQuery)
  If Not(IsObj($colItems)) Then Return SetError(-2)

  For $objItem in $colItems
    Return $objItem.StartService($objItem.Name)
  Next
  Return SetError(-1)
EndFunc   ;==> _Service_Start()

Func _Service_Stop($sService, $Computer = ".")
  ConsoleWrite($sService & @CRLF)
  Local $objWMI = ObjGet("winmgmts:\\" & $Computer & "\root\cimv2")
  If Not(IsObj($objWMI)) Then Return SetError(-2)
  Local $strQuery = "Select * from Win32_Service Where State = 'Running' And " & _
      "name like '"& $sService &"'"
  Local $colItems = $objWMI.ExecQuery($strQuery)
  If Not(IsObj($colItems)) Then Return SetError(-2)

  For $objItem In $colItems
    Return $objItem.StopService($objItem.Name)
  Next
  Return SetError(-1)
EndFunc  ;==> _Service_Stop()
 

« Последнее редактирование: Ноябрь 23, 2017, 16:06:29 от БлагоѨръ »
Русскую Землю ногами пиная,
Помни фашист про 9 Мая!

Русское сообщество AutoIt

Re: Запуск/остановка системной службы
« Ответ #13 Отправлен: Ноябрь 14, 2017, 22:32:10 »

 

Похожие темы

  Тема / Автор Ответов Последний ответ
1 Ответов
5642 Просмотров
Последний ответ Декабрь 21, 2010, 15:37:39
от FoxTiM
4 Ответов
3242 Просмотров
Последний ответ Декабрь 12, 2011, 21:51:17
от Zaramot
10 Ответов
5970 Просмотров
Последний ответ Март 22, 2012, 18:46:18
от snoitaleR
16 Ответов
3123 Просмотров
Последний ответ Сентябрь 26, 2014, 16:06:00
от benxomi
4 Ответов
782 Просмотров
Последний ответ Июнь 24, 2015, 13:42:00
от InnI
7 Ответов
1322 Просмотров
Последний ответ Ноябрь 02, 2015, 16:04:43
от Medic84
6 Ответов
941 Просмотров
Последний ответ Ноябрь 22, 2016, 11:03:32
от joiner
1 Ответов
816 Просмотров
Последний ответ Ноябрь 24, 2016, 12:46:28
от hedji
1 Ответов
294 Просмотров
Последний ответ Август 21, 2017, 23:14:39
от Garrett
2 Ответов
252 Просмотров
Последний ответ Сентябрь 02, 2017, 02:42:08
от SryMan