Entwickler-Ecke

Windows API - Prüfen, ob ein Prozess Adminrechte hat


LittleBen - Mi 07.11.12 22:02
Titel: Prüfen, ob ein Prozess Adminrechte hat
Guten Abend,
gibt es eine Funktion, mit der man anhand der PID (oder des Handles) feststellen kann, ob der Prozess über Adminrechten verfügt?
Die Funktion zum Überprüfen, ob der User diese Rechte hat, ist mir bekannt.

Viele Grüße,
Littleben


ChrisCross - Mi 07.11.12 22:27

http://www.delphi-treff.de/tipps/system/benutzerverwaltung/auf-administratorrechte-pruefen

Meinst du so etwas? Oder habe ich dich falsch verstanden?

/Edit: :autsch: das weißt du ja bereits


LittleBen - Mi 07.11.12 22:32

:zustimm: Jup, das kenn ich schon ;)


elundril - Do 08.11.12 02:22

Soweit ich herausgefunden habe laufen Prozesse die mit UAC gestartet wurden im Integrity-Mode "High". Demnach könntest du einfach den Integrity-Mode eines Prozesses herausfinden und nachsehen ob dieser auf High gesetzt ist. Wie man das macht findest du auf dieser MSDN-Seite [http://msdn.microsoft.com/en-us/library/bb625966.aspx]

lg elundril


LittleBen - Do 08.11.12 16:24

Vielen Dank! Das ist das, was ich gesucht habe. Nur habe ich noch ein kleines verständnis Problem.
GetCurrentProcess gibt laut MSDN nur ein pseudo Handle zurück und um die Rechte eines anderen Prozesses herauszubekommen, muss ich ja dessen pseudo Handle herausfinden. Nur wie?

Zitat:
A pseudo handle is a special constant, currently (HANDLE)-1, that is interpreted as the current process handle. For compatibility with future operating systems, it is best to call GetCurrentProcess instead of hard-coding this constant value. The calling process can use a pseudo handle to specify its own process whenever a process handle is required. Pseudo handles are not inherited by child processes.

http://msdn.microsoft.com/en-us/library/windows/desktop/ms683179%28v=vs.85%29.aspx


jaenicke - Do 08.11.12 16:34

Du kannst auch den Prozess mit OpenProcess [http://msdn.microsoft.com/en-us/library/windows/desktop/ms684320(v=vs.85).aspx] öffnen, dann hast du ein "richtiges" Handle. ;-)


LittleBen - Do 08.11.12 21:02

Aber dieses "richtige" Handle kann ja an der stelle OpenProcessToken gar nicht gebrauchen :P

Hier der gefundene Code:
http://www.plugins-soft.com/articles/integritylevel.html


jaenicke - Do 08.11.12 23:09

user profile iconLittleBen hat folgendes geschrieben Zum zitierten Posting springen:
Aber dieses "richtige" Handle kann ja an der stelle OpenProcessToken gar nicht gebrauchen :P
:gruebel: :?!?:

Du gibst das einfach an OpenProcessToken und fertig. :nixweiss: Die Funktion ist mit einem richtigen Handle genauso glücklich wie mit dem Pseudohandle für den eigenen Prozess, warum auch nicht?


LittleBen - Do 08.11.12 23:15

Nönönö :P Gibt eine Exception aus (Code kommt morgen, PC schon aus).


jaenicke - Do 08.11.12 23:49

Dann liegt das vielleicht daran:
Zitat:
The process must have the PROCESS_QUERY_INFORMATION access permission.
Welchen Fehlercode bekommst du denn?


LittleBen - Fr 09.11.12 23:02

PROCESS_QUERY_INFORMATION habe ich als Argument drin...
Ich bekomme die Fehlermeldung: "Externe Exception C0000008"


jaenicke - Fr 09.11.12 23:19

Mit ansonsten dem geposteten Quelltext?


LittleBen - Fr 09.11.12 23:42

Entschuldigung, ich nehme alles zurück... :autsch:
Ich habe per OpenProcess probiert, ein Prozess mit Administratorrechten zu öffnen und danach nicht abgefragt, ob der Wert 0 ist. Und da ich diesen Prozess nicht öffnen darf, war das Handle 0. Kann ich das Handle auch ohne Adminrechte herausfinden?


Martok - Sa 10.11.12 00:48

Du kannst das dann ja triangulieren ;)

Wenn du Admin bist, bekommst du ein Handle und davon eine korrekte Antwort.
Wenn du nicht Admin bist, bekommst du entweder Handle&Antwort (die dann "nein" ist) oder kein Handle, was bedeutet dass der Prozess ein höheres Level hat und dann höchstwahrscheinlich entweder Admin oder SystemService ist... :zwinker:


LittleBen - Sa 10.11.12 11:49

Das ist natürlich eine sehr saubere Lösung :P Werde es nachher mal ausprobieren.

EDIT: Wo wir schon beim Thema sind ist mir eingefallen: Ist es möglich dieses Integrity Level eines Prozesses zu verändern (angenommen man ist Admin)?


jaenicke - Sa 10.11.12 16:33

Man kann nicht nachträglich den Adminstatus ändern, nein. Aus Sicherheitsgründen wird ausschließlich beim Starten eines Prozesses entschieden, ob dieser als Admin läuft oder nicht. Hinterher lässt sich das nicht ändern.