AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

IsAdmin und UAC

Ein Thema von Delphi-Laie · begonnen am 21. Dez 2014 · letzter Beitrag vom 5. Jan 2015
Antwort Antwort
Seite 1 von 2  1 2      
Delphi-Laie

Registriert seit: 25. Nov 2005
1.474 Beiträge
 
Delphi 10.1 Berlin Starter
 
#1

IsAdmin und UAC

  Alt 21. Dez 2014, 12:19
Hallo Delphifreunde!

Zur Ermittlung der Rechte, die ein Programm (nicht das angemeldete Konto!) hat, benutze ich die bekannte Funktion IsAdmin, von der recht ähnliche Versionen an verschiedenen Stellen des Netzes zu finden sind. Diese funktioniert bis Windows XP gut, stößt jedoch bei der UAC, die ab Windows Vista existiert, an ihre Grenzen: Auch wenn ein Programm nicht (explizit) mit Administratorrechten gestartet wird, so wird, sofern das angemeldete Konto ein Administrationskonto ist, das Ergebnis "true" zurückgeliefert, hier werden also offensichtlich die Rechte des Kontos und nicht die des eigenen Programmes ermittelt. Jedoch muß man bei aktiv(iert)er UAC ja explizit ein Programm mit Administrationsrechten starten, damit es dieses auch erhält.

Deshalb meine Fragen:

1. Weiß jemand, ob es eine andere Möglichkeit oder eine Weiterentwicklung der Funktion IsAdmin gibt, mit der man auch unter der UAC die Rechte eines Programmes genau ermitteln kann?
2. Nur interessehalber: Wenn man das Programm nicht explizt als Administrator startet, welche (eingeschränkten) Rechte hat es dann: Benutzer, Hauptbenutzer, Gast oder welche sonst? Hängt vermutlich auch davon ab, mit welchen Kontotyp man angemeldet ist, also wohl nicht mit mehr Rechten, als das Konto hat.

Besten Dank im voraus und Gruß

Delphi-Laie
  Mit Zitat antworten Zitat
Lyan

Registriert seit: 5. Aug 2011
188 Beiträge
 
#2

AW: IsAdmin und UAC

  Alt 21. Dez 2014, 14:59
"Returns TRUE if the user is a member of the Administrator's group; otherwise, FALSE."

Die Funktion macht alles richtig, sie gibt dir zurück ob der User der Admingruppe angehört, oder nicht.
Hab mal schnell was in notepad zusammengestellt.. Sag mal bescheid ob es so funktioniert.^^

EDIT:// So kam jetzt zum Testen.. Also hier die funktionierende Funktion.

Delphi-Quellcode:
function CheckAdmin : boolean;
var
   hTok : THandle;
   ELV : TOKEN_ELEVATION;
   sz : DWORD;
begin
   Result := false;
   // Kannst anstatt den Rückgabewert von GetCurrentProcess() natürlich ein anderes Processhandle angeben.
   if OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, hTok) then
   begin
      sz := sizeof(TOKEN_ELEVATION);
      if GetTokenInformation(hTok, TokenElevation, @ELV, sizeof(ELV), sz) then
      begin
         Result := Boolean(ELV.TokenIsElevated); // Admin == true^^
      end;
      if hTok <> 0 then
         // token wieder schließen falls OpenProcessToken
         // erfolgreich war
         CloseHandle(hTok);
   end;
end;
// if CheckAdmin then showmessage('Admin!');


EDIT:// Neuwutel.

Du solltest dir vorher auf msdn die Funktionen genau durchlesen, bevor du von irgendwelchem "die Funktion stößt an ihre Grenzen" redest, obwohl die Funktion nicht für dein Vorhaben geeignet ist.

Sie ist dafür da, um herauszufinden ob der angemeldete Benutzer in der Admingruppe ist. Z.B. gibt es ja den "UAC bypass".

IQ FSK > 130:
http://download.pureftpd.org/pub/misc/UAC.cpp

Da wird z.B. gezeigt wie man die autoelevation die im Explorer stattfindet wenn man auf "more details"(windoof 8) oder "alle brohzesse anzeigen" (windows 7) klickt. (musste ich hier mal erwähnen, ist echt interessant).

Der bypass ist nur möglich, wenn der User sich in der Gruppe "Administrator" befindet => da wäre deine Funktion dann perfekt geeignet für um vorher zu prüfen ob wir den bypass nutzen können.

Zu deiner anderen Frage:

Im Normalfall hat nur das Gastkonto Gastrechte, die Rechte sind aber ziemlich gering für den Gast... #NNostalgie

Hab ich eigtl. erwähnt dass ich Iraner bin? Nein? Warum auch?

Geändert von Lyan (21. Dez 2014 um 16:57 Uhr)
  Mit Zitat antworten Zitat
Delphi-Laie

Registriert seit: 25. Nov 2005
1.474 Beiträge
 
Delphi 10.1 Berlin Starter
 
#3

AW: IsAdmin und UAC

  Alt 21. Dez 2014, 21:09
Erstmal vielen Dank! Ich werde mich morgen damit beschäftigen und dann wieder melden. Mir geht es nicht darum, herauszufinden, welche Rechte das Konto, sondern das Programm hat. Und da gibt es unter Windows XP sehr wohl einen Unterschied, wenn man in einem eingeschränkten Konto ein Programm als Administrator ausführen läßt: IsAdmin ermittelt die Rechte des Programmes, nicht die des Kontos. Nur unter der UAC klappt das eben nicht gleichermaßen.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: IsAdmin und UAC

  Alt 21. Dez 2014, 22:05
IsAdmin ermittelt die Rechte des Programmes, nicht die des Kontos. Nur unter der UAC klappt das eben nicht gleichermaßen.
NEIN, genau das ist eben das Problem.

Fast alle (alten) IsAdmin-Implementationen schauen nur "billig" nach, ob der Benutzeraccount in der Gruppe der Administratoren ist.
Vor dem UAC/Vista hatte das vielleicht noch funktioniert, auch wenn es schon immer falsch war, dieses zu prüfen. (es war einfach nur der "einfachste" Weg)

Denn ...
1. nur weil jemand in der Gruppe der Administratoren ist, kann ihm dennoch vieles verboten werden,
und seit UAC merkt man das besonders gut.
2. und außerdem ist es egal was der Benutzer ist, da man ja eigentlich wissen wollte, ob das Programm etwas darf.
3. man kann viele/alle Rechte jedem x-beliebigem Benutzer verpassen. Ja, es ist vollkommen erlaubt und vorallem möglich dem "Gast" alles zu erlauben und einem Admin alles zu verbieten.
PS: Niemand versucht das Gastkonto zu hacken, also eigentlich sogar der perfekte Schutz.

Lösung: Man schaut nach ob das Programm die gewünschten/benötigten Rechte besitzt, also man macht genau das, was man eigentlich machen wollte.
$2B or not $2B

Geändert von himitsu (21. Dez 2014 um 22:12 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.682 Beiträge
 
Delphi 5 Professional
 
#5

AW: IsAdmin und UAC

  Alt 21. Dez 2014, 22:06
Mir geht es nicht darum, herauszufinden, welche Rechte das Konto, sondern das Programm hat.
Kannst du das mal genauer ausführen? Programme haben nämlich gar keine Rechte sondern Nutzerkonten haben welche und je nachdem, unter welchem Nutzer ein Programm läuft, hat dann der laufende Prozess die Rechte (oder eben nicht).

Zitat:
Und da gibt es unter Windows XP sehr wohl einen Unterschied, wenn man in einem eingeschränkten Konto ein Programm als Administrator ausführen läßt: IsAdmin ermittelt die Rechte des Programmes, nicht die des Kontos.
Natürlich werden hier die Rechte des Kontos ermittelt! Mit der Funktion "Ausführen als" wird ein Programm unter einem anderen Nutzer ausgeführt - und der hat dann Adminrechte.

Zitat:
Nur unter der UAC klappt das eben nicht gleichermaßen.
Doch. Nur kann hier eben derselbe Prozess unterschiedliche Rechte haben, je nachdem, ob es elevated ausgeführt wird oder eben nicht; das sind zwei unterschiedliche Tokens.

MfG Dalai
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: IsAdmin und UAC

  Alt 21. Dez 2014, 22:18
Programme haben nämlich gar keine Rechte sondern Nutzerkonten haben welche und je nachdem, unter welchem Nutzer ein Programm läuft, hat dann der laufende Prozess die Rechte (oder eben nicht).
Auch falsch.
siehe MSDN-Library durchsuchenOpenProcessToken

Programme haben ihre eigenen Rechte (Sicherheits-Token) und egal was der Benutzer hat, kann man,
wenn man die Rechte dafür hat ... ähhh, wenn das/ein Programm (welches der Benutzer bedienen kann) die Rechte dafür hat,
jedem Programm auch mehr Rechte geben oder sie nehmen.
siehe z.B. Impersonation

Ja, standardmäßig werden Programmen die Rechte des Benutzers gegeben, bzw. die eingeschränkten UAC-Rechte,
aber man kann ein Programm mit anderen Rechten starten, oder sie nachträglich ändern.
$2B or not $2B

Geändert von himitsu (21. Dez 2014 um 22:34 Uhr)
  Mit Zitat antworten Zitat
Lyan

Registriert seit: 5. Aug 2011
188 Beiträge
 
#7

AW: IsAdmin und UAC

  Alt 22. Dez 2014, 11:05
Erstmal vielen Dank! Ich werde mich morgen damit beschäftigen und dann wieder melden. Mir geht es nicht darum, herauszufinden, welche Rechte das Konto, sondern das Programm hat. Und da gibt es unter Windows XP sehr wohl einen Unterschied, wenn man in einem eingeschränkten Konto ein Programm als Administrator ausführen läßt: IsAdmin ermittelt die Rechte des Programmes, nicht die des Kontos. Nur unter der UAC klappt das eben nicht gleichermaßen.
Naja ich hab dir ja eine Komplettlösung hingelegt..
  Mit Zitat antworten Zitat
Delphi-Laie

Registriert seit: 25. Nov 2005
1.474 Beiträge
 
Delphi 10.1 Berlin Starter
 
#8

AW: IsAdmin und UAC

  Alt 22. Dez 2014, 14:18
Naja ich hab dir ja eine Komplettlösung hingelegt..
Und das schöne ist: Die funktioniert genau so, wie ich es mir vorstellte und zu beschreiben versuchte. Dafür meinen allerherzlichsten Dank!!

Aus welchem Hut Ihr Genies solche Geniestreiche immer wieder hervorzaubert, wird mir wohl für ewig ein Rätsel bleiben.

Auch den anderen Diskussionsteilnehmern meinen Dank!

Dalai, ich bemühte mich doch zu beschreiben, was ich meinte: Ist man in einem UAC-haltigem Windows als Administrator unterwegs, muß man seinem Programm bei aktivierter UAC explizit vor dessen Start die Administrationsrechte geben. Die Funktion IsAdmin prüft, ob das Konto die Administratorrechte hat, nicht jedoch bei eigenen Programm. Inzwischen wiederhole ich mich. Ob das Programm Aministratorrechte hat (oder nicht) oder die Rechte des jeweiligen eingeschränkten bzw. Administratorkontos zugewiesen bekommt, ist m.E. fast schon Rabulistik.
  Mit Zitat antworten Zitat
Delphi-Laie

Registriert seit: 25. Nov 2005
1.474 Beiträge
 
Delphi 10.1 Berlin Starter
 
#9

AW: IsAdmin und UAC

  Alt 3. Jan 2015, 21:49
Vielleicht darf ich noch ergänzen, daß die hier vorgestellte Lösung wiederum unter "Nicht-UAC-NTx-Windows", also bis Windows XP nicht funktioniert.

Eine vollständige Funktion zur Ermittlung der Administratorrechte des eigenen (ggf. eines anderen?) Programmes bindet also IsAdmin und obigen Code ein und verwendet den jeweiligen Code entsprechend der ermittelten dwMajorVersion (bis 5 bzw. ab 6).

Geändert von Delphi-Laie ( 4. Jan 2015 um 12:04 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: IsAdmin und UAC

  Alt 4. Jan 2015, 00:59
Zitat:
also bis Windows XP nicht funktioniert
Und wen intesseiert das?

Die Unterstützlung solcher alten OS kann man getrost einstellen,
außer es geht um bestimmte Sonderfälle und wenn es um Sonderfälle geht, dann kann man dafür auch Sonderlösungen einbauen, welche genau dort funktionieren. (z.B. alten/speziellen Code, der für diese OS geschrieben wurden)

Außerdem war IsAdmin schon immer falsch und es hätte schon immer HasRight sein müssen.

IstKönig und dann kommt man nach England oder ein eines der anderen "Pseudokönigreiche" und schon ist das falsch, da man ja eigentlich HatRecht(GesetzeVerabschieden) haben wollte, weil das Programm ein neues Gesetz ProgrammererSteinigenDieIsAdminBenutzen rausbringen soll.
$2B or not $2B

Geändert von himitsu ( 4. Jan 2015 um 01:05 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 18:35 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