Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Von ProcessHandle zur ProcessID? (https://www.delphipraxis.net/95495-von-processhandle-zur-processid.html)

Zacherl 7. Jul 2007 14:17


Von ProcessHandle zur ProcessID?
 
Hey,

ich steh grade aufm Schlauch .. irgendeine einfache Funktion war das .. ich hab nur den Namen vergessen :wall: Kann mir kurz jemand helfen?

Gruß

SirThornberry 7. Jul 2007 15:30

Re: Von ProcessHandle zur ProcessID?
 
wie kommst du denn an das Prozesshandle? anhand eines WindowHandles wüsste ich wie man die ProzessID bekommt aber um ein Prozesshandle zu bekommen nutzt man eigentlich die ProzessID. Bei dir scheints aber umgekehrt zu sein, daher eben die Frage wie du an das Prozesshandle kommst.

Zacherl 7. Jul 2007 15:38

Re: Von ProcessHandle zur ProcessID?
 
Über ShellExecuteEx .. egal macht auch nichts .. habs jetzt über CreateProcess gemacht. Da bekomme ich auch die PID.

Olli 14. Jul 2007 12:50

Re: Von ProcessHandle zur ProcessID?
 
Zitat:

Zitat von SirThornberry
wie kommst du denn an das Prozesshandle? anhand eines WindowHandles wüsste ich wie man die ProzessID bekommt aber um ein Prozesshandle zu bekommen nutzt man eigentlich die ProzessID. Bei dir scheints aber umgekehrt zu sein, daher eben die Frage wie du an das Prozesshandle kommst.

Nicht notwendigerweise ;)

MSDN-Library durchsuchenGetCurrentProcess gibt bspw. nicht das echte Handle, sondern nur ein Pseudo-Handle zurück. Die Frage ist also schon von daher berechtigt.

Zitat:

Zitat von Zacherl
Über ShellExecuteEx .. egal macht auch nichts .. habs jetzt über CreateProcess gemacht. Da bekomme ich auch die PID.

Ich bin verwirrt! Hättest du dein Problem einfach mal auf Englisch formuliert, hättest du im Handumdrehen deine Antwort gefunden mit: das hProcess aus der SHELLEXECUTEINFO-Struktur einfach an GetProcessId übergeben.

shadowman 9. Jun 2009 20:30

Re: Von ProcessHandle zur ProcessID?
 
Zitat:

Zitat von SirThornberry
wie kommst du denn an das Prozesshandle? anhand eines WindowHandles wüsste ich wie man die ProzessID bekommt aber um ein Prozesshandle zu bekommen nutzt man eigentlich die ProzessID. Bei dir scheints aber umgekehrt zu sein, daher eben die Frage wie du an das Prozesshandle kommst.

Hallo,
die Beiträge hier sind schon etwas älter, aber ich hoffe hier dennoch die Lösung für mein Problem finden zu können.

In der zitierten Antwort hört es sich so an, als wäre es möglich, von der ProcessID zu ProcessHandle zu kommen. Genau das brauche ich, jedoch scheint es alles andere als einfach zu sein.

Wie mache ich das denn?

Ich brauche es, um unter Vista prüfen zu können, ob ein Programm mit den "echten" Adminrechten läuft oder nicht.

Hierfür habe ich eine Funktion gefunden, die u.a. das hier macht:
Delphi-Quellcode:
[...]
         bSuccess := OpenProcessToken(GetCurrentProcess, TOKEN_QUERY, hAccessToken);
[...]
Hier wird allerdings meine eigene Anwendung verwendet (GetCurrentProcess). Da ich das auch für andere Anwendungen einsetzen wollte, habe ich die Funktion so angepasst, dass man Prozess-Handle übergibt (das liefert GetCurrentProcess ja zurück, bloß zu der eigenen Anwendung, oder?).

Über den Exe-Namen ermittle ich die Prozess-ID und bräuchte nun das Prozess-Handle.

Habe hierzu diesen Code gefunden und ausprobiert:
Delphi-Quellcode:
   try
      result := OpenProcess(SYNCHRONIZE, False, ID);
   finally
      CloseHandle(result);
   end;
Jedoch scheint OpenProcess nicht richtig zu funktionieren. Die Werte ändern sich bei jedem Aufruf und daher kann es keinen eindeutigen Werte geben, denke ich. OpenProcessToken liefert dann immer "false" zurück, so dass die Prüfung nach den Rechten gar nicht erst stattfindet.

Irgendwo habe ich gelesen, dass OpenProcess unter Vista generell nicht richtig funktioniert.

Ob der Weg bisher der richtige ist und ich mache dabei was falsch oder ob es der falsche Weg ist: die Frage ist in beiden Fällen gleich:

Wie komme ich von der PID zum Prozess-Handle?
Muss ich das überhaupt, um die Rechte nicht nur der eigenen Anwendung zu prüfen (s.o.) oder geht es irgendwie anders?

Das Thema müsste ja für die meisten Entwickler früher oder später interessant und wichtig werden, so dass ich gedacht hätte, dass es da mit Sicherheit Lösungen geben müsste, jedoch scheint es viele viele diverse Code-Beispiele und Ansätze zu geben, jedoch nichts endgültiges, was funktioniert.

Wäre schön, wenn jemand etwas Licht ins Dunkel bringen könnte :)

Apollonius 9. Jun 2009 20:34

Re: Von ProcessHandle zur ProcessID?
 
Handles sind Handles. Die ID eines Prozesses oder eines Threads ist bis zum Tod eindeutig. Handles sind hingegen einfach Bezeichner. Sie identifizieren nicht das Objekt, sondern eine Beziehung zu einem Objekt (irgendjemand hat Handle mal mit Henkel übersetzt). Daher ist es auch kein Wunder, dass der Rückgabewert bei jedem Aufruf anders ist. Bezüglich OpenProcessToken solltest du mal die Dokumentation lesen.
Zitat:

A handle to the process whose access token is opened. The process must have the PROCESS_QUERY_INFORMATION access permission.
Wenn du das Handle also lediglich mit SYNCHRONIZE öffnest, solltest du dich nicht wundern. Des Weiteren gibt es diese tolle Funktion GetLastError.

Zacherl 9. Jun 2009 20:36

Re: Von ProcessHandle zur ProcessID?
 
Genau, OpenProcess ist schon richtig, um das Handle eines Prozesses anhand der PID zu ermitteln, allerdings scheinen deine Parameter fehlerhaft zu sein. Versuch mal:
Delphi-Quellcode:
hProcess := OpenProcess(PROCESS_ALL_ACCESS, false, PID);
Das Handle sollte dann gültig sein, ist aber wie schon erwähnt bei jedem Aufruf verschieden.

Edit: Dass OpenProcess() unter Vista nicht mehr funktioniert stimmt auf keinen Fall :mrgreen: Währe ja schlimm ..
Edit: Okay es wird nicht funktionieren, wenn du mit einem restrikted Token Programm versuchst eine elevated Application zu öffnen, aber das ist auch nur ein Rechte Problem. Startest du bei aktivierter UAC deine Anwendung als Administrator, kannst du selbstverständlich alle Programmhandles öffnen. Nur für SYSTEM Prozesse benötigst du weitere Debug Privilegien.

Fridolin Walther 10. Jun 2009 08:43

Re: Von ProcessHandle zur ProcessID?
 
Auch wenns völlig am derzeitigen Thema vorbei geht einige Ergänzungen zum Originalthema:

MSDN-Library durchsuchenGetProcessId ist erst ab Windows XP SP1 verfügbar. Davor kann man unter NT basierten Systemen NtQueryInformationProcess bemühen. Unter Windows 9x ist die Implementation ähnlich möglich, allerdings muss dort die Handle Table per "Hand" geparst werden, was allerdings nicht sonderlich schwer ist.

brechi 10. Jun 2009 09:51

Re: Von ProcessHandle zur ProcessID?
 
GetProcessID für win95+ gibts hier: (auch wenns jetzt nicht gesucht wird)

http://uall.cheat-project.com/uallCollection/


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:39 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz