Hallo Community,
da ich ein sehr ergeiziger lerner von Sprachen bin habe ich mich mal AutoIT gewidmet.
Ich habe mir ein S***** für ein Programm geschrieben. Soweit so gut, jedoch muss es laufen, ohne das ein Benutzer angemeldet ist. Da habe ich diese Zwei S*****s hier gefunden:
Hier mein Code:
_Service_Init("STDYControlServer") ;Dem Service Controller das OK geben | danach wird die Funktion _Main aufgerufen
Func _Main()
;Wenn der Service erfolgreich ausgeführt wurde
_Service_SetStopEvent() ;Dem Service Controller die Möglichkeit geben den Service Ordnungsgemäß zu schließen
FileWrite(@S*****Dir & "\test.txt", "Service erfolgreich gestartet" & @CRLF) ;Eine Datei erstellen
Return ;Exit
EndFunc ;==>_Main
Func _Service_ReportStatus($currentState, $exitCode, $waitHint)
Local $checkPoint = 1;
Local $rc = True;
If Not ($service_debug_mode) Then ;when debugging we don't report to the SCM
If ($currentState == $SERVICE_START_PENDING) Then
DllStructSetData($tService_Status, "dwControlsAccepted", 0);
Else
DllStructSetData($tService_Status, "dwControlsAccepted", $SERVICE_ACCEPT_STOP)
EndIf
DllStructSetData($tService_Status, "dwCurrentState", $currentState)
DllStructSetData($tService_Status, "dwWin32ExitCode", $exitCode)
DllStructSetData($tService_Status, "dwWaitHint", $waitHint)
If $currentState == $SERVICE_RUNNING Or $currentState == $SERVICE_STOPPED Then
DllStructSetData($tService_Status, "dwCheckPoint", 0)
Else
DllStructSetData($tService_Status, "dwCheckPoint", $checkPoint + 1);
EndIf
; report the status of the service to the service control manager.
If Not ($rc = _Service_SetServiceStatus($tService_Status_handle, DllStructGetPtr($tService_Status))) Then ConsoleWrite("+ " & $NTSL_ERROR_SERVICE_STATUS & @TAB & _WinAPI_GetLastError() & @CRLF)
EndIf
Return ($rc);
EndFunc
Func _Service_ServiceMain($iArg, $sArgs)
$ret = DllCall("advapi32.dll", "hwnd", "RegisterServiceCtrlHandler", "ptr", DllStructGetPtr($tServiceName), "ptr", DllCallbackGetPtr($tServiceCtrl));register service
If $ret[0] = 0 Then
MsgBox(0, "Error", _WinAPI_GetLastError())
Exit
EndIf
$tService_Status_handle = $ret[0]
If Not ($tService_Status_handle) Then
_Service_Cleanup()
Return
EndIf
DllStructSetData($tService_Status, "dwServiceType", $SERVICE_WIN32_OWN_PROCESS)
DllStructSetData($tService_Status, "dwServiceSpecificExitCode", 0);
; report the status to the service control manager.
If Not (_Service_ReportStatus($SERVICE_START_PENDING, $NO_ERROR, 3000)) Then
_Service_Cleanup()
Return
EndIf
_Service_Start($iArg, $sArgs);
_Main()
Return;
EndFunc
Func _Service_SetStopEvent()
If ($service_stop_event) Then _WinAPI_SetEvent($service_stop_event)
EndFunc
Func _Service_Start($argc, $argv)
If Not (_Service_ReportStatus($SERVICE_START_PENDING, $NO_ERROR, 3000)) Then Return
$service_stop_event = _WinAPI_CreateEvent(0, True, False, 0);
If Not ($service_stop_event) Then Return;
;report the status to the service control manager.
If Not _Service_ReportStatus($SERVICE_START_PENDING, $NO_ERROR, 3000) Then Return;
;report the status to the service control manager.
If Not _Service_ReportStatus($SERVICE_RUNNING, $NO_ERROR, 0) Then Return;
EndFunc
#endregion
Zweites:
Code:
#region Defined Variables and Constants
Global $STANDARD_RIGHTS_REQUIRED = 0x000F0000
; Service Control Manager access types
Global Const $SC_MANAGER_CONNECT = 0x0001
Global Const $SC_MANAGER_CREATE_SERVICE = 0x0002
Global Const $SC_MANAGER_ENUMERATE_SERVICE = 0x0004
Global Const $SC_MANAGER_LOCK = 0x0008
Global Const $SC_MANAGER_QUERY_LOCK_STATUS = 0x0010
Global Const $SC_MANAGER_MODIFY_BOOT_CONFIG = 0x0020
Global 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 Access Types
Global Const $SERVICE_QUERY_CONFIG = 0x0001
Global Const $SERVICE_CHANGE_CONFIG = 0x0002
Global Const $SERVICE_QUERY_STATUS = 0x0004
Global Const $SERVICE_ENUMERATE_DEPENDENTS = 0x0008
Global Const $SERVICE_START = 0x0010
Global Const $SERVICE_STOP = 0x0020
Global Const $SERVICE_PAUSE_CONTINUE = 0x0040
Global Const $SERVICE_INTERROGATE = 0x0080
Global Const $SERVICE_USER_DEFINED_CONTROL = 0x0100
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)
; Service Controls
Global Const $SERVICE_CONTROL_STOP = 0x00000001
Global Const $SERVICE_CONTROL_PAUSE = 0x00000002
Global Const $SERVICE_CONTROL_CONTINUE = 0x00000003
Global Const $SERVICE_CONTROL_INTERROGATE = 0x00000004
Global Const $SERVICE_CONTROL_SHUTDOWN = 0x00000005
Global Const $SERVICE_CONTROL_PARAMCHANGE = 0x00000006
Global Const $SERVICE_CONTROL_NETBINDADD = 0x00000007
Global Const $SERVICE_CONTROL_NETBINDREMOVE = 0x00000008
Global Const $SERVICE_CONTROL_NETBINDENABLE = 0x00000009
Global Const $SERVICE_CONTROL_NETBINDDISABLE = 0x0000000A
Global Const $SERVICE_CONTROL_DEVICEEVENT = 0x0000000B
Global Const $SERVICE_CONTROL_HARDWAREPROFILECHANGE = 0x0000000C
Global Const $SERVICE_CONTROL_POWEREVENT = 0x0000000D
Global Const $SERVICE_CONTROL_SESSIONCHANGE = 0x0000000E
; Service Types
Global Const $SERVICE_KERNEL_DRIVER = 0x00000001
Global Const $SERVICE_FILE_SYSTEM_DRIVER = 0x00000002
Global Const $SERVICE_ADAPTER = 0x00000004
Global Const $SERVICE_RECOGNIZER_DRIVER = 0x00000008
Global Const $SERVICE_DRIVER = BitOR($SERVICE_KERNEL_DRIVER, $SERVICE_FILE_SYSTEM_DRIVER, $SERVICE_RECOGNIZER_DRIVER)
Global Const $SERVICE_WIN32_OWN_PROCESS = 0x00000010
Global Const $SERVICE_WIN32_SHARE_PROCESS = 0x00000020
Global Const $SERVICE_WIN32 = BitOR($SERVICE_WIN32_OWN_PROCESS, $SERVICE_WIN32_SHARE_PROCESS)
Global Const $SERVICE_INTERACTIVE_PROCESS = 0x00000100
Global Const $SERVICE_TYPE_ALL = BitOR($SERVICE_WIN32, $SERVICE_ADAPTER, $SERVICE_DRIVER, $SERVICE_INTERACTIVE_PROCESS)
; Service Start Types
Global Const $SERVICE_BOOT_START = 0x00000000
Global Const $SERVICE_SYSTEM_START = 0x00000001
Global Const $SERVICE_AUTO_START = 0x00000002
Global Const $SERVICE_DEMAND_START = 0x00000003
Global Const $SERVICE_DISABLED = 0x00000004
; Service Error Control
Global Const $SERVICE_ERROR_IGNORE = 0x00000000
Global Const $SERVICE_ERROR_NORMAL = 0x00000001
Global Const $SERVICE_ERROR_SEVERE = 0x00000002
Global Const $SERVICE_ERROR_CRITICAL = 0x00000003
Global Const $SERVICE_ACCEPT_HARDWAREPROFILECHANGE = 0x20
Global Const $SERVICE_ACCEPT_NETBINDCHANGE = 0x10
Global Const $SERVICE_ACCEPT_PARAMCHANGE = 0x8
Global Const $SERVICE_ACCEPT_PAUSE_CONTINUE = 0x2
Global Const $SERVICE_ACCEPT_POWEREVENT = 0x40
Global Const $SERVICE_ACCEPT_SESSIONCHANGE = 0x80
Global Const $SERVICE_ACCEPT_PRESHUTDOWN = 0x100
Global Const $SERVICE_ACCEPT_SHUTDOWN = 0x4
Global Const $SERVICE_ACCEPT_STOP = 0x1
Global Const $SERVICE_ACTIVE = 0x1
Global Const $SERVICE_INACTIVE = 0x2
Global Const $SERVICE_PAUSE_PENDING = 0x6
Global Const $SERVICE_PAUSED = 0x7
Global Const $SERVICE_RUNNING = 0x4
Global Const $SERVICE_START_PENDING = 0x2
Global Const $SERVICE_STOP_PENDING = 0x3
Global Const $SERVICE_STOPPED = 0x1
Global Const $SERVICE_CONTINUE_PENDING = 0x5
;
Global $tServiceName,$tServiceCtrl,$tServiceMain,$service_debug_mode = False
Global $tService_Status = DllStructCreate("dword dwServiceType;dword dwCurrentState;dword dwControlsAccepted;dword dwWin32ExitCode;dword dwServiceSpecificExitCode;dword dwCheckPoint;dword dwWaitHint")
Global $tService_Status_handle
Global Const $NO_ERROR = 0
Global Const $NTSL_LOOP_WAIT = -1
Global $service_stop_event
Global $NTSL_ERROR_SERVICE_STATUS = 2
Global Const $WAIT_OBJECT_0 = 0x0
#endregion
Würde mich über Hilfe bzw. eine Erklärung freuen, wie ich den Dienst zum laufen bekomme. bzw. erstmal erstellen kann das er unter der Computerverwaltung / Dienste auftaucht!
Eule66
05.02.11 17:42
Hallo "Ixalia",
was mit aus AutoIT erzeugten EXE-Files in den meisten Fällen geht, ist mit kleinen Freewaretools wie "runassvc" oder "AppToService" die EXE als Dienst laufen zu lassen, evtl. kann dem Dienst dann auch noch eine Interaktion mit dem Desktop erlaubt werden.
Etwas Aufwändiger ginge es mit "instsrv" und "srvany" aus dem "Windows Server 2003 Resource Kit Tools" (Bei M$ suchen und frei laden).
Die beiden gefundenen "S*****e"-Codes scheinen zusammen zu gehören?
Kann an der Fundstelle noch eine Doku oder ausführlichere Kommentare gefunden werden?
Soweit ich die Sache verstehe soll dort eine "Symantec Backup Exec.exe" als Dienst gestartet werden. In den verwendeten Funktionen werden dazu Hauptsächlich die "advapi32.dll" und "kernel32.dll" verwendet. Für "habe ich mich mal AutoIT gewidmet" ein etwas größerer Brocken.
Gruß,
Eule66
Ixalia
05.02.11 21:14
Hallo Eule666,
erst einmal vielenn DAnk für die schnelle Antwort ;)!
Aber die Tools die du aufgelistet hast, funktionieren leider nicht unter Windows SBS 2008. DAs bedeutet msus auf diese Codes zurückgreifen, jedoch ist dort keien Dokumentation hinterlegt, was genau geschehen soll!
Wäre für weiter HIlfe dankbar!
Wäre es auch möglich evtl. in C++ etwas zu schreiben, dass die Exe einfach jeden Freitag um 1:00 NAchts aufgerufen werden soll, ohne das ein Benutzer angemeldet ist?
Grüße Ixalia
Xalir
06.02.11 08:22
Warum nimmst Du Dich nicht einfach den Taskplaner? Da irgendwas zusammenzuschustern ist ein Umweg über 20 Ecken.
Eule66
06.02.11 09:34
Hallo Ixalia,
ich schließe mich da Xalir an, bei 1xAusführen pro Woche ist der Taskplaner völlig ausreichend. Auch auf den Win 2008 Small Business Server lässt sich die "Aufgabenplanung" in der Verwaltung für die AutoIT - EXE verwenden. (taskschd.msc)
Am Besten dazu ein eigenes Konto mit Adminrechten anlegen, um Passwortänderungen am Adminkonto nicht ständig nachpflegen zu müssen.
(Ein kleiner Haken, welcher aber auch bei anderen Methoden auftreten könnte, wären Laufwerksmappings, welche als nur als UNC-Pfade funktioniern würden. -- Im bisherigen Haupt-S***** bisher nicht verwendet.)
Bei deinem Fund-Sript kann nur getestet werden, ob ein einfaches Eintragen des Pfades hin zur AuitoIT-EXE (welche dann, an dieser Stelle bleiben müsste) nach dem Ausführen des S*****es zu einem Dienst führt, welcher das tut, was gewünscht wird. Die Funktionen dort, durch ein "#include" in jedem beliebigen S***** zugänglich, könnten dann zur Steuerung des Dienstes dienen. (Starten, Stoppen, Prüfen ob vorhanden, Status...)
Wenn aber schon die genannten Freewareprodukte, als Administrator ausgeführt, nicht das gewünschte Resultat bringen konnten, vermute ich dass das auch so nicht so einfach gehen könnte. Mit C++ können natürlich auch servicefähige Dateien erstellt werden, welche aber vermutlich genauso als Dienst angemeldet werden müssten.
( Evtl.: Admin-Dosfenster: "C:\datei.exe -install" )
Grüße,
Eule66
Ixalia
06.02.11 20:02
Das problem ist mit dem Taskplaner funktioniert es leider nicht! Sorry! Da der Benutzer sich wider abmelden müsste, oder gibt es dort auch eine Lösung?
Grüße Ixalia
Xalir
07.02.11 03:18
Du hast Dir noch nicht mal den Taskplaner angeschaut, sonst würde Dir da nämlich was auffallen.
germgerm
07.02.11 09:28
Zitat:
Zitat von Xalir
(Beitrag 21878847)
Du hast Dir noch nicht mal den Taskplaner angeschaut, sonst würde Dir da nämlich was auffallen.
[Link nur für registrierte und freigeschaltete Mitglieder sichtbar. Jetzt registrieren...]
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:59 Uhr.