![]() |
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:
Sie gibt true zurück, wenn die genannte Option genutzt wird. Bei mir funktioniert sie. Frage:ist das so in Ordnung?
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; Gruß Willie. |
AW: als Administrator ausführen
(einmal überarbeitet und umgeworfen)
Ich verwende dazu bisher immer ![]() |
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. |
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:
Damit kann dann auch auf HKLM lesend zugegriffen werden ohne "Admin"-Rechte.
fregistry:=TRegistry.Create(KEY_READ);
|
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: |
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. |
AW: als Administrator ausführen
Zitat:
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 14:02 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