Dienst

  • Hi,

    habe seit einiger Zeit nichts gemacht. Bin scheinbar etwas eingerostet. Möchte gerne eines meiner Scripte als Dienst laufen lassen. Als Bsp habe ich mir dieses erstmal gebaut um den gesamten Prozess zu verstehen.
    Bsp.

    [autoit]

    #include
    #include
    #include
    #include
    ;
    $INIFILE = "C:\Dienst\Dienst_Test.ini"
    $x = 1
    ;
    While $x = 1
    If IniRead($INIFILE, "001", "Start", "NotFound") = @HOUR & ":" & @MIN & ":" & @SEC Then
    MsgBox(0, "Dienst_Test", "Jupp")
    Sleep(50)
    ;Sleep(60 * 60 * 1000); Laufzeit bei der Überwachung
    EndIf
    WEnd ; Ende Pseudo-S

    [/autoit]

    Wenn es in SciTE getestet wir läuft es. Wenn es als Dienst läuft geht es nicht. Wo liegt mein Fehler? SRVANY.exe & Instsrv.exe liegen im selben Verzeichniss.
    Habe das hier noch gemacht .

    Mfg ThomasB

    MFG ThomasB

    *
    Ich lese viel und gerne (und wenn ich alle Mahnungen durch habe, schmeiße ich sie weg)
    *

    • Offizieller Beitrag

    HI,

    [autoit]

    #include "ServiceControl.au3"
    #include "Misc.au3"
    ;#NoTrayIcon ; Kann man natürlich auch noch wegmachen :)

    [/autoit][autoit][/autoit][autoit]

    If _Singleton("MegaService", 1) = 0 Then
    MsgBox(64, "Warning", "An occurence of test is already running", 3)
    Exit
    EndIf

    [/autoit][autoit][/autoit][autoit]

    Global $pathSrvAny = "c:\Downloads\AutoIt-Skripte\Entwicklung\ForumTests\srvany.exe"
    Global $servicename = "MegaService"
    If Not _ServiceExists (@ComputerName, $servicename) And @Compiled Then
    _CreateService ("", $servicename, "Mega Skript", $pathSrvAny, "LocalSystem", "", 0x110)
    RegWrite("HKLM\SYSTEM\CurrentControlSet\Services\" & $servicename & "\Parameters", "Application", "REG_SZ", @ScriptFullPath)
    EndIf

    [/autoit][autoit][/autoit][autoit]

    While 1
    Sleep(500)
    theFunc()
    WEnd

    [/autoit][autoit][/autoit][autoit]

    Func theFunc()
    If @HOUR = 16 And @MIN = 24 And @SEC = 00 Then ; hier mal die Zeit anpassen :)
    ToolTip("Skript gestartet" & " Service An(1)Aus(0) :" & _ServiceExists (@ComputerName, $servicename), 0, 0)
    Beep(500, 5000)
    Else
    ToolTip("Skript inaktiv" & " Service An(1)Aus(0) :" & _ServiceExists (@ComputerName, $servicename), 0, 0)
    EndIf
    EndFunc ;==>theFunc

    [/autoit]

    So long,

    Mega

  • hi,

    wo komme ich die
    ServiceControl.au3
    her.

    thomas

    MFG ThomasB

    *
    Ich lese viel und gerne (und wenn ich alle Mahnungen durch habe, schmeiße ich sie weg)
    *

    • Offizieller Beitrag

    Hi,

    ich habe:

    Spoiler anzeigen
    [autoit]

    Global $STANDARD_RIGHTS_REQUIRED = 0x000F0000

    [/autoit] [autoit][/autoit] [autoit]

    ; Service Control Manager access types
    Global $SC_MANAGER_CONNECT = 0x0001
    Global $SC_MANAGER_CREATE_SERVICE = 0x0002
    Global $SC_MANAGER_ENUMERATE_SERVICE = 0x0004
    Global $SC_MANAGER_LOCK = 0x0008
    Global $SC_MANAGER_QUERY_LOCK_STATUS = 0x0010
    Global $SC_MANAGER_MODIFY_BOOT_CONFIG = 0x0020

    [/autoit] [autoit][/autoit] [autoit]

    Global $SC_MANAGER_ALL_ACCESS = BitOR($STANDARD_RIGHTS_REQUIRED, _
    $SC_MANAGER_CONNECT, _
    $SC_MANAGER_CREATE_SERVICE, _
    $SC_MANAGER_ENUMERATE_SERVICE, _
    $SC_MANAGER_LOCK, _
    $SC_MANAGER_QUERY_LOCK_STATUS, _
    $SC_MANAGER_MODIFY_BOOT_CONFIG)

    [/autoit] [autoit][/autoit] [autoit]

    ; Service access types
    Global $SERVICE_QUERY_CONFIG = 0x0001
    Global $SERVICE_CHANGE_CONFIG = 0x0002
    Global $SERVICE_QUERY_STATUS = 0x0004
    Global $SERVICE_ENUMERATE_DEPENDENTS = 0x0008
    Global $SERVICE_START = 0x0010
    Global $SERVICE_STOP = 0x0020
    Global $SERVICE_PAUSE_CONTINUE = 0x0040
    Global $SERVICE_INTERROGATE = 0x0080
    Global $SERVICE_USER_DEFINED_CONTROL = 0x0100

    [/autoit] [autoit][/autoit] [autoit]

    Global $SERVICE_ALL_ACCESS = BitOR($STANDARD_RIGHTS_REQUIRED, _
    $SERVICE_QUERY_CONFIG, _
    $SERVICE_CHANGE_CONFIG, _
    $SERVICE_QUERY_STATUS, _
    $SERVICE_ENUMERATE_DEPENDENTS, _
    $SERVICE_START, _
    $SERVICE_STOP, _
    $SERVICE_PAUSE_CONTINUE, _
    $SERVICE_INTERROGATE, _
    $SERVICE_USER_DEFINED_CONTROL)

    [/autoit] [autoit][/autoit] [autoit]

    ; Service controls
    Global $SERVICE_CONTROL_STOP = 0x00000001
    Global $SERVICE_CONTROL_PAUSE = 0x00000002
    Global $SERVICE_CONTROL_CONTINUE = 0x00000003
    Global $SERVICE_CONTROL_INTERROGATE = 0x00000004
    Global $SERVICE_CONTROL_SHUTDOWN = 0x00000005
    Global $SERVICE_CONTROL_PARAMCHANGE = 0x00000006
    Global $SERVICE_CONTROL_NETBINDADD = 0x00000007
    Global $SERVICE_CONTROL_NETBINDREMOVE = 0x00000008
    Global $SERVICE_CONTROL_NETBINDENABLE = 0x00000009
    Global $SERVICE_CONTROL_NETBINDDISABLE = 0x0000000A
    Global $SERVICE_CONTROL_DEVICEEVENT = 0x0000000B
    Global $SERVICE_CONTROL_HARDWAREPROFILECHANGE = 0x0000000C
    Global $SERVICE_CONTROL_POWEREVENT = 0x0000000D
    Global $SERVICE_CONTROL_SESSIONCHANGE = 0x0000000E

    [/autoit] [autoit][/autoit] [autoit]

    ; Service types
    Global $SERVICE_KERNEL_DRIVER = 0x00000001
    Global $SERVICE_FILE_SYSTEM_DRIVER = 0x00000002
    Global $SERVICE_ADAPTER = 0x00000004
    Global $SERVICE_RECOGNIZER_DRIVER = 0x00000008
    Global $SERVICE_DRIVER = BitOR($SERVICE_KERNEL_DRIVER, _
    $SERVICE_FILE_SYSTEM_DRIVER, _
    $SERVICE_RECOGNIZER_DRIVER)
    Global $SERVICE_WIN32_OWN_PROCESS = 0x00000010
    Global $SERVICE_WIN32_SHARE_PROCESS = 0x00000020
    Global $SERVICE_WIN32 = BitOR($SERVICE_WIN32_OWN_PROCESS, _
    $SERVICE_WIN32_SHARE_PROCESS)
    Global $SERVICE_INTERACTIVE_PROCESS = 0x00000100
    Global $SERVICE_TYPE_ALL = BitOR($SERVICE_WIN32, _
    $SERVICE_ADAPTER, _
    $SERVICE_DRIVER, _
    $SERVICE_INTERACTIVE_PROCESS)

    [/autoit] [autoit][/autoit] [autoit]

    ; Service start types
    Global $SERVICE_BOOT_START = 0x00000000
    Global $SERVICE_SYSTEM_START = 0x00000001
    Global $SERVICE_AUTO_START = 0x00000002
    Global $SERVICE_DEMAND_START = 0x00000003
    Global $SERVICE_DISABLED = 0x00000004

    [/autoit] [autoit][/autoit] [autoit]

    ; Service error control
    Global $SERVICE_ERROR_IGNORE = 0x00000000
    Global $SERVICE_ERROR_NORMAL = 0x00000001
    Global $SERVICE_ERROR_SEVERE = 0x00000002
    Global $SERVICE_ERROR_CRITICAL = 0x00000003

    [/autoit] [autoit][/autoit] [autoit]

    ;===============================================================================
    ; Description: Starts a service on a computer
    ; Parameters: $sComputerName - name of the target computer. If empty, the local computer name is used
    ; $sServiceName - name of the service to start
    ; Requirements: None
    ; Return Values: On Success - 1
    ; On Failure - 0 and @error is set to extended Windows error code
    ; Note: This function does not check to see if the service has started successfully
    ;===============================================================================
    Func _StartService($sComputerName, $sServiceName)
    Local $hAdvapi32
    Local $hKernel32
    Local $arRet
    Local $hSC
    Local $hService
    Local $lError = -1

    [/autoit] [autoit][/autoit] [autoit]

    $hAdvapi32 = DllOpen("advapi32.dll")
    If $hAdvapi32 = -1 Then Return 0
    $hKernel32 = DllOpen("kernel32.dll")
    If $hKernel32 = -1 Then Return 0
    $arRet = DllCall($hAdvapi32, "long", "OpenSCManager", _
    "str", $sComputerName, _
    "str", "ServicesActive", _
    "long", $SC_MANAGER_CONNECT)
    If $arRet[0] = 0 Then
    $arRet = DllCall($hKernel32, "long", "GetLastError")
    $lError = $arRet[0]
    Else
    $hSC = $arRet[0]
    $arRet = DllCall($hAdvapi32, "long", "OpenService", _
    "long", $hSC, _
    "str", $sServiceName, _
    "long", $SERVICE_START)
    If $arRet[0] = 0 Then
    $arRet = DllCall($hKernel32, "long", "GetLastError")
    $lError = $arRet[0]
    Else
    $hService = $arRet[0]
    $arRet = DllCall($hAdvapi32, "int", "StartService", _
    "long", $hService, _
    "long", 0, _
    "str", "")
    If $arRet[0] = 0 Then
    $arRet = DllCall($hKernel32, "long", "GetLastError")
    $lError = $arRet[0]
    EndIf
    DllCall($hAdvapi32, "int", "CloseServiceHandle", "long", $hService)
    EndIf
    DllCall($hAdvapi32, "int", "CloseServiceHandle", "long", $hSC)
    EndIf
    DllClose($hAdvapi32)
    DllClose($hKernel32)
    If $lError <> -1 Then
    SetError($lError)
    Return 0
    EndIf
    Return 1
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    ;===============================================================================
    ; Description: Stops a service on a computer
    ; Parameters: $sComputerName - name of the target computer. If empty, the local computer name is used
    ; $sServiceName - name of the service to stop
    ; Requirements: None
    ; Return Values: On Success - 1
    ; On Failure - 0 and @error is set to extended Windows error code
    ; Note: This function does not check to see if the service has stopped successfully
    ;===============================================================================
    Func _StopService($sComputerName, $sServiceName)
    Local $hAdvapi32
    Local $hKernel32
    Local $arRet
    Local $hSC
    Local $hService
    Local $lError = -1

    [/autoit] [autoit][/autoit] [autoit]

    $hAdvapi32 = DllOpen("advapi32.dll")
    If $hAdvapi32 = -1 Then Return 0
    $hKernel32 = DllOpen("kernel32.dll")
    If $hKernel32 = -1 Then Return 0
    $arRet = DllCall($hAdvapi32, "long", "OpenSCManager", _
    "str", $sComputerName, _
    "str", "ServicesActive", _
    "long", $SC_MANAGER_CONNECT)
    If $arRet[0] = 0 Then
    $arRet = DllCall($hKernel32, "long", "GetLastError")
    $lError = $arRet[0]
    Else
    $hSC = $arRet[0]
    $arRet = DllCall($hAdvapi32, "long", "OpenService", _
    "long", $hSC, _
    "str", $sServiceName, _
    "long", $SERVICE_STOP)
    If $arRet[0] = 0 Then
    $arRet = DllCall($hKernel32, "long", "GetLastError")
    $lError = $arRet[0]
    Else
    $hService = $arRet[0]
    $arRet = DllCall($hAdvapi32, "int", "ControlService", _
    "long", $hService, _
    "long", $SERVICE_CONTROL_STOP, _
    "str", "")
    If $arRet[0] = 0 Then
    $arRet = DllCall($hKernel32, "long", "GetLastError")
    $lError = $arRet[0]
    EndIf
    DllCall($hAdvapi32, "int", "CloseServiceHandle", "long", $hService)
    EndIf
    DllCall($hAdvapi32, "int", "CloseServiceHandle", "long", $hSC)
    EndIf
    DllClose($hAdvapi32)
    DllClose($hKernel32)
    If $lError <> -1 Then
    SetError($lError)
    Return 0
    EndIf
    Return 1
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    ;===============================================================================
    ; Description: Checks if a service exists on a computer
    ; Parameters: $sComputerName - name of the target computer. If empty, the local computer name is used
    ; $sServiceName - name of the service to check
    ; Requirements: None
    ; Return Values: On Success - 1
    ; On Failure - 0
    ;===============================================================================
    Func _ServiceExists($sComputerName, $sServiceName)
    Local $hAdvapi32
    Local $arRet
    Local $hSC
    Local $bExist = 0

    [/autoit] [autoit][/autoit] [autoit]

    $hAdvapi32 = DllOpen("advapi32.dll")
    If $hAdvapi32 = -1 Then Return 0
    $arRet = DllCall($hAdvapi32, "long", "OpenSCManager", _
    "str", $sComputerName, _
    "str", "ServicesActive", _
    "long", $SC_MANAGER_CONNECT)
    If $arRet[0] <> 0 Then
    $hSC = $arRet[0]
    $arRet = DllCall($hAdvapi32, "long", "OpenService", _
    "long", $hSC, _
    "str", $sServiceName, _
    "long", $SERVICE_INTERROGATE)
    If $arRet[0] <> 0 Then
    $bExist = 1
    DllCall($hAdvapi32, "int", "CloseServiceHandle", "long", $arRet[0])
    EndIf
    DllCall($hAdvapi32, "int", "CloseServiceHandle", "long", $hSC)
    EndIf
    DllClose($hAdvapi32)
    Return $bExist
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    ;===============================================================================
    ; Description: Checks if a service is running on a computer
    ; Parameters: $sComputerName - name of the target computer. If empty, the local computer name is used
    ; $sServiceName - name of the service to check
    ; Requirements: None
    ; Return Values: On Success - 1
    ; On Failure - 0
    ; Note: This function relies on the fact that only a running service responds
    ; to a SERVICE_CONTROL_INTERROGATE control code. Check the ControlService
    ; page on MSDN for limitations with using this method.
    ;===============================================================================
    Func _ServiceRunning($sComputerName, $sServiceName)
    Local $hAdvapi32
    Local $arRet
    Local $hSC
    Local $hService
    Local $bRunning = 0

    [/autoit] [autoit][/autoit] [autoit]

    $hAdvapi32 = DllOpen("advapi32.dll")
    If $hAdvapi32 = -1 Then Return 0
    $arRet = DllCall($hAdvapi32, "long", "OpenSCManager", _
    "str", $sComputerName, _
    "str", "ServicesActive", _
    "long", $SC_MANAGER_CONNECT)
    If $arRet[0] <> 0 Then
    $hSC = $arRet[0]
    $arRet = DllCall($hAdvapi32, "long", "OpenService", _
    "long", $hSC, _
    "str", $sServiceName, _
    "long", $SERVICE_INTERROGATE)
    If $arRet[0] <> 0 Then
    $hService = $arRet[0]
    $arRet = DllCall($hAdvapi32, "int", "ControlService", _
    "long", $hService, _
    "long", $SERVICE_CONTROL_INTERROGATE, _
    "str", "")
    $bRunning = $arRet[0]
    DllCall($hAdvapi32, "int", "CloseServiceHandle", "long", $hService)
    EndIf
    DllCall($hAdvapi32, "int", "CloseServiceHandle", "long", $hSC)
    EndIf
    DllClose($hAdvapi32)
    Return $bRunning
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    ;===============================================================================
    ; Description: Creates a service on a computer
    ; Parameters: $sComputerName - name of the target computer. If empty, the local computer name is used
    ; $sServiceName - name of the service to create
    ; $sDisplayName - display name of the service
    ; $sBinaryPath - fully qualified path to the service binary file
    ; The path can also include arguments for an auto-start service
    ; $sServiceUser - [optional] default is LocalSystem
    ; name of the account under which the service should run
    ; $sPassword - [optional] default is empty
    ; password to the account name specified by $sServiceUser
    ; Specify an empty string if the account has no password or if the service
    ; runs in the LocalService, NetworkService, or LocalSystem account
    ; $nServiceType - [optional] default is $SERVICE_WIN32_OWN_PROCESS
    ; $nStartType - [optional] default is $SERVICE_AUTO_START
    ; $nErrorType - [optional] default is $SERVICE_ERROR_NORMAL
    ; $nDesiredAccess - [optional] default is $SERVICE_ALL_ACCESS
    ; $sLoadOrderGroup - [optional] default is empty
    ; names the load ordering group of which this service is a member
    ; Requirements: Administrative rights on the computer
    ; Return Values: On Success - 1
    ; On Failure - 0 and @error is set to extended Windows error code
    ; Note: Dependencies cannot be specified using this function
    ; Refer to the CreateService page on MSDN for more information
    ;===============================================================================
    Func _CreateService($sComputerName, _
    $sServiceName, _
    $sDisplayName, _
    $sBinaryPath, _
    $sServiceUser = "LocalSystem", _
    $sPassword = "", _
    $nServiceType = 0x00000010, _
    $nStartType = 0x00000002, _
    $nErrorType = 0x00000001, _
    $nDesiredAccess = 0x000f01ff, _
    $sLoadOrderGroup = "")
    Local $hAdvapi32
    Local $hKernel32
    Local $arRet
    Local $hSC
    Local $lError = -1

    [/autoit] [autoit][/autoit] [autoit]

    $hAdvapi32 = DllOpen("advapi32.dll")
    If $hAdvapi32 = -1 Then Return 0
    $hKernel32 = DllOpen("kernel32.dll")
    If $hKernel32 = -1 Then Return 0
    $arRet = DllCall($hAdvapi32, "long", "OpenSCManager", _
    "str", $sComputerName, _
    "str", "ServicesActive", _
    "long", $SC_MANAGER_ALL_ACCESS)
    If $arRet[0] = 0 Then
    $arRet = DllCall($hKernel32, "long", "GetLastError")
    $lError = $arRet[0]
    Else
    $hSC = $arRet[0]
    $arRet = DllCall($hAdvapi32, "long", "OpenService", _
    "long", $hSC, _
    "str", $sServiceName, _
    "long", $SERVICE_INTERROGATE)
    If $arRet[0] = 0 Then
    $arRet = DllCall($hAdvapi32, "long", "CreateService", _
    "long", $hSC, _
    "str", $sServiceName, _
    "str", $sDisplayName, _
    "long", $nDesiredAccess, _
    "long", $nServiceType, _
    "long", $nStartType, _
    "long", $nErrorType, _
    "str", $sBinaryPath, _
    "str", $sLoadOrderGroup, _
    "ptr", 0, _
    "str", "", _
    "str", $sServiceUser, _
    "str", $sPassword)
    If $arRet[0] = 0 Then
    $arRet = DllCall($hKernel32, "long", "GetLastError")
    $lError = $arRet[0]
    Else
    DllCall($hAdvapi32, "int", "CloseServiceHandle", "long", $arRet[0])
    EndIf
    Else
    DllCall($hAdvapi32, "int", "CloseServiceHandle", "long", $arRet[0])
    EndIf
    DllCall($hAdvapi32, "int", "CloseServiceHandle", "long", $hSC)
    EndIf
    DllClose($hAdvapi32)
    DllClose($hKernel32)
    If $lError <> -1 Then
    SetError($lError)
    Return 0
    EndIf
    Return 1
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    ;===============================================================================
    ; Description: Deletes a service on a computer
    ; Parameters: $sComputerName - name of the target computer. If empty, the local computer name is used
    ; $sServiceName - name of the service to delete
    ; Requirements: Administrative rights on the computer
    ; Return Values: On Success - 1
    ; On Failure - 0 and @error is set to extended Windows error code
    ;===============================================================================
    Func _DeleteService($sComputerName, $sServiceName)
    Local $hAdvapi32
    Local $hKernel32
    Local $arRet
    Local $hSC
    Local $hService
    Local $lError = -1

    [/autoit] [autoit][/autoit] [autoit]

    $hAdvapi32 = DllOpen("advapi32.dll")
    If $hAdvapi32 = -1 Then Return 0
    $hKernel32 = DllOpen("kernel32.dll")
    If $hKernel32 = -1 Then Return 0
    $arRet = DllCall($hAdvapi32, "long", "OpenSCManager", _
    "str", $sComputerName, _
    "str", "ServicesActive", _
    "long", $SC_MANAGER_ALL_ACCESS)
    If $arRet[0] = 0 Then
    $arRet = DllCall($hKernel32, "long", "GetLastError")
    $lError = $arRet[0]
    Else
    $hSC = $arRet[0]
    $arRet = DllCall($hAdvapi32, "long", "OpenService", _
    "long", $hSC, _
    "str", $sServiceName, _
    "long", $SERVICE_ALL_ACCESS)
    If $arRet[0] = 0 Then
    $arRet = DllCall($hKernel32, "long", "GetLastError")
    $lError = $arRet[0]
    Else
    $hService = $arRet[0]
    $arRet = DllCall($hAdvapi32, "int", "DeleteService", _
    "long", $hService)
    If $arRet[0] = 0 Then
    $arRet = DllCall($hKernel32, "long", "GetLastError")
    $lError = $arRet[0]
    EndIf
    DllCall($hAdvapi32, "int", "CloseServiceHandle", "long", $hService)
    EndIf
    DllCall($hAdvapi32, "int", "CloseServiceHandle", "long", $hSC)
    EndIf
    DllClose($hAdvapi32)
    DllClose($hKernel32)
    If $lError <> -1 Then
    SetError($lError)
    Return 0
    EndIf
    Return 1
    EndFunc

    [/autoit]

    und

    Spoiler anzeigen
    [autoit]

    ;=============================================================================
    ; Ideas from http://www.andreavb.com/tip060002.html, author: Andrea Tincani
    ; AutoIt scripts written by CatchFish, Feb 24th, 2006.
    ; 100% public domain. Feel free to remove the comments and claim it your own.
    ;=============================================================================
    #include-once

    [/autoit] [autoit][/autoit] [autoit]

    ;===============
    ; API Constants
    ;===============
    Const $SERVICES_ACTIVE_DATABASE = "ServicesActive"
    ; Service Control
    Const $SERVICE_CONTROL_STOP = 0x1
    Const $SERVICE_CONTROL_PAUSE = 0x2
    ; Service State - for CurrentState
    Const $SERVICE_STOPPED = 0x1
    Const $SERVICE_START_PENDING = 0x2
    Const $SERVICE_STOP_PENDING = 0x3
    Const $SERVICE_RUNNING = 0x4
    Const $SERVICE_CONTINUE_PENDING = 0x5
    Const $SERVICE_PAUSE_PENDING = 0x6
    Const $SERVICE_PAUSED = 0x7
    ; Service Control Manager object specific access types
    Const $STANDARD_RIGHTS_REQUIRED = 0xF0000
    Const $SC_MANAGER_CONNECT = 0x1
    Const $SC_MANAGER_CREATE_SERVICE = 0x2
    Const $SC_MANAGER_ENUMERATE_SERVICE = 0x4
    Const $SC_MANAGER_LOCK = 0x8
    Const $SC_MANAGER_QUERY_LOCK_STATUS = 0x10
    Const $SC_MANAGER_MODIFY_BOOT_CONFIG = 0x20
    Const $SC_MANAGER_ALL_ACCESS = BitOR($STANDARD_RIGHTS_REQUIRED, $SC_MANAGER_CONNECT, $SC_MANAGER_CREATE_SERVICE, $SC_MANAGER_ENUMERATE_SERVICE, _
    $SC_MANAGER_LOCK, $SC_MANAGER_QUERY_LOCK_STATUS, $SC_MANAGER_MODIFY_BOOT_CONFIG)
    ; Service object specific access types
    Const $SERVICE_QUERY_CONFIG = 0x1
    Const $SERVICE_CHANGE_CONFIG = 0x2
    Const $SERVICE_QUERY_STATUS = 0x4
    Const $SERVICE_ENUMERATE_DEPENDENTS = 0x8
    Const $SERVICE_START = 0x10
    Const $SERVICE_STOP = 0x20
    Const $SERVICE_PAUSE_CONTINUE = 0x40
    Const $SERVICE_INTERROGATE = 0x80
    Const $SERVICE_USER_DEFINED_CONTROL = 0x100
    Const $SERVICE_ALL_ACCESS = BitOR($STANDARD_RIGHTS_REQUIRED, $SERVICE_QUERY_CONFIG, $SERVICE_CHANGE_CONFIG, $SERVICE_QUERY_STATUS, _
    $SERVICE_ENUMERATE_DEPENDENTS, $SERVICE_START, $SERVICE_STOP, $SERVICE_PAUSE_CONTINUE, $SERVICE_INTERROGATE, $SERVICE_USER_DEFINED_CONTROL)

    [/autoit] [autoit][/autoit] [autoit]

    ;====================================================================
    ; DO NOT call these functions as they are used for internal affairs.
    ;====================================================================
    Func __CreateStructServiceStatus()
    ; ServiceType, CurrentState, ControlsAccepted, Win32ExitCode, ServiceSpecificExitCode, CheckPoint, WaitHint
    Return DllStructCreate("int;int;int;int;int;int;int")
    EndFunc ;==>__CreateStructServiceStatus

    [/autoit] [autoit][/autoit] [autoit]

    Func __CloseServiceHandle($v_hSCObject, $v_hAdvAPI = "advapi32.dll")
    Local $_Result = DllCall($v_hAdvAPI, "int", "CloseServiceHandle", "int", $v_hSCObject)
    If @error = 0 Then
    Return $_Result[0]
    Else
    SetError(@error)
    Return 0
    EndIf
    EndFunc ;==>__CloseServiceHandle

    [/autoit] [autoit][/autoit] [autoit]

    Func __ControlService($v_hService, $v_dwControl, $v_lpServiceStatus, $v_hAdvAPI = "advapi32.dll")
    Local $_Result = DllCall($v_hAdvAPI, "int", "ControlService", "int", $v_hService, "int", $v_dwControl, "ptr", $v_lpServiceStatus)
    If @error = 0 Then
    Return $_Result[0]
    Else
    SetError(@error)
    Return 0
    EndIf
    EndFunc ;==>__ControlService

    [/autoit] [autoit][/autoit] [autoit]

    Func __OpenSCManager($v_lpMachineName, $v_lpDatabaseName, $v_dwDesiredAccess, $v_hAdvAPI = "advapi32.dll")
    Local $_Result = DllCall($v_hAdvAPI, "int", "OpenSCManagerA", "str", $v_lpMachineName, "str", $v_lpDatabaseName, "int", $v_dwDesiredAccess)
    If @error = 0 Then
    Return $_Result[0]
    Else
    SetError(@error)
    Return 0
    EndIf
    EndFunc ;==>__OpenSCManager

    [/autoit] [autoit][/autoit] [autoit]

    Func __OpenService($v_hSCManager, $v_lpServiceName, $v_dwDesiredAccess, $v_hAdvAPI = "advapi32.dll")
    Local $_Result = DllCall($v_hAdvAPI, "int", "OpenServiceA", "int", $v_hSCManager, "str", $v_lpServiceName, "int", $v_dwDesiredAccess)
    If @error = 0 Then
    Return $_Result[0]
    Else
    SetError(@error)
    Return 0
    EndIf
    EndFunc ;==>__OpenService

    [/autoit] [autoit][/autoit] [autoit]

    Func __QueryServiceStatus($v_hService, $v_lpServiceStatus, $v_hAdvAPI = "advapi32.dll")
    Local $_Result = DllCall($v_hAdvAPI, "int", "QueryServiceStatus", "int", $v_hService, "ptr", $v_lpServiceStatus)
    If @error = 0 Then
    Return $_Result[0]
    Else
    SetError(@error)
    Return 0
    EndIf
    EndFunc ;==>__QueryServiceStatus

    [/autoit] [autoit][/autoit] [autoit]

    Func __StartService($v_hService, $v_dwNumServiceArgs, $v_lpServiceArgVectors, $v_hAdvAPI = "advapi32.dll")
    Local $_Result = DllCall($v_hAdvAPI, "int", "StartServiceA", "int", $v_hService, "int", $v_dwNumServiceArgs, "int", $v_lpServiceArgVectors)
    If @error = 0 Then
    Return $_Result[0]
    Else
    SetError(@error)
    Return 0
    EndIf
    EndFunc ;==>__StartService

    [/autoit] [autoit][/autoit] [autoit]

    ;===================================================================================================================
    ; Here below are 4 NT-service related functions: _ServiceStatus(), _ServicePause(), _ServiceStart(), _ServiceStop()
    ;===================================================================================================================
    Func _ServiceStatus($v_ServiceName, $v_ComputerName = "")
    Local $_ServiceStat = __CreateStructServiceStatus()
    Local $_hSManager
    Local $_hService
    Local $_hServiceStatus
    Local $_Result = 0
    Local $_Err = 0
    Local $_Ext = 0

    $_hSManager = __OpenSCManager($v_ComputerName, $SERVICES_ACTIVE_DATABASE, $SC_MANAGER_ALL_ACCESS)
    If $_hSManager <> 0 Then
    $_hService = __OpenService($_hSManager, $v_ServiceName, $SERVICE_ALL_ACCESS)
    If $_hService <> 0 Then
    $_hServiceStatus = __QueryServiceStatus($_hService, DllStructGetPtr($_ServiceStat))
    If $_hServiceStatus <> 0 Then
    Switch DllStructGetData($_ServiceStat, 2)
    Case $SERVICE_STOPPED
    $_Result = "Stopped"
    Case $SERVICE_START_PENDING
    $_Result = "Start Pending"
    Case $SERVICE_STOP_PENDING
    $_Result = "Stop Pending"
    Case $SERVICE_RUNNING
    $_Result = "Running"
    Case $SERVICE_CONTINUE_PENDING
    $_Result = "Coninue Pending"
    Case $SERVICE_PAUSE_PENDING
    $_Result = "Pause Pending"
    Case $SERVICE_PAUSED
    $_Result = "Paused"
    Case Else
    $_Err = 4
    EndSwitch
    Else
    $_Ext = @error
    $_Err = 3
    EndIf
    __CloseServiceHandle($_hService)
    Else
    $_Ext = @error
    $_Err = 2
    EndIf
    __CloseServiceHandle($_hSManager)
    Else
    $_Ext = @error
    $_Err = 1
    EndIf

    Return SetError($_Err, $_Ext, $_Result)
    EndFunc ;==>_ServiceStatus

    [/autoit] [autoit][/autoit] [autoit]

    Func _ServicePause($v_ServiceName, $v_ComputerName = "")
    Local $_ServiceStatus = __CreateStructServiceStatus()
    Local $_hSManager
    Local $_hService
    Local $_Result = 0
    Local $_Err = 0
    Local $_Ext = 0

    [/autoit] [autoit][/autoit] [autoit]

    $_hSManager = __OpenSCManager($v_ComputerName, $SERVICES_ACTIVE_DATABASE, $SC_MANAGER_ALL_ACCESS)
    If $_hSManager <> 0 Then
    $_hService = __OpenService($_hSManager, $v_ServiceName, $SERVICE_ALL_ACCESS)
    If $_hService <> 0 Then
    $_Result = __ControlService($_hService, $SERVICE_CONTROL_PAUSE, DllStructGetPtr($_ServiceStatus))
    If $_Result = 0 Then
    $_Ext = @error
    $_Err = 3
    EndIf
    __CloseServiceHandle($_hService)
    Else
    $_Ext = @error
    $_Err = 2
    EndIf
    __CloseServiceHandle($_hSManager)
    Else
    $_Ext = @error
    $_Err = 1
    EndIf

    Return SetError($_Err, $_Ext, $_Result)
    EndFunc ;==>_ServicePause

    [/autoit] [autoit][/autoit] [autoit]

    Func _ServiceStart($v_ServiceName, $v_ComputerName = "")
    Local $_hSManager
    Local $_hService
    Local $_Result = 0
    Local $_Err = 0
    Local $_Ext = 0

    [/autoit] [autoit][/autoit] [autoit]

    $_hSManager = __OpenSCManager($v_ComputerName, $SERVICES_ACTIVE_DATABASE, $SC_MANAGER_ALL_ACCESS)
    If $_hSManager <> 0 Then
    $_hService = __OpenService($_hSManager, $v_ServiceName, $SERVICE_ALL_ACCESS)
    If $_hService <> 0 Then
    $_Result = __StartService($_hService, 0, 0)
    If $_Result = 0 Then
    $_Ext = @error
    $_Err = 3
    EndIf
    __CloseServiceHandle($_hService)
    Else
    $_Ext = @error
    $_Err = 2
    EndIf
    __CloseServiceHandle($_hSManager)
    Else
    $_Ext = @error
    $_Err = 1
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    Return SetError($_Err, $_Ext, $_Result)
    EndFunc ;==>_ServiceStart

    [/autoit] [autoit][/autoit] [autoit]

    Func _ServiceStop($v_ServiceName, $v_ComputerName = "")
    Local $_ServiceStatus = __CreateStructServiceStatus()
    Local $_hSManager
    Local $_hService
    Local $_Result = 0
    Local $_Err = 0
    Local $_Ext = 0

    [/autoit] [autoit][/autoit] [autoit]

    $_hSManager = __OpenSCManager($v_ComputerName, $SERVICES_ACTIVE_DATABASE, $SC_MANAGER_ALL_ACCESS)
    If $_hSManager <> 0 Then
    $_hService = __OpenService($_hSManager, $v_ServiceName, $SERVICE_ALL_ACCESS)
    If $_hService <> 0 Then
    $_Result = __ControlService($_hService, $SERVICE_CONTROL_STOP, DllStructGetPtr($_ServiceStatus))
    If $_Result = 0 Then
    $_Ext = @error
    $_Err = 3
    EndIf
    __CloseServiceHandle($_hService)
    Else
    $_Ext = @error
    $_Err = 2
    EndIf
    __CloseServiceHandle($_hSManager)
    Else
    $_Ext = @error
    $_Err = 1
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    Return SetError($_Err, $_Ext, $_Result)
    EndFunc ;==>_ServiceStop

    [/autoit] [autoit][/autoit] [autoit]

    ;===============================================================================================================================================
    ; NT-service related funtions use internal service names. So use this function to convert the display name, as you see in the Services Manager.
    ;===============================================================================================================================================
    Func _ToInternalServiceName($v_ServiceDisplayName)
    Local $_Result = ""
    Local $_NTSvcKey = "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services"
    Local $_SubKey
    Local $i = 1

    If $v_ServiceDisplayName = "" Then Return $_Result
    While 1
    $_SubKey = RegEnumKey($_NTSvcKey, $i)
    $i += 1
    If @error = 0 Then
    If RegRead($_NTSvcKey & "\" & $_SubKey, "DisplayName") = $v_ServiceDisplayName Then
    $_Result = $_SubKey
    ExitLoop
    EndIf
    Else
    ExitLoop
    EndIf
    WEnd

    Return $_Result
    EndFunc ;==>_ToInternalServiceName

    [/autoit] [autoit][/autoit] [autoit]

    ; ---------------------------------------------
    ; Function: _ServiceStatusWait()
    ; Purpose: Waits for service status to match the given parameter.
    ; Call with: _ServiceStatusWait($v_ServiceName, $v_ComputerName = "", $s_Status = "Running", $i_Timeout = 0)
    ; Where: $v_ServiceName = string service name
    ; $v_ComputerName = computer to operate on, default is local
    ; $s_Status (optional) = status string to wait for, default is "Running"
    ; $i_Timeout = timeout in seconds, default 0 = never timeout
    ; On success returns 1
    ; On failure of the service status request returns 0 and sets @error and @extended
    ; On timeout returns 0 and @error = -1
    ; Notes: The service name is the 'internal' name, not necessarily the 'display'
    ; name seen in the GUI manager. Use _ToInternalServiceName() to translate
    ; display name to internal.
    ; Requires: _NTServices.au3
    ; ---------------------------------------------
    Func _ServiceStatusWait($v_ServiceName, $v_ComputerName = "", $s_Status = "Running", $i_Timeout = 0)
    Local $sStatus = _ServiceStatus($v_ServiceName, $v_ComputerName)
    If Not @error Then
    If $sStatus = $s_Status Then
    Return 1
    Else
    Local $iTimer = TimerInit()
    Do
    Sleep(250)
    If _ServiceStatus($v_ServiceName, $v_ComputerName) = $s_Status Then Return 1
    Until $i_Timeout And (TimerDiff($iTimer) > ($i_Timeout * 1000))
    ; Timeout
    Return SetError(-1, 0, 0)
    EndIf
    Else
    ; Error seeing service
    Return SetError(@error, @extended, 0)
    EndIf
    EndFunc ;==>_ServiceStatusWait

    [/autoit] [autoit][/autoit] [autoit]

    Func _SetServiceState($s_pc, $service, $State)
    Local Const $wbemFlagReturnImmediately = 0x10
    Local Const $wbemFlagForwardOnly = 0x20

    [/autoit] [autoit][/autoit] [autoit]

    Local $colItems = "", $objItem, $ret_status = -1
    Local $a_status[25] = ["Success", "Not supported", "Access denied", "Dependent services running", _
    "Invalid service control", "Service cannot accept control", "Service not active", "Service request timeout", _
    "Unknown failure", "Path not found", "Service already stopped", "Service database locked", "Service dependency deleted", _
    "Service dependency failure", "Service disabled", "Service logon failed", "Service marked for deletion", "Service no thread", _
    "Status circular dependency", "Status duplicate name", "Status - invalid name", "Status - invalid parameter", _
    "Status - invalid service account", "Status - service exists", "Service already paused" ]
    If Ping($s_pc) Then
    Local $objWMIService = ObjGet("winmgmts:\\" & $s_pc & "\root\CIMV2")
    If @error Then
    MsgBox(16, "_SetServiceState", "ObjGet Error: winmgmts")
    Return
    EndIf
    $colItems = $objWMIService.ExecQuery ("SELECT * FROM Win32_Service", "WQL", _
    $wbemFlagReturnImmediately + $wbemFlagForwardOnly)
    If @error Then
    MsgBox(16, "_SetServiceState", "ExecQuery Error: SELECT * FROM Win32_Service")
    Return
    EndIf
    If IsObj($colItems) Then
    For $objItem In $colItems
    If $objItem.Name = $service Then
    Select
    Case $State = "Boot" Or $State = "System" Or $State = "Automatic" Or $State = "Manual" Or $State = "Disabled"
    $ret_status = $objItem.ChangeStartMode ($State)
    Case $State = "Stop"
    $ret_status = $objItem.StopService ()
    Case $State = "Start"
    $ret_status = $objItem.StartService ()
    Case $State = "Pause"
    $ret_status = $objItem.PauseService ()
    Case $State = "Resume"
    $ret_status = $objItem.ResumeService ()
    Case $State = "Delete"
    $ret_status = $objItem.Delete ()
    EndSelect
    ExitLoop
    EndIf
    Next
    EndIf
    EndIf
    If $ret_status <> -1 Then
    Return $a_status[$ret_status]
    Else
    SetError(1)
    Return $ret_status
    EndIf
    EndFunc ;==>_SetServiceState

    [/autoit]

    So long,

    Mega

  • hi,

    habe es getestet. Es läuft ganz gut aber es starten mehrer Scripts auf der Maschine. Bei meinem Versuch geht es auch, habe anstatt der Msgbox den Beep eingebaut und siehe da es geht. Allerdings ist eine recht hohe CPU Auslastung da. Habe auch das Sleep schon auf 500 hochgesetzt ohne erfolg. Was kann man noch machen?

    MFG ThomasB

    Sorry Fehler gefunden Sleep stand an der Falschen Stelle.

    MFG ThomasB

    *
    Ich lese viel und gerne (und wenn ich alle Mahnungen durch habe, schmeiße ich sie weg)
    *

    Einmal editiert, zuletzt von Thomasb (3. Januar 2008 um 19:41)

  • hi,

    habe gestern keine Zeit mehr gehabt zum weiteren Testen. Habe jetzt erstmal eine Programm das starten soll. Leider ertönt nur der noch enthaltene Beep aber das Programm startet nicht.

    Spoiler anzeigen
    [autoit]

    #include "ServiceControl.au3"
    #include "Misc.au3"
    #include "File.au3"
    #include "date.au3"
    #include "array.au3"
    #include "string.au3"
    #NoTrayIcon ; Kann man natürlich auch noch wegmachen :)

    [/autoit] [autoit][/autoit] [autoit]

    If _Singleton("MegaService", 1) = 0 Then
    MsgBox(64, "Warning", "An occurence of test is already running", 3)
    Exit
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    Global $pathSrvAny = "C:\ADTG\srvany.exe"
    Global $servicename = "Dienst_Test"
    $INIFILE = "C:\ADTG\Dienst_Test.ini"
    $programm = "C:\Programme\Movie Maker\moviemk.exe"
    If Not _ServiceExists (@ComputerName, $servicename) And @Compiled Then
    _CreateService ("", $servicename, "ADTG Skript", $pathSrvAny, "LocalSystem", "", 0x110)
    RegWrite("HKLM\SYSTEM\CurrentControlSet\Services\" & $servicename & "\Parameters", "Application", "REG_SZ", @ScriptFullPath)
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    Sleep(500)
    theFunc()
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func theFunc()
    If @HOUR = 13 And @MIN = 50 And @SEC = 00 Then ; hier mal die Zeit anpassen :)
    ;If IniRead($INIFILE, "001", "Start", "NotFound") = _NowTime() Then
    ToolTip("Skript gestartet" & " Service An(1)Aus(0) :" & _ServiceExists (@ComputerName, $servicename), 0, 0)
    Beep(500, 5000)
    Run("C:\Programme\Movie Maker\moviemk.exe")
    Else
    ToolTip("Skript inaktiv" & " Service An(1)Aus(0) :" & _ServiceExists (@ComputerName, $servicename), 0, 0)
    EndIf
    EndFunc ;=="theFunc

    [/autoit]


    Wo liegt meine Fehler oder ist es garkein Fehler von mir?

    ThomasB

    MFG ThomasB

    *
    Ich lese viel und gerne (und wenn ich alle Mahnungen durch habe, schmeiße ich sie weg)
    *

    • Offizieller Beitrag

    Hi,

    ich habe dein Skript nicht getestet, aber ich habe bei mir

    ShellExecute('notepad', '', @WindowsDir)

    unter dem Beep und das funktioniert auch. Du musst das Skript kompilieren und dann starten!

    und löschen dann kannst du dann mit

    [autoit]

    #include "ServiceControl.au3"
    $servicename = "MegaService"
    ConsoleWrite(_DeleteService("", $servicename) & @CRLF)

    [/autoit]

    So long,

    Mega