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 Vista: Administratorkonto oder reelle elevated Adminrechte? (https://www.delphipraxis.net/119831-vista-administratorkonto-oder-reelle-elevated-adminrechte.html)

Zacherl 1. Sep 2008 19:33


Vista: Administratorkonto oder reelle elevated Adminrechte?
 
Hey,

gibt es eine einfache Möglichkeit unter Vista zu testen, ob meine Anwendung wirklich momentan mit Adminrechten läuft? Ich teste erst, ob der Benutzer ein Administrator ist. Ist dies der Fall ist ja aber noch nicht sichergestellt, dass er die Anwendung über die UAC mit wirklichen Adminrechten gestartet hat.

Gruß Zacherl

Apollonius 1. Sep 2008 19:39

Re: Vista: Administratorkonto oder reelle elevated Adminrech
 
Das müsste sich am Token ablesen lassen. Probiere mal IsTokenRestricted.
Oder besser: Hole dir mit GetTokenInformation die Gruppen und prüfe die Administratorengruppe auf das Flag SE_GROUP_USE_FOR_DENY_ONLY.

Zacherl 1. Sep 2008 20:11

Re: Vista: Administratorkonto oder reelle elevated Adminrech
 
Hast du einen Beispielcode, der möglichst ohne die JEDIs auskommt?

Dezipaitor 1. Sep 2008 20:13

Re: Vista: Administratorkonto oder reelle elevated Adminrech
 
Warum denn ohne JEDIs?

Zacherl 1. Sep 2008 20:14

Re: Vista: Administratorkonto oder reelle elevated Adminrech
 
Wegen nonVCL ..

Luckie 1. Sep 2008 20:15

Re: Vista: Administratorkonto oder reelle elevated Adminrech
 
Zitat:

Zitat von Dezipaitor
Warum denn ohne JEDIs?

Weil man für eine Funktion nicht diese ganzen aufgeblähten Jedis installieren möchte.

Dezipaitor 1. Sep 2008 22:51

Re: Vista: Administratorkonto oder reelle elevated Adminrech
 
@Zacherl:
1. Okay, wenn ohne alles, dann nimm CheckTokenMembership. Ich glaube den C Quelltext kannst du auch noch alleine übersetzen.

2. nonVCL, gutes Stichwort. JWSCL läuft jetzt ohne VCL. Nur RTL ist drin. Verfügbar ist es jedoch im Moment nur im SVN Trunk.

@Luckie: Ich ziehe jederzeit Qualität der Quantität vor! Aber letzendlich geht man immer ein Risiko ein, wenn man fremden Code verwendet. Das mag jetzt zwar nicht auf den einfachen Code von CheckTokenMembership zutreffen, aber es trifft sehr wohl auf die ganzen Token und ACL Quelltexte zu. Wenn man gerade damit anfängt und nicht weiß, worum es geht, ist es sehr problematisch.

Zacherl 2. Sep 2008 08:30

Re: Vista: Administratorkonto oder reelle elevated Adminrech
 
Hab mal das hier aus verschiedenen Funktionen, die ich hier im Forum gefunden habe gebastelt und mit Hilfe eurer Tips. Vielleicht hilft es ja jemandem:

Delphi-Quellcode:
type
  TAdminPrivileges = (
    apLimited,
    apAdmin,
    apFullAdmin
  );

function HasAdminPrivileges: TAdminPrivileges;

function GetAdminSid: PSID;
const
  SECURITY_NT_AUTHORITY: TSIDIdentifierAuthority =
    (Value: (0, 0, 0, 0, 0, 5));
  SECURITY_BUILTIN_DOMAIN_RID: DWORD             = $00000020;
  DOMAIN_ALIAS_RID_ADMINS: DWORD                 = $00000220;
begin
  Result := nil;
  AllocateAndInitializeSid(SECURITY_NT_AUTHORITY, 2,
    SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS,
    0, 0, 0, 0, 0, 0, Result);
end;

const
  SE_GROUP_USE_FOR_DENY_ONLY                     = $00000010;

var
  TokenHandle      : THandle;
  ReturnLength     : DWORD;
  TokenInformation : PTokenGroups;
  AdminSid         : PSID;
  Loop             : Integer;
begin
  Result := apLimited;
  TokenHandle := 0;
  if OpenProcessToken(GetCurrentProcess, TOKEN_QUERY, TokenHandle) then
  try
    ReturnLength := 0;
    GetTokenInformation(TokenHandle, TokenGroups, nil, 0, ReturnLength);
    TokenInformation := GetMemory(ReturnLength);
    if Assigned(TokenInformation) then
    try
      if GetTokenInformation(TokenHandle, TokenGroups, TokenInformation,
        ReturnLength, ReturnLength) then
      begin
        AdminSid := GetAdminSid;
        for Loop := 0 to TokenInformation^.GroupCount - 1 do
        begin
          if EqualSid(TokenInformation^.Groups[Loop].Sid, AdminSid) then
          begin
            if (TokenInformation^.Groups[Loop].Attributes and
              SE_GROUP_USE_FOR_DENY_ONLY) = SE_GROUP_USE_FOR_DENY_ONLY then
            begin
              Result := apAdmin;
            end
              else
            begin
              Result := apFullAdmin;
            end;
            Break;
          end;
        end;
        FreeSid(AdminSid);
      end;
    finally
      FreeMemory(TokenInformation);
    end;
  finally
    CloseHandle(TokenHandle);
  end;
end;
Diese Funktion gibt unter XP entweder apLimited für eingeschränkte Rechte oder apFullAdmin für Administratorrechte zurück. Ab Vista wird apAdmin zurückgegeben, wenn es sich um einen Administrator handelt, das aktuelle Programm aber nicht per UAC elevated gestartet wurde. Läuft das Programm mit uneingeschränkten Adminrechten, so wird hier apFullAdmin zurückgegeben.

Gruß Zacherl

Dezipaitor 2. Sep 2008 09:55

Re: Vista: Administratorkonto oder reelle elevated Adminrech
 
Nichts anderes macht die Funktion CheckTokenMembership!

Zacherl 2. Sep 2008 15:47

Re: Vista: Administratorkonto oder reelle elevated Adminrech
 
Zitat:

Zitat von Dezipaitor
Nichts anderes macht die Funktion CheckTokenMembership!

Ja ich weiß, aber da die API in der Windows.pas bei meinem Delphi irgendwie nicht importiert wird, hab ich schnell den anderen Code als Grundlage genommen. Ist ja eh beides das selbe ..


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