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 als Administrator ausführen (https://www.delphipraxis.net/193431-als-administrator-ausfuehren.html)

Willie1 30. Jul 2017 18:08

als Administrator ausführen
 
Hallo Leute,
in einem Programm von mir soll ein Zugriff auf die Registry stattfinden, der nur möglich ist, wenn das Programm mit der Option "Als Administrator ausführen"
gestartet wird.
Aus einem Beitrag in StackOverflow habe ich folgende Funktion entwickelt:
Delphi-Quellcode:
 function CheckTokenMembership(TokenHandle: THandle; SidToCheck: PSID; var IsMember: BOOL): BOOL; stdcall; external advapi32;

 function RunAsAdmin : Boolean;
 const
  SECURITY_NT_AUTHORITY: TSIDIdentifierAuthority = (Value: (0, 0, 0, 0, 0, 5));
  SECURITY_BUILTIN_DOMAIN_RID = $00000020;
  DOMAIN_ALIAS_RID_ADMINS    = $00000220;

 var
  pIdentifierAuthority :TSIDIdentifierAuthority;
  pSid : WinApi.Windows.PSid;
  IsMember : BOOL;
 begin
  pIdentifierAuthority := SECURITY_NT_AUTHORITY;
  Result := AllocateAndInitializeSid(pIdentifierAuthority, 2, SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0, pSid);
  try
    if Result then
      if not CheckTokenMembership(0, pSid, IsMember) then
         Result:= False
      else
         Result:=IsMember;
  finally
     FreeSid(pSid);
  end;
 end;
Sie gibt true zurück, wenn die genannte Option genutzt wird. Bei mir funktioniert sie. Frage:ist das so in Ordnung?

Gruß Willie.

CCRDude 30. Jul 2017 18:12

AW: als Administrator ausführen
 
(einmal überarbeitet und umgeworfen)

Ich verwende dazu bisher immer IsUserAnAdmin aus Shell32.dll. Dort wird Deine Variante als bessere Version empfohlen (und sieht dazu noch aus wie von genau jenem Beispiel inspiriert). Klingt also gut.

jaenicke 30. Jul 2017 20:12

AW: als Administrator ausführen
 
Ich würde schlicht schauen, ob ich auf die Registry entsprechend zugreifen kann.

Hintergrund:
Auf manchen Kundensystemen startet sich z.B. der Process Monitor nach dem Start immer wieder neu, weil er fälschlicherweise davon ausgeht, dass er keine Adminrechte hat. In Wirklichkeit hat er die aber. Da scheinen die Admingruppen anders zu sein.

Oder umgekehrt:
Es reicht doch einem Standarduser die nötigen Zugriffsrechte auf die Registry zu geben. Dann muss das Programm gar nicht als Admin gestartet werden.

Diese pauschale "auf Adminrechte prüfen" macht in meinen Augen genauso wenig Sinn wie die Prüfung auf eine bestimmte Windowsversion, dabei will man eigentlich nur vermeiden, dass ein Feature fehlt oder ähnliches und es dann unter unpassenden Windowsversionen Fehler gibt. Auch da sollte man lieber schauen, ob die Systemfunktion da ist usw.

generic 31. Jul 2017 12:45

AW: als Administrator ausführen
 
Die Ansätze finde ich besprechungswürdig.

Auf welche Root und Key willst du zugreifen?
Lesend kannst du auf fast alles zugreifen.
Schreibend nur unter HKCU.

Wenn du auf HKLM zugreifen willst, dann kommt das auf die Rechte der Benutzer an.
Diese kommen aus Gruppenzugehörigkeiten in Windows.
Jeder Key in der Registry kann mit einer ACL geschützt werden.

Die meisten Key unterhalb HKLM darf nur ein Mitglied der "local Admins" schreiben. Lesen dürfen Mitglieder von "Users". Es kann sein, dass die Berechtigungen anderes vergeben sind, so dass auch Benutzer z.B. Schreiben dürfen.

Ein Problem ist in Delphi. Wenn du ein Key öffnest wird wenn nichts anderes angegeben wird, direkt mit Schreibrechten geöffnet.
Das erzeugt unter HKLM eine Exception.

Folgendes öffnet den Key zu Lesen (only):
Code:
fregistry:=TRegistry.Create(KEY_READ);
Damit kann dann auch auf HKLM lesend zugegriffen werden ohne "Admin"-Rechte.

himitsu 31. Jul 2017 13:19

AW: als Administrator ausführen
 
Um das nochmal aufzugreifen, was schon gesagt wurde.

Nicht auf "bin ich Administrator" prüfen, denn auch einem Admin kann man alle Rechte entziehen.
Sondern auf "hab ich diese oder jene Berechtigung" oder beim Start einfach ausprobieren, ob du zugreifen darfst. Hier muß man aber aufpassen, dass es z.B. nicht eventuell eine Umleitung im Windows gibt ... z.B. könnte man beim Schreiben ins Programmverzeichnis in den VirtualStore umgeleitet werden und denkt dann man darf in C:\Programme schreiben :stupid:

Willie1 1. Aug 2017 15:35

AW: als Administrator ausführen
 
Hallo,
ich habe entschieden, nichts zu ändern. Ich hatte den Button mit dem Admin-Schild-Icon versehen, die meisten Anwender werden wissen, was es bedeutet. Im anderen Fall erhalten sie meine Fehlermeldung "Der Zugriff auf die Registry ist gescheitert". Trotzdem danke für eure Hinweise bes. gerneric (das wusste ich nicht).
Gruß Willie.

jaenicke 1. Aug 2017 16:01

AW: als Administrator ausführen
 
Zitat:

Zitat von Willie1 (Beitrag 1377847)
Ich hatte den Button mit dem Admin-Schild-Icon versehen

Das machen wir auch so, vor allem seit man nur noch am normalen TButton die Eigenschaft ElevationRequired dafür setzen muss.

Bei uns wird dann allerdings die eigene Exe mit Parametern und der Aufforderung als Admin zu starten ausgeführt (ShellExecute + runas als verb), so dass dann im Hintergrund diese zweite Instanz die Zugriffe macht. Diese sieht man nicht, die bekommt nur die nötigen Aktionen übergeben.

Auf die Weise bleibt die Anwendung stehen wie sie ist, auch wenn sie nicht die nötigen Rechte hat, und es sieht für den Benutzer so aus als würde die Anwendung lediglich die Rechte anfordern.
(Tatsächlich geht das auch wirklich so, aber dafür muss man etwas mehr Aufwand betreiben.)


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:13 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