Ausführen einer Anwendung anhalten.

  • Hallo liebe Autoit Community,

    ich hoffe einer von euch kann mir weiterhelfen.
    Meine Frage ist ob es möglich währe Anwendungen ( .exe Dateien ) vor dem Ausführen zu überprüfen.
    Beispiel:
    Ich starte eine Datei. Genau dann soll das Script das Ausführen der Datei stoppen und den Pfad in eine Textdatei schreiben.
    Geht das überhaupt ? Und wenn ja kann mir jemand zeigen wie ? ;)

    Grüße
    derBrot

  • huhu,
    probier mal diese UDF aus (aus dem Englischen Forum)
    (10sekunden googlen)

    Spoiler anzeigen
    [autoit]

    Func _ProcessSuspend($process)
    $processid = ProcessExists($process)
    If $processid Then
    $ai_Handle = DllCall("kernel32.dll", 'int', 'OpenProcess', 'int', 0x1f0fff, 'int', False, 'int', $processid)
    $i_sucess = DllCall("ntdll.dll","int","NtSuspendProcess","int",$ai_Handle[0])
    DllCall('kernel32.dll', 'ptr', 'CloseHandle', 'ptr', $ai_Handle)
    If IsArray($i_sucess) Then
    Return 1
    Else
    SetError(1)
    Return 0
    Endif
    Else
    SetError(2)
    Return 0
    Endif
    EndFunc

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

    Func _ProcessResume($process)
    $processid = ProcessExists($process)
    If $processid Then
    $ai_Handle = DllCall("kernel32.dll", 'int', 'OpenProcess', 'int', 0x1f0fff, 'int', False, 'int', $processid)
    $i_sucess = DllCall("ntdll.dll","int","NtResumeProcess","int",$ai_Handle[0])
    DllCall('kernel32.dll', 'ptr', 'CloseHandle', 'ptr', $ai_Handle)
    If IsArray($i_sucess) Then
    Return 1
    Else
    SetError(1)
    Return 0
    Endif
    Else
    SetError(2)
    Return 0
    Endif
    EndFunc

    [/autoit]
  • Die von Alcros genannte Lösung funktioniert allerdings nur, wenn bekannt ist, welcher Prozess denn neu geöffnet wurde. ;)
    Ich wüsste jedoch keine Möglichkeit, zuverlässig zu überwachen, ob überhaupt bzw. welche EXE gestartet wurde.

    Dazu müsste man wohl ein Event im Betriebssystem abfangen...

    chess

  • richtig, ich meine etwa so :

    [autoit]

    $aProcessList1 = ProcessList()
    MsgBox(0,"Anzahl Prozesse",UBound($aProcessList1)-1)
    $aProcessList2 = ProcessList()
    MsgBox(0,"Anzahl Prozesse",UBound($aProcessList2)-1)

    [/autoit]


    wenn die Anzahl nun größer wird, weißt du , dass ein neuer Prozess da ist.
    Dann gehste mit ner For-Schleife durch die Liste durch und der Prozess, der vorher net in der Liste war, muss dann der neue sein

  • In der ProcessList sind doch nur prozesse die schon ausgeführt sind oder ?


    Ja.

    Das was Du brauchst ist ein systemweiter Hook. Den kann man AFAIK nur in einer DLL realisieren. Außerdem braucht man da einiges an Hintergrundwissen über das OS, denn mit einem systemweiten Hook kannst Du das gaze OS lahm legen.


    Greenhorn


  • das ist nicht so schwer wie man denkt
    du brauchst eigentlich nur einen einzigen Registry eintrag ändern

    wobei ich das nicht als "gut" gelungende Lösung betiteln würde wenn man an solch einer stelle im system arbeitet
    diverse Viren bedienen sich an dieser Stelle (i.d.R. fake Antivirenprogramme und melden dann bei jedem programm das du startest dass es potenziel gefährlich sei und man die Vollversion kaufen muss xD)

    wie das geht steht hier:
    http://antivirus.about.com/od/windowsbasics/a/shellopen.htm
    den registry eintrag müsstest du dann (glaube) so abändern

    Code
    HKEY_CLASSES_ROOT\exefile\shell\open\command
    REG_SZ= C:\Pfad\Programm.exe "%1" %*


    das bewirkt dass dein Programm immer ausgeführt wird, bevor eine .exe gestartet wird und dein programm Ja oder Nein sagen muss

    ich weiß aber nicht wie dein programm dann reagieren muss, weil es wird mit diversen Parametern geöffnet und muss dann irgentwie returnen ob das Programm ausgeführt werden soll oder nicht
    da könnte dir wohl nur ein viren hersteller helfen xD

    aber ich hoffe ich konnte etwas helfen
    mfg Krabat ;)

  • Hab ich schonmal probiert, das problem ist das ich keine Möglichkeit sehe wie ich mit AutoIt dann die exe Datei starten soll ohne das es sich wieder selbst aufruft.

  • Hab ich schonmal probiert, das problem ist das ich keine Möglichkeit sehe wie ich mit AutoIt dann die exe Datei starten soll ohne das es sich wieder selbst aufruft.

    hab kurz ne sekunde gegoogelt und wenn der treffer nicht totaler müll war reicht ein Exit True
    bzw. Exit 1 in DEINEM programm und die .exe die ursprünglich geöffnet werden sollte wird geöffnet

    und bei einem Exit False (also Exit 0 standart) wird die ausführung verweigert
    du darfst natürlich innerhalb deines programms dann nicht das programm ausführen! (via ShellExecute oder Run)

    ist ja logisch, dass dann ein paradoxon entsteht xD
    also, der exitcode deines programms entscheidet dann
    der wird dann von Windows ausgewertet und entscheidet über das weitere geschehen

    somit sollte man sich nur noch die parameter angucken, die an das programm übergeben werden
    die enthalten dann Dateiname etc.

    mfg

    PS: hab das nicht getestet mit den return werten, aber ich hoffe das google mir was richtiges angezeigt hat :D

    Einmal editiert, zuletzt von Krabat (22. Februar 2013 um 19:53)