AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Von ProcessHandle zur ProcessID?
Thema durchsuchen
Ansicht
Themen-Optionen

Von ProcessHandle zur ProcessID?

Ein Thema von Zacherl · begonnen am 7. Jul 2007 · letzter Beitrag vom 10. Jun 2009
Antwort Antwort
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#1

Von ProcessHandle zur ProcessID?

  Alt 7. Jul 2007, 14:17
Hey,

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

Gruß
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Von ProcessHandle zur ProcessID?

  Alt 7. Jul 2007, 15:30
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.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#3

Re: Von ProcessHandle zur ProcessID?

  Alt 7. Jul 2007, 15:38
Über ShellExecuteEx .. egal macht auch nichts .. habs jetzt über CreateProcess gemacht. Da bekomme ich auch die PID.
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#4

Re: Von ProcessHandle zur ProcessID?

  Alt 14. Jul 2007, 12:50
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 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.
  Mit Zitat antworten Zitat
shadowman

Registriert seit: 1. Nov 2005
48 Beiträge
 
#5

Re: Von ProcessHandle zur ProcessID?

  Alt 9. Jun 2009, 20:30
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
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#6

Re: Von ProcessHandle zur ProcessID?

  Alt 9. Jun 2009, 20:34
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.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#7

Re: Von ProcessHandle zur ProcessID?

  Alt 9. Jun 2009, 20:36
Genau, OpenProcess ist schon richtig, um das Handle eines Prozesses anhand der PID zu ermitteln, allerdings scheinen deine Parameter fehlerhaft zu sein. Versuch mal:
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 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.
  Mit Zitat antworten Zitat
Fridolin Walther

Registriert seit: 11. Mai 2008
Ort: Kühlungsborn
446 Beiträge
 
Delphi 2009 Professional
 
#8

Re: Von ProcessHandle zur ProcessID?

  Alt 10. Jun 2009, 08:43
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.
Fridolin Walther
  Mit Zitat antworten Zitat
brechi

Registriert seit: 30. Jan 2004
823 Beiträge
 
#9

Re: Von ProcessHandle zur ProcessID?

  Alt 10. Jun 2009, 09:51
GetProcessID für win95+ gibts hier: (auch wenns jetzt nicht gesucht wird)

http://uall.cheat-project.com/uallCollection/
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:36 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