autoit_xy.exe über Dienst mit Datenaustausch zwischen Dienst und Desktop

  • Hallo Leute,

    ich habe nun verdammt viel gelesen und gegoogelt und probiert und komme nicht weiter.
    Über jede Hilfe wäre ich sehr dankbar.

    folgende Situation:

    Aufgrund
    eines Projektes bei dem ein Datenaustausch nur über ein UI möglich ist,
    da keine Schnittstellen wie ODBC u.ä. vorhanden sind, hab ich den Tipp
    mit AutoIt bekommen. Um das ganze mal zu testen, habe ich ein Beispiel
    von AutoIt etwas umgeschrieben und zunächst über eine Batch-Datei über
    PHP ausführen lassen (au3 wurde kompiliert). Im Errorlog war nur die
    Meldung zu finden "unabled to execute (...)" ...
    Dann bin ich den
    Umweg über die Aufgabenplanung gegangen und habe einen Task mit Trigger
    erstellt. Dabei musste ich feststellen, dass wenn ich die RDP-Sitzung
    aktiv und offen habe, dass der Task wunderbar ausgeführt wird. Wenn ich
    die RDP-Sitzung Minimiere, hängt es nach dem öffnen des Notepads (Script
    füge ich weiter unten an), wenn ich dann die Sitzung wieder maximiere
    und einen Klick in den Editor mache, hat AutoIt fast immer
    weitergemacht. Wenn ich die RDP-Sitzung Schließe, bleibt der Task beim
    Status "Wird ausgeführt", solange bis ich ihn beende. Wenn ich mich
    Abmelde, das gleiche Spiel.

    Also gut dachte ich mir, liegt
    vielleicht an den Berechtigungen und an der Fehlenden Windows GUI, also
    habe ich weiter recherchiert und bin auf "ui0detect" gestoßen.
    Kurzerhand habe ich anhand der AutoIt EXE einen Dienst erstellt, welcher
    als Benutzer SYSTEM läuft. wenn ich den Dienst starte kommt eine
    Windowsfehlermeldung
    "Der Dienst XYZ auf Lokaler Computer konnte
    nicht gestartet werden. Fehler 1053: Der Dienst antwortete nicht
    rechtzeitig auf die Start oder Steuerungsanforderung"
    Außerdem geht das Fenster "Erkennung interaktiver Dienste" auf und frägt mich, ob ich die Meldung anzeigen will.
    Nicht weiter schlimm dachte ich mir, schauste mal auf den Session 0 Desktop.
    Kurzerhand
    über Kommandozeile "rundll32 winsta.dll
    WinStationSwitchToServicesSession" habe ich mir das angesehen und musste
    feststellen, dass der Editor offen ist und nichts eingegeben wurde und
    das Editor-Fenster nicht aktiv ist.
    Gut dachte ich mir, bauste nochmal eine Bedingung ein, dass wenn der Editor nicht aktiv ist, dass er aktiviert werden soll.
    Erledigt und wieder den Dienst gestartet, gleiche Meldungen kommen wieder, egal dachte ich mir, schauste wieder auf den Desktop.
    Umgeschalten und da musste ich wieder feststellen, Editor offen, aber nicht aktiv.

    Systemumgebung: Windows Server 2008 R2, AutoIt3, au3-Dateien zu x64 kompiliert (mit x86 selbes verhalten).

    Script1 ( wird beim starten des Dienstes ausgeführt")

    [autoit]

    sleep(2000)
    Run("C:\Program Files (x86)\AutoIt3\Examples\command.bat")

    [/autoit]


    Script2 (wird über die Batchdatei ausgeführt)

    [autoit]

    sleep(2000)
    Run("notepad.exe")
    WinWait("Unbenannt - Editor")
    WinActivate("Unbenannt - Editor", "")
    If WinActive("Unbenannt - Editor", "") = 0 Then WinActivate("Unbenannt - Editor", "")

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

    Send("!{TAB}", 1)

    Send("Sending some special characters:{ENTER 2}")
    Send("First way: ")
    Send("{!}{^}{+}{#}")
    Send("{ENTER}")
    Send("Second way: ")
    Send("!^+#", 1)

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

    Send("{ENTER}{ENTER}Finished")
    WinClose("[ACTIVE]", "")

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

    Send("!S");

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

    WinWaitActive("Der Pfad ist nicht verfügbar", "OK")
    ;hierzu
    muss ich erläutern, dass wenn das "speichern unter" Fenster aufgeht, er
    standardmäßig auf den Desktop switcht, welcher in der Session 0 nicht
    da ist,
    ;da "SYSTEM" keinen Desktop hat.
    ControlClick("Der Pfad ist nicht verfügbar", "OK", "Button1")

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

    WinWait("Speichern unter")
    WinActivate("Speichern unter")

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

    ControlSend("Speichern unter", "", "[CLASS:Edit; INSTANCE:1]", "C:\autoit\autoit.txt")

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

    Send("!S");

    [/autoit]

    Wenn
    ich die Scirpte (natürlich auf die andere Umgebung angepasst (in bezug
    auf Desktopfehlermeldung)) per Doppelklick ausführe macht er alles so
    wie er soll, nur wenn ich es automatisch haben will, bleibt er beim
    Editor hängen....

    Hat irgendwer eine Lösung für mich?
    Ich verzweifle und habe schon fast eine Woche getüfftelt und letztendlich kam nichts dabei raus...

    Viele Grüße
    Jerry

  • PS: "Send("!{TAB}", 1)" habe ich eingebaut um eventuell einen Umweg zu bauen, funktioniert aber auch nicht

  • Windows Server sind nicht wirklich mein Ding und ich kann deinen Ausführungen auch nur schwer folgen aber vlt. hilft dir dieser Beitrag aus dem englischen Forum etwas weiter - http://www.autoitscript.com/forum/topic/13…-scheduler-etc/

  • Moin moin,

    danke für den Rat.
    Habe mal die Funktion _MouseClickMinimized eingebunden und komme nun an die nächste Grenze.
    Beim Funktionsaufruf meldet er mir "Error: Unknown function name." grrrrr

    Viele Grüße
    Jerry

    • Offizieller Beitrag
    Zitat

    Habe mal die Funktion _MouseClickMinimized eingebunden und komme nun an die nächste Grenze.
    Beim Funktionsaufruf meldet er mir "Error: Unknown function name." grrrrr

    Ohne deinen Code, wo man sieht, was du überhaupt gemacht hast, wird dir schwerlich einer helfen können ;)
    Die Fehlermeldung bringt da auch nichts, weil man es nicht nachvollziehen kann.
    "Error: Unknown function name." ist bestimmt nicht die komplette Fehlermeldung.

  • huhu,

    naja nachdem du die zeile 56 gelesen hast, wirst du merken, dass die meldung keinen sinn ergibt.
    Die Meldung besagt genau das.
    Titel: "AutoIt Error"
    Text: "Line 58 (File "C:\Programm Files......."): Error: Unknown function name."

    hier mal der neue code:

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

    #include-once

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

    sleep(2000)
    Run("notepad.exe")
    Run("C:\Program Files (x86)\AutoIt3\Au3Info.exe")

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

    ; Wait for the Notepad become active - it is titled "Untitled - Notepad" on English systems
    sleep(10000)
    WinWait("Unbenannt - Editor")
    ;WinActivate("[CLASS:Edit; INSTANCE:1]")
    _MouseClickMinimized()
    ; Now that the Notepad window is active type some special characters
    ;If WinActive("Unbenannt - Editor", "") = 0 Then WinActivate("Unbenannt - Editor", "")
    MouseClick("", "50", "200")
    ;Send("!{TAB}", 1)

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

    WinWaitActive("Unbenannt - Editor", "")
    Send("Sending some special characters:{ENTER 2}")

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

    ; Do it the first way
    Send("First way: ")
    Send("{!}{^}{+}{#}")
    Send("{ENTER}")

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

    ; Do it the second way (RAW mode, notice the second parameter is 1)
    Send("Second way: ")
    Send("!^+#", 1)

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

    Send("{ENTER}{ENTER}Finished")
    WinClose("[ACTIVE]", "")

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

    Send("!S");
    ; Finished!
    WinWaitActive("Der Pfad ist nicht verfügbar", "OK")

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

    ControlClick("Der Pfad ist nicht verfügbar", "OK", "Button1")

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

    WinWait("Speichern unter")
    WinActivate("Speichern unter")

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

    ControlSend("Speichern unter", "", "[CLASS:Edit; INSTANCE:1]", "C:\autoit\autoit.txt")

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

    Send("!S");
    MouseClick("", "50", "50")
    WinWaitActive("Administrator: C:\Windows\system32\cmd.exe")

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

    ;Send("exit{ENTER}")

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

    Sleep(1000)

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

    Send("!J");

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

    Func _MouseClickMinimized($Window = "Unbenannt - Editor", $Button = "left", $X = "25", $Y = "151", $Clicks = 1, $handle = 0)
    Local $MK_LBUTTON = "0x0001"
    Local $WM_LBUTTONDOWN = "0x0201"
    Local $WM_LBUTTONUP = "0x0202"
    Local $MK_RBUTTON = "0x0002"
    Local $WM_RBUTTONDOWN = "0x0204"
    Local $WM_RBUTTONUP = "0x0205"
    Local $WM_MOUSEMOVE = "0x0200"
    Local $i = 0
    if $handle = 1 Then
    Local $winhandle = $Window
    Elseif $handle = 0 Then
    Local $winhandle = WinGetHandle($Window)
    EndIf
    Select
    Case $Button = "right"
    $Button = $MK_RBUTTON
    $ButtonDown = $WM_RBUTTONDOWN
    $ButtonUp = $WM_RBUTTONUP
    Case $Button = "left"
    $Button = $MK_LBUTTON
    $ButtonDown = $WM_LBUTTONDOWN
    $ButtonUp = $WM_LBUTTONUP
    Case Else ;; CPF
    ;; illegal number of parameters?
    ;~ MsgBox(32, "KCH: Problem", "_MouseClickPlus() called with bad number of params?")
    Return
    EndSelect
    ;; makes no sense to send click to minimized window with current mouse coordinates
    If $X = "" Or $Y = "" Then
    ;; illegal number of parameters?
    ;~ MsgBox(32, "KCH: Problem", "_MouseClickPlus() called with bad number of params?")
    Return
    EndIf
    For $i = 1 To $Clicks
    DllCall("user32.dll", "int", "SendMessage", _
    "hwnd", $winhandle, _
    "int", $WM_MOUSEMOVE, _
    "int", 0, _
    "long", _MakeLong($X, $Y))
    DllCall("user32.dll", "int", "SendMessage", _
    "hwnd", $winhandle, _
    "int", $ButtonDown, _
    "int", $Button, _
    "long", _MakeLong($X, $Y))
    Sleep(10)
    DllCall("user32.dll", "int", "SendMessage", _
    "hwnd", $winhandle, _
    "int", $ButtonUp, _
    "int", $Button, _
    "long", _MakeLong($X, $Y))
    Next
    EndFunc ;==>_MouseClickMinimized

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

    bitte bedenkt, dass dieser code nach vielem probieren ziemlich fertig aussieht (fertig im sinne von schrecklich)

    in zeile 11 sieht man den functionsaufruf und ganz unten wird die funktion definiert.

    Edit: die werte bei der Deklaration der Local Konstanten habe ich mal in "" gesetzt um sicher zu gehen, dass es nicht daran liegt....

    Viele Grüße
    und Danke für die Aufmerksamkeit :)

    • Offizieller Beitrag
    Spoiler anzeigen
    [autoit]

    #include-once

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

    sleep(2000)
    Run("notepad.exe")
    Run("C:\Program Files (x86)\AutoIt3\Au3Info.exe")

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

    ; Wait for the Notepad become active - it is titled "Untitled - Notepad" on English systems
    sleep(10000)
    WinWait("Unbenannt - Editor")
    ;WinActivate("[CLASS:Edit; INSTANCE:1]")
    _MouseClickMinimized()
    ; Now that the Notepad window is active type some special characters
    ;If WinActive("Unbenannt - Editor", "") = 0 Then WinActivate("Unbenannt - Editor", "")
    MouseClick("", "50", "200")
    ;Send("!{TAB}", 1)

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

    WinWaitActive("Unbenannt - Editor", "")
    Send("Sending some special characters:{ENTER 2}")

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

    ; Do it the first way
    Send("First way: ")
    Send("{!}{^}{+}{#}")
    Send("{ENTER}")

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

    ; Do it the second way (RAW mode, notice the second parameter is 1)
    Send("Second way: ")
    Send("!^+#", 1)

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

    Send("{ENTER}{ENTER}Finished")
    WinClose("[ACTIVE]", "")

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

    Send("!S");
    ; Finished!
    WinWaitActive("Der Pfad ist nicht verfügbar", "OK")

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

    ControlClick("Der Pfad ist nicht verfügbar", "OK", "Button1")

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

    WinWait("Speichern unter")
    WinActivate("Speichern unter")

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

    ControlSend("Speichern unter", "", "[CLASS:Edit; INSTANCE:1]", "C:\autoit\autoit.txt")

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

    Send("!S");
    MouseClick("", "50", "50")
    WinWaitActive("Administrator: C:\Windows\system32\cmd.exe")

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

    ;Send("exit{ENTER}")

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

    Sleep(1000)

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

    Send("!J");

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

    Func _MouseClickMinimized($Window = "Unbenannt - Editor", $Button = "left", $X = "25", $Y = "151", $Clicks = 1, $handle = 0)
    Local $MK_LBUTTON = 0x0001
    Local $WM_LBUTTONDOWN = 0x0201
    Local $WM_LBUTTONUP = 0x0202
    Local $MK_RBUTTON = 0x0002
    Local $WM_RBUTTONDOWN = 0x0204
    Local $WM_RBUTTONUP = 0x0205
    Local $WM_MOUSEMOVE = 0x0200
    Local $i = 0
    if $handle = 1 Then
    Local $winhandle = $Window
    Elseif $handle = 0 Then
    Local $winhandle = WinGetHandle($Window)
    EndIf
    Select
    Case $Button = "right"
    $Button = $MK_RBUTTON
    $ButtonDown = $WM_RBUTTONDOWN
    $ButtonUp = $WM_RBUTTONUP
    Case $Button = "left"
    $Button = $MK_LBUTTON
    $ButtonDown = $WM_LBUTTONDOWN
    $ButtonUp = $WM_LBUTTONUP
    Case Else ;; CPF
    ;; illegal number of parameters?
    ;~ MsgBox(32, "KCH: Problem", "_MouseClickPlus() called with bad number of params?")
    Return
    EndSelect
    ;; makes no sense to send click to minimized window with current mouse coordinates
    If $X = "" Or $Y = "" Then
    ;; illegal number of parameters?
    ;~ MsgBox(32, "KCH: Problem", "_MouseClickPlus() called with bad number of params?")
    Return
    EndIf
    For $i = 1 To $Clicks
    DllCall("user32.dll", "int", "SendMessage", _
    "hwnd", $winhandle, _
    "int", $WM_MOUSEMOVE, _
    "int", 0, _
    "long", _MakeLong($X, $Y))
    DllCall("user32.dll", "int", "SendMessage", _
    "hwnd", $winhandle, _
    "int", $ButtonDown, _
    "int", $Button, _
    "long", _MakeLong($X, $Y))
    Sleep(10)
    DllCall("user32.dll", "int", "SendMessage", _
    "hwnd", $winhandle, _
    "int", $ButtonUp, _
    "int", $Button, _
    "long", _MakeLong($X, $Y))
    Next
    EndFunc ;==>_MouseClickMinimized

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

    Func _MakeLong($LoWord, $HiWord)
    Return BitOR($HiWord * 0x10000, BitAND($LoWord, 0xFFFF))
    EndFunc ;==>_MakeLong

    [/autoit]


    Die Func _MakeLong fehlt. ;)

    • Offizieller Beitrag
    Zitat

    Edit: die werte bei der Deklaration der Local Konstanten habe ich mal in "" gesetzt um sicher zu gehen, dass es nicht daran liegt....

    Das ist Blödsinn, damit wird aus einer Hexzahl ein String.
    Hab das in deinem Script auch nicht ausgebessert, weil ich es erst garnicht gesehen habe.

    Spoiler anzeigen
    [autoit]

    #include-once

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

    sleep(2000)
    Run("notepad.exe")
    Run("C:\Program Files (x86)\AutoIt3\Au3Info.exe")

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

    ; Wait for the Notepad become active - it is titled "Untitled - Notepad" on English systems
    sleep(10000)
    WinWait("Unbenannt - Editor")
    ;WinActivate("[CLASS:Edit; INSTANCE:1]")
    _MouseClickMinimized()
    ; Now that the Notepad window is active type some special characters
    ;If WinActive("Unbenannt - Editor", "") = 0 Then WinActivate("Unbenannt - Editor", "")
    MouseClick("", "50", "200")
    ;Send("!{TAB}", 1)

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

    WinWaitActive("Unbenannt - Editor", "")
    Send("Sending some special characters:{ENTER 2}")

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

    ; Do it the first way
    Send("First way: ")
    Send("{!}{^}{+}{#}")
    Send("{ENTER}")

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

    ; Do it the second way (RAW mode, notice the second parameter is 1)
    Send("Second way: ")
    Send("!^+#", 1)

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

    Send("{ENTER}{ENTER}Finished")
    WinClose("[ACTIVE]", "")

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

    Send("!S");
    ; Finished!
    WinWaitActive("Der Pfad ist nicht verfügbar", "OK")

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

    ControlClick("Der Pfad ist nicht verfügbar", "OK", "Button1")

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

    WinWait("Speichern unter")
    WinActivate("Speichern unter")

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

    ControlSend("Speichern unter", "", "[CLASS:Edit; INSTANCE:1]", "C:\autoit\autoit.txt")

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

    Send("!S");
    MouseClick("", "50", "50")
    WinWaitActive("Administrator: C:\Windows\system32\cmd.exe")

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

    ;Send("exit{ENTER}")

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

    Sleep(1000)

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

    Send("!J");

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

    Func _MouseClickMinimized($Window = "Unbenannt - Editor", $Button = "left", $X = "25", $Y = "151", $Clicks = 1, $handle = 0)
    Local $MK_LBUTTON = 0x0001
    Local $WM_LBUTTONDOWN = 0x0201
    Local $WM_LBUTTONUP = 0x0202
    Local $MK_RBUTTON = 0x0002
    Local $WM_RBUTTONDOWN = 0x0204
    Local $WM_RBUTTONUP = 0x0205
    Local $WM_MOUSEMOVE = 0x0200
    Local $i = 0
    if $handle = 1 Then
    Local $winhandle = $Window
    Elseif $handle = 0 Then
    Local $winhandle = WinGetHandle($Window)
    EndIf
    Select
    Case $Button = "right"
    $Button = $MK_RBUTTON
    $ButtonDown = $WM_RBUTTONDOWN
    $ButtonUp = $WM_RBUTTONUP
    Case $Button = "left"
    $Button = $MK_LBUTTON
    $ButtonDown = $WM_LBUTTONDOWN
    $ButtonUp = $WM_LBUTTONUP
    Case Else ;; CPF
    ;; illegal number of parameters?
    ;~ MsgBox(32, "KCH: Problem", "_MouseClickPlus() called with bad number of params?")
    Return
    EndSelect
    ;; makes no sense to send click to minimized window with current mouse coordinates
    If $X = "" Or $Y = "" Then
    ;; illegal number of parameters?
    ;~ MsgBox(32, "KCH: Problem", "_MouseClickPlus() called with bad number of params?")
    Return
    EndIf
    For $i = 1 To $Clicks
    DllCall("user32.dll", "int", "SendMessage", _
    "hwnd", $winhandle, _
    "int", $WM_MOUSEMOVE, _
    "int", 0, _
    "long", _MakeLong($X, $Y))
    DllCall("user32.dll", "int", "SendMessage", _
    "hwnd", $winhandle, _
    "int", $ButtonDown, _
    "int", $Button, _
    "long", _MakeLong($X, $Y))
    Sleep(10)
    DllCall("user32.dll", "int", "SendMessage", _
    "hwnd", $winhandle, _
    "int", $ButtonUp, _
    "int", $Button, _
    "long", _MakeLong($X, $Y))
    Next
    EndFunc ;==>_MouseClickMinimized

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

    Func _MakeLong($LoWord, $HiWord)
    Return BitOR($HiWord * 0x10000, BitAND($LoWord, 0xFFFF))
    EndFunc ;==>_MakeLong

    [/autoit]
  • hi,

    danke, erledigt, macht trotzdem nicht was es soll, erst wenn ich auf den session0 desktop gehe und einen klick in notepad mache, gehts weiter....
    so wird das nichts mit vollautomatisch generierten reports aus einem programm. (der obige code ist nur als test zum nachstellen der situation gedacht)

    grüße

  • Hallo Leute,

    also ich ziehe ein Fazit aus den ganzen Gesprächen,
    es ist schlichtweg nicht möglich eine AutoIt Konfiguration automatisch als Task, weder per Batch-Datei Ansteuerung, noch als Dienst auf dem Session 0 Desktop
    vollautomatisch laufen zu lassen, ohne dass ein Benutzer angemeldet ist.
    Falls mir jemand widersprechen kann, nur her damit :)

    Viele Grüße