Prozess überwachen

  • Hallo zusammen,

    ja, ich habe die Suchfunktion benutzt, aber auf mein Problem noch keine Lösung gefunden!
    Ich möchte in einer Endlosschleife nach einem bestimmten Prozess ausschau halten. Sobald dieser existiert, muss ich gewisse Aktionen ausführen.

    Bis jetzt mache ich das so:

    [autoit]


    $PID = WinGetProcess("", "ERP Workspace")
    If $PID <> -1 AND WinExists("ERP 0408") Then XYZ

    [/autoit]

    Das Problem ist, ich darf bei WinGetProcess nicht auf einen bestimmten Titel gehen, weil der Benutzer die EXE umbenannt haben könnte (kommt wirklich vor!)
    Aber der Text ERP Workspace kommt in diesem Prozess vor und ist ja auch für den Benutzer unveränderlich.
    Leider reicht das noch nicht. Denn wenn nun jemand in ein Notepad diesen Text schreibt, wir ja auch meine Aktion ausgeführt!
    Deshalb noch die Abfrage WinExist!

    Doch wenn jemand dummerweise ein Fenster offen hat, welches auch so heisst, dann läuft das auch nicht 100% zuverlässig!

    Meine Frage nun: Wie kann ich die Beschreibung eines Prozesses (siehe Taskmanager) auslesen?
    Zusätzlich: Ich kenne einige Schlüsselwörter, die in der Prozessbeschreibung vorkommen müssen. Doch leider nicht am Stück!
    Also Z.B. ERP Workspace 07045 Process Update Manager Die Zahl kann aber immer ändern.

    Wie kann ich sowas überprüfen?

    Vielen Dank für alle Anregungen!
    Veronesi

    Einmal editiert, zuletzt von veronesi (10. August 2010 um 15:09)

  • Hi,

    wenn nur die Zahl sich ändert, dann kannst du den StringRexExp Befehl benutzen.

    Schau einfach mal in der Hilfe nach.

    Wie man die Prozessbeschreibung ausliest, wäre ich im moment überfragt. Evtl. gibt es eine dll die man dazu nutzen könnte.

    Du könntest noch im englischen Forum nachschauen.

    Gruß

    Prajoss

    "Never touch a running System!"

  • Vielen Dank.
    Ja, ich könnte wirklich StringRegExp benutzen, um die Strings zu prüfen.

    Doch erst muss ich mal von allen laufenden Prozessen die Beschreibung auslesen können und diese dann per StringRegExp durchsuchen!

  • Es ist nicht die Beschreibung der Prozesse sondern die der Datei.
    Reicht dir also folgendes als Ansatz?:

    Spoiler anzeigen
    [autoit]

    $aList = ProcessList()

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

    For $i = 1 To $aList[0][0]
    $Beschreibung = GetProcessDescription($aList[$i][1])
    If @error Then ContinueLoop
    ConsoleWrite($aList[$i][0] & @TAB & $Beschreibung & @CRLF)
    Next

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

    ;Gibt die Beschreibung eines Prozesses zurück wie sie im Task-Manager angezeigt wird
    Func GetProcessDescription($PID)
    ;by AspirinJunkie
    $PID = ProcessExists($PID)
    If $PID = 0 Then Return SetError(1, 0, "")

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

    Local Const $Pfad = _GetProcessPath($PID)
    If @error Then Return SetError(2, @error, "")

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

    Local Const $Description = FileGetVersion($Pfad, "FileDescription")
    If @error Then Return SetError(3, @error, "")

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

    Return $Description
    EndFunc ;==>GetProcessDescription

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

    Func _GetProcessPath($hPID)
    ;by AspirinJunkie
    Local Static $oWMI = ObjGet("winmgmts:\\localhost\root\CIMV2")

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

    For $o In $oWMI.ExecQuery("SELECT ExecutablePath FROM Win32_Process WHERE ProcessID=" & $hPID, "WQL", 48)
    Return $o.ExecutablePath
    Next
    EndFunc

    [/autoit]