AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Per ProcessId prüfen, ob der Benutzer Admin ist (oder: ProcessId -> UserTokenHandle)
Thema durchsuchen
Ansicht
Themen-Optionen

Per ProcessId prüfen, ob der Benutzer Admin ist (oder: ProcessId -> UserTokenHandle)

Ein Thema von CodeX · begonnen am 15. Aug 2014 · letzter Beitrag vom 4. Sep 2014
Antwort Antwort
CodeX

Registriert seit: 30. Okt 2004
475 Beiträge
 
Delphi 12 Athens
 
#1

AW: Per ProcessId prüfen, ob der Benutzer Admin ist (oder: ProcessId -> UserTokenHand

  Alt 27. Aug 2014, 23:32
Falls es jemanden interessieren sollte: Ich bin dem Problem auf die Spur gekommen. Die Ursache für das "falsche" Ergebnis der Abfrage liegt darin, dass anscheinend das UserToken bei einem durch UAC kontrollierten Benutzerkonto nicht wirklich den Gruppen-Benutzer representiert, den man glaubt zu prüfen. Das UserToken ist ein eingeschränktes Token (klar) und ist daher wohl automatisch lediglich Mitglied der normalen Benutzergruppe (nicht so klar). Das echte Token des eingeloggten Benutzers ist das LinkedToken davon. Dieses hat nicht nur die echten Administrator-Rechte sondern nur dieses lässt sich auf die korrekte Gruppenzugehörigkeit prüfen.
Ich wundere mich nur, dass ich dutzende Beispiele zur Prüfung der Gruppenzugehörigkeit gefunden habe, aber in keinem auch nur ein Wort zu dieser Problematik verloren wurde. Arbeiten alle mit Windows XP? Oder ohne UAC? Oder merkt einfach keiner, dass der Test ein falsches Ergebnis liefert?

Naja, hier ein bisschen Code dazu (nur der relevante Teil zur Veranschaulichung!), falls irgendwann mal jemand über das gleiche Problem stoßen sollte. In dem Fall habe ich es mit JWSCL gelöst.
Delphi-Quellcode:
...
  DuplicateTokenEx(UserToken.LinkedToken.TokenHandle, MAXIMUM_ALLOWED, nil, SecurityImpersonation, TokenPrimary, hElevatedToken);
  UserTokenElevated := TJwSecurityToken.CreateDuplicateExistingToken(hElevatedToken, MAXIMUM_ALLOWED);
  UserTokenElevated.ConvertToImpersonatedToken(SecurityImpersonation, MAXIMUM_ALLOWED);
  if UserInGroup(DOMAIN_ALIAS_RID_ADMINS, UserTokenElevated.TokenHandle) then
...
Nur Delphi schafft es, einem ein Lächeln zu schenken, wenn man sich beim Schreiben von := vertippt und stattdessen ein :) erscheint.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.343 Beiträge
 
Delphi 12 Athens
 
#2

AW: Per ProcessId prüfen, ob der Benutzer Admin ist (oder: ProcessId -> UserTokenHand

  Alt 28. Aug 2014, 08:52
Wirklich nicht klar?

Das UAC simuliert doch das, was die Leute sich weigerten zu machen => Das Arbeiten als Benutzer und nur Admin wenn nötig.
* Programme arbeiten standardmäßig mit "Benutzer"-Rechten
* und nur wenn nötig, werden nach Rückfrage die vollen Rechte einem Programm gewährt.

Somit sollte auch klar sein, daß die Token im Programm normalerweise nur den eingeschränkten Rechten entsprechen dürften, denn sonst könnte sich das Programm ja darüber mehr Rechte besorgen.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
CodeX

Registriert seit: 30. Okt 2004
475 Beiträge
 
Delphi 12 Athens
 
#3

AW: Per ProcessId prüfen, ob der Benutzer Admin ist (oder: ProcessId -> UserTokenHand

  Alt 28. Aug 2014, 10:45
Somit sollte auch klar sein, daß die Token im Programm normalerweise nur den eingeschränkten Rechten entsprechen dürften
Es geht ja eben nicht um die Prüfung von Rechten, sondern von einer Gruppenzugehörigkeit. Das sind zwei verschiedene Paar Schuhe!
DOMAIN_ALIAS_RID_ADMINS fragt nach der Gruppe und eben nicht nach den zugehörigen Rechten. Ein Mitglied der Administratorgruppe muss nicht zwingend Administratorrechte haben - diese können über andere Richtlinien wieder eingeschränkt worden sein. Und umgekehrt.

Aber wenn das alles so klar ist, warum hast Du dann nicht vorher drauf hingewiesen?
Zudem wundere ich mich, dass zum Thema "Gruppenzugehörigkeit in Delphi prüfen" keine einzige Seite, auf der Codebeispiele zur Prüfung zu finden sind, auf diesen Umstand hinweist. Alle beschreiben schlicht die Prüfung des normalen UserTokens, was anscheinend seit Vista totaler Quatsch ist.
Nur Delphi schafft es, einem ein Lächeln zu schenken, wenn man sich beim Schreiben von := vertippt und stattdessen ein :) erscheint.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#4

AW: Per ProcessId prüfen, ob der Benutzer Admin ist (oder: ProcessId -> UserTokenHand

  Alt 28. Aug 2014, 12:12
Liste alle Mitglieder der Administratorengruppe auf und guck, ob ein Mitglied die SID des Benutzers hat, vom dem du wissen willst, ob er Admin-Privilegien hat.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.343 Beiträge
 
Delphi 12 Athens
 
#5

AW: Per ProcessId prüfen, ob der Benutzer Admin ist (oder: ProcessId -> UserTokenHand

  Alt 28. Aug 2014, 12:42
Des Benutzers, welcher grade den Desktop sieht (der, unter dessen Account die Session läuft), oder des Benutzers, welcher das Programm gestartet hat?

"Ausführen als ..."



Im Prinzip gibt es locker mal 4 Benutzertoken, von welchen man sich schon einen aussuchen sollte.
- der von der Session (ich vermute mal den will man hier wohl will)
- der UAC-Eingeschränkte, welchen Programme standardmäßig bekommen
- "Ausführen als ..."
- "Ausführen als ..." mit UAC-einschränkung


Dann kann man das gerne weitertreiben
- weitere "Ausführen als ..." von anderen Prozessen
- per Impersonate umgebogene Rechte einzelner Threads
- ...
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
CodeX

Registriert seit: 30. Okt 2004
475 Beiträge
 
Delphi 12 Athens
 
#6

AW: Per ProcessId prüfen, ob der Benutzer Admin ist (oder: ProcessId -> UserTokenHand

  Alt 28. Aug 2014, 12:47
Mein Usecase steht doch eigentlich schon in der Überschrift: ProcessId -> UserTokenHandle
Da gibt es imho keine Mehrdeutigkeiten, oder? Eine ProcessId kann nur zu einem Benutzer gehören und von diesem möchte ich wissen, ob er sich in der Administratorgruppe befindet.
Nur Delphi schafft es, einem ein Lächeln zu schenken, wenn man sich beim Schreiben von := vertippt und stattdessen ein :) erscheint.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#7

AW: Per ProcessId prüfen, ob der Benutzer Admin ist (oder: ProcessId -> UserTokenHand

  Alt 28. Aug 2014, 13:00
Über die ProcessID sollte man an den Benutzer und dessen SID kommen. Und dann sie mein Vorschlag.
Michael
Ein Teil meines Codes würde euch verunsichern.
  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 22:30 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz