Delphi-PRAXiS
Seite 1 von 5  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Abfragen ob Process Adminrechte hat? (https://www.delphipraxis.net/68281-abfragen-ob-process-adminrechte-hat.html)

Orbmu2k 27. Apr 2006 11:32


Abfragen ob Process Adminrechte hat?
 
Hallo,

Ich habe ein Problem unter Vista ... dort ist man zwar als lokaler Admin eingeloggt
allerdings werden Programme nur mit Benutzerrechten gestartet.

Da ich Funktionen nutze die Administrator Rechte benötigen hatte ich bisher
immer zur Sicherheit abgefragt ob der angemeldete Benutzer Admin Rechte hat.
Nun liefert die Abfrage True aber das Programm selbst hat gar keine Adminrechte.

Kann man nun irgendwie "sicher" abfragen ob das Programm selbst mit "Administrator Rechten" ausgeführt wird ?

Vielen Dank im Vorraus.

Olli 21. Mai 2006 15:40

Re: Abfragen ob Process Adminrechte hat?
 
Kannst du mir mal dein Testprogramm zuschicken (zB per PN). Ich werde mir mal die Vista Preview installieren, welche ich mir bei MSDN runtergeladen habe. Das Problem klingt nämlich interessant.

Orbmu2k 7. Jun 2006 08:27

Re: Abfragen ob Process Adminrechte hat?
 
Hallo Olli,

mit einer Antwort hatte ich gar nich mehr gerechnet :)

Also ich verwende bisher folgenden Code zum ermitteln ob der aktuelle Benutzer Administrator Rechte hat:

Delphi-Quellcode:
const
  SECURITY_NT_AUTHORITY: TSIDIdentifierAuthority =
    (Value: (0, 0, 0, 0, 0, 5));
  SECURITY_BUILTIN_DOMAIN_RID = $00000020;
  DOMAIN_ALIAS_RID_ADMINS = $00000220;

function IsAdmin: Boolean;
var
  hAccessToken: THandle;
  ptgGroups: PTokenGroups;
  dwInfoBufferSize: DWORD;
  psidAdministrators: PSID;
  x: Integer;
  bSuccess: BOOL;
begin
  Result  := False;
  bSuccess := OpenThreadToken(GetCurrentThread, TOKEN_QUERY, True,
    hAccessToken);
  if not bSuccess then
  begin
    if GetLastError = ERROR_NO_TOKEN then
      bSuccess := OpenProcessToken(GetCurrentProcess, TOKEN_QUERY,
        hAccessToken);
  end;
  if bSuccess then
  begin
    GetMem(ptgGroups, 1024);
    bSuccess := GetTokenInformation(hAccessToken, TokenGroups,
      ptgGroups, 1024, dwInfoBufferSize);
    CloseHandle(hAccessToken);
    if bSuccess then
    begin
      AllocateAndInitializeSid(SECURITY_NT_AUTHORITY, 2,
        SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS,
        0, 0, 0, 0, 0, 0, psidAdministrators);
      {$R-}
      for x := 0 to ptgGroups.GroupCount - 1 do
        if EqualSid(psidAdministrators, ptgGroups.Groups[x].Sid) then
        begin
          Result := True;
          Break;
        end;
      {$R+}
      FreeSid(psidAdministrators);
    end;
    FreeMem(ptgGroups);
  end;
end;

Diese Funktion liefert auf allen neueren Vista Versionen mit UAP natürlich "True" da der angemeldete Benutzer Administrator Rechte hat.

Was ich noch herausgefunden habe ist das MS es wohl über einen Manifest Eintrag steuert ob das Programm Administrator Rechte benötigt und den Benutzer speziell dann darauf hinweist.

Mein Programm kann aber auch unter eingeschränkten Rechten problemlos laufen, wenn ich diese Funktionen in dem Fall nicht durchführe. Deswegen würde ich nun gerne abfragen können welche Rechte das Programm hat und nicht welche Rechte der angemeldete Benutzer hat.

NicoDE 7. Jun 2006 08:44

Re: Abfragen ob Process Adminrechte hat?
 
Das Problem ist, dass es nun zwei Sicherheits-Token gibt.
(eines mit allen Rechten und ein 'beschnittenes' mit dem fast alle normalen Programme laufen)

Siehe http://www.microsoft.com/germany/tec...1f5c6c2d9.mspx

Eine Lösung in Delphi kann ich auf die Schnelle nicht anbieten.

Orbmu2k 7. Jun 2006 09:13

Re: Abfragen ob Process Adminrechte hat?
 
Also wenn ich das richtig verstanden habe ist per default das niedrigste Privileg gültig für Programme aber die Frage ist was passiert mit dem Privileg wenn man "Run as Administrator" zum starten des Programms verwendet ... also irgendwie ist das ganz schön komplex :shock:

mkinzler 7. Jun 2006 09:28

Re: Abfragen ob Process Adminrechte hat?
 
Ein Dirty-Methode wäre es zu versuchen, in den Systemteil der Registry zu schreiben (oder nich read-only zu öffnen). Wenns funktioniert: Programm hat Adminrechte, wenn nicht User-Rechte.

NicoDE 7. Jun 2006 10:10

Re: Abfragen ob Process Adminrechte hat?
 
Zitat:

Zitat von mkinzler
Ein Dirty-Methode wäre es zu versuchen, in den Systemteil der Registry zu schreiben (oder nich read-only zu öffnen). Wenns funktioniert: Programm hat Adminrechte, wenn nicht User-Rechte.

Nunja, eine 'saubere' Lösung würde eher darin bestehen, die Aussagen anders zu interpretieren...

Die Aussage von IsAdmin() ist immer noch korrekt (Mitglied der lokalen Gruppe der Administratoren).
Allerdings ist bisherige Interpretation (lokaler Admin = alle Rechte) nicht zutreffend. Diese Interpretation wahr schon immer falsch (wenn auch hinreichend genau für die meisten Fälle). Allerdings tritt das Problem nun 'dank' Vista auf einem Standardsystem offen zu tage.

NicoDE 7. Jun 2006 14:47

Re: Abfragen ob Process Adminrechte hat?
 
Your personal bugfix ;)

vorher:
Delphi-Quellcode:
if EqualSid(psidAdministrators, ptgGroups.Groups[x].Sid) then
nacher:
Delphi-Quellcode:
if (SE_GROUP_ENABLED = (ptgGroups.Groups[x].Attributes and SE_GROUP_ENABLED)) and
  EqualSid(psidAdministrators, ptgGroups.Groups[x].Sid) then
Man muss zusätzlich überprüfen, ob die Gruppe überhaupt für Sicherheitsabfragen relevant ist.
(SE_GROUP_ENABLED = 4)

Orbmu2k 7. Jun 2006 18:34

Re: Abfragen ob Process Adminrechte hat?
 
Hey super, das ging ja fix danke :)

Nun hab ich grad kein Vista zur Hand ... aber ich werd das ausprobieren sobald MS die neue Public Beta 2 released hat.

Ich hab grad mal nach dem SE_GROUP_ENABLED Flag im MSDN nachgeschlagen das gibt es ja schon seit es NT gibt ... dann brauch ich mir ja keine Sorgen machen das die Abfrage dann auf "älteren" Windows Versionen falsche Ergebnisse liefert.

NicoDE 7. Jun 2006 18:50

Re: Abfragen ob Process Adminrechte hat?
 
Zitat:

Zitat von Orbmu2k
Ich hab grad mal nach dem SE_GROUP_ENABLED Flag im MSDN nachgeschlagen das gibt es ja schon seit es NT gibt ... dann brauch ich mir ja keine Sorgen machen das die Abfrage dann auf "älteren" Windows Versionen falsche Ergebnisse liefert.

Wegen der Abwärtskompatibilität brauchst du dir keine Sorgen machen :)

Die Überprüfung ist immer noch 'vereinfacht' (normalerweise müsste man mit der SID einen SD erstellen und mittels AccessCheck gegen das Token prüfen).

Wenn man Windows XP voraussetzen kann, dann beschränkt sich die 'korrekte' Abfrage auf:
Delphi-Quellcode:
function IsUserAdmin: BOOL;
begin
  Result := SHTestTokenMembership(THandle(nil), DOMAIN_ALIAS_RID_ADMINS);
end;
Wenn man Windows 2000 voraussetzen kann, dann beschränkt sich die 'korrekte' Abfrage auf:
Delphi-Quellcode:
function IsUserAdmin: BOOL;
var
  SidToCheck: PSID;
begin
  Result := AllocateAndInitializeSid(SECURITY_NT_AUTHORITY, 2,
    SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS,
    0, 0, 0, 0, 0, 0, SidToCheck);
  if Result then
  begin
    if not CheckTokenMembership(THandle(nil), SidToCheck, Result) then
      Result := False;
    FreeSid(SidToCheck);
  end;
end;
Wenn man allerdings Windows NT 4.0 unterstützen muss, dann wird's aufwendig (InitializeSecurityDescriptor, SetSecurityDescriptorOwner, SetSecurityDescriptorGroup, InitializeAcl, AddAccessAllowedAce, SetSecurityDescriptorDacl, AccessCheck).


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:08 Uhr.
Seite 1 von 5  1 23     Letzte »    

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