Pfad eines Prozesses ermitteln



  • Hallo Community,

    habe folgende Problemstellung:
    Habe ein Programm, welches diverse Abläufe steuern soll.
    Unter anderem wird hierbei ein (evtl. auch mehrere) Programm(e) gestartet, welches erweiterte Rechte benötigt.
    Nun muss ich im weiteren Verlauf überprüfen, ob der entsprechende Prozess noch läuft. Um sicherzustellen, dass es sich genau um diese Datei handelt, benötige ich den Pfad des 'Prozesses'.
    Mit CreateToolhelp32Snapshot kann ich zwar ermitteln, ob ein Prozess mit dem Namen läuft, aber die weiterführende Ermittlung über TH32CS_SNAPMODULE(32), schlägt aufgrund der Rechte fehl, ebenso wie OpenProcess mit PROCESS_QUERY_INFORMATION.
    Gibt es irgend eine andere Funktion, bzw. Möglichkeit, wie ich mit "standard"-Rechten den Pfad eines Prozesses auslesen kann?

    Danke schon mal im vorab.



  • UAC Prob schrieb:

    Nun muss ich im weiteren Verlauf überprüfen, ob der entsprechende Prozess noch läuft.

    Warum? Musst du tatsächlich prüfen ob das Programm noch läuft oder nicht vielleicht doch einfach nur drauf warten, dass es beendet?


  • Mod

    Der Task-Manager kann es auch ohne erhöhte Rechte.
    Ich vermute er verwendet GetProcessImageFileName
    http://msdn.microsoft.com/en-us/library/windows/desktop/ms683217(v=vs.85).aspx

    GetModuleFileNameEx gibt es auch, aber dazu gibt es einige Einschränkungen, siege MSDN (wie immer).



  • Wenn du das Programm selbst gestartet hast, hast du doch schon ein Prozess-Handle, von dem du weißt, daß es zum richtigen Programm gehört. Und damit kannst du z.B. WaitForSingleObject() füttern, um herauszubekommen, ob der Prozess beendet wurde.

    (den Pfad des zugehörigen Programms zu verwenden halte ich für eher kontraproduktiv - was machst du, wenn jemand die von dir gestartete EXE nochmal manuell ausführt?)



  • @dot
    Es geht nicht darum auf das Ende des Programms zu warten, sondern zu überprüfen, ob es noch läuft.

    @Martin
    Ich müsste hierfür das Recht PROCESS_QUERY_INFORMATION besitzen. Dieses ist aber nicht der Fall, da ich das Prog über ShellExecuteEx starte. Mein Programm wird mit "asInvoker" gestartet und startet ein anderes Programm welches erweiterte Rechte benötigt, und dann Benutzerinteraktion erfordert (komme ich leider nicht dran vorbei, da ich aus Sicherheitsgründen nicht den kompletten Ablauf als Admin durchführen möchte - und es mir wenn möglich ersparen möchte in meinem Tool die Rechte vorab zu holen/setzen - dieser Ablauf ist allerdings auch nicht zwingend erforderlich, da entsprechendes Programm [welches erweiterte Rechte benötigt] auch nur unter bestimmten Vorraussetzungen gestartet wird)

    @CStoll
    Sofern ich ShellExecuteEx verwende und nicht die entsprechenden Flags setze, bekomme ich keine ProcessID - nein ich möchte nicht auf das "Ende" des Prossezes prüfen 😕, sondern lediglich, ob dieser noch läuft, da entsprechende Abläufe getätigt werden.
    Zum Zitat "kontraproduktiv":
    Es gibt gewisse Programme, die als 32 Bit und 64 Bit vorhanden sind 😉 und gerade hier ist es entscheidend, wenn der User die Möglichkeit hat das entsprechende Programm "zwischendurch" zu starten, herauszubekommen welcher Pfad hinter dem entsprechenden Prozessen liegt.

    PS: Danke nochmal an die Hilfesteller



  • Ich ach das in diesem Fall über WMI und funktioniert sehr gut....


  • Mod

    Der Einwand von CStoll ist korrekt. Du kannst ein Handle bekommen und damit auch prüfen, ob er noch läuft. Mit WaitForSingleObject kann man auch das (Wartezeit 0) und prüfen ob signalisiert.
    Sofern Du ihn wie gesagt gestartet hast...



  • Martin Richter schrieb:

    ...Mit WaitForSingleObject kann man auch das (Wartezeit 0) und prüfen ob signalisiert.

    Danke für den Schlag mit dem Hammer (Wartezeit) - manchmal sieht man den Wald vor lauter Bäumen nicht.

    @Jochen
    WMI werd' ich mir auch mal genauer unter die Lupe nehmen.


Anmelden zum Antworten