Delphi-PRAXiS
Seite 2 von 5     12 34     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 7. Jun 2006 19:05

Re: Abfragen ob Process Adminrechte hat?
 
Also bis Win2k geh ich auch noch mit ... alle anderen haben sowieso verloren bei mir :)

Aber vielen dank auf jeden Fall nochmal, ich hab mich schon einige Wochen immermal durch irgendwelche Vista UAP(UAC) und Vista tauglichkeits Blogs geforstet aber in keine stand drin dass das SE_GROUP_ENABLED Flag der auschlaggebende Punkt ist. :(

NicoDE 8. Jun 2006 09:21

Re: Abfragen ob Process Adminrechte hat?
 
Zitat:

Zitat von Orbmu2k
in keine stand drin dass das SE_GROUP_ENABLED Flag der auschlaggebende Punkt ist. :(

Warum auch, der Bug ist in fast allen IsAdmin-Beispielen die man im Netz finden kann vorhanden (inklusive meinen alten Beispielen).

Luckie 8. Jun 2006 09:27

Re: Abfragen ob Process Adminrechte hat?
 
Hier ist deine alte Version:
Delphi-Quellcode:
////////////////////////////////////////////////////////////////////////////////
// Procedure : GetAdminSid
// Author   : NBe
// Comment  :
function GetAdminSid: PSID;
const
  // bekannte SIDs ... (WinNT.h)
  SECURITY_NT_AUTHORITY: TSIDIdentifierAuthority = (Value: (0, 0, 0, 0, 0, 5));
  // bekannte RIDs ... (WinNT.h)
  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;

////////////////////////////////////////////////////////////////////////////////
// Procedure : IsAdmin
// Author   : NBe
// Comment  :
function IsAdmin: LongBool;
var
  TokenHandle      : THandle;
  ReturnLength     : DWORD;
  TokenInformation : PTokenGroups;
  AdminSid         : PSID;
  Loop             : Integer;
begin
  Result := False;
  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
            Result := True;
            Break;
          end;
        end;
        FreeSid(AdminSid);
      end;
    finally
      FreeMemory(TokenInformation);
    end;
  finally
    CloseHandle(TokenHandle);
  end;
end;

NicoDE 8. Jun 2006 09:51

Re: Abfragen ob Process Adminrechte hat?
 
Zitat:

Zitat von Luckie
Hier ist deine alte Version:

Man lernt nie aus. Heutzutage würde ich die Funktion völlig anders implementieren.
Ich sehe keine Sinn darin, hier fehlerhaften Code zu posten. Es wäre hilfreicher, wenn sich jemand die Mühe macht und CheckTokenMembership nachprogrammiert (damit Windows NT 4.0 nicht ausgeschossen wird und die Leute verstehen, was die Funktion eigentlich macht).

Orbmu2k 9. Jun 2006 01:11

Re: Abfragen ob Process Adminrechte hat?
 
@NicoDE:

So gerade die aktuelle Public Beta installiert und getestet ... das klappt jetzt wunderbar.
Hab deine Win2k Version genommen.

Vielen Dank nochmal :)

Luckie 9. Jun 2006 01:14

Re: Abfragen ob Process Adminrechte hat?
 
Zitat:

Zitat von NicoDE
Zitat:

Zitat von Luckie
Hier ist deine alte Version:

Man lernt nie aus. Heutzutage würde ich die Funktion völlig anders implementieren.
Ich sehe keine Sinn darin, hier fehlerhaften Code zu posten.

Nun ja, dass der Code fehlrhaft sein soll, höre ich jetzt zum ersten mal. Und ich habe ihn gepostet, damit man dein Codefragement dort einfügen kann.

Olli 9. Jun 2006 01:40

Re: Abfragen ob Process Adminrechte hat?
 
Zitat:

Zitat von Luckie
Nun ja, dass der Code fehlrhaft sein soll, höre ich jetzt zum ersten mal.

Von fehlerhaft kann man wohl auch kaum sprechen. Immerhin funktioniert der Code ja bis Vista. Das Problem ist eben, daß etwas neues eingeführt wurde, was eine alte Schwachstelle der bekannten Methode zutage treten läßt. Ein Fehler ist es eigentlich wenige ... eher fehlende Funktionalität.

NicoDE 9. Jun 2006 07:46

Re: Abfragen ob Process Adminrechte hat?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von Olli
Von fehlerhaft kann man wohl auch kaum sprechen. Immerhin funktioniert der Code ja bis Vista. Das Problem ist eben, daß etwas neues eingeführt wurde, was eine alte Schwachstelle der bekannten Methode zutage treten läßt. Ein Fehler ist es eigentlich wenige ... eher fehlende Funktionalität.

Das Problem gab es schon früher (siehe Anhang). Nur, dass es mit Vista für den Benutzer einfacher zu erreichen, bzw. zum Standard geworden ist.

Zum Anhang: Bei einem auf diese Art gestarteten Programm muss IsUserAdmin() False liefern (wenn man die Aussage als 'der Benutzer hat lokale administrative Rechte' interpretieren möchte).

Luckie 9. Jun 2006 12:01

Re: Abfragen ob Process Adminrechte hat?
 
Könntest du deine obige Funktien entsprechend anpassen, da ich kein Vista zum Testen habe?

NicoDE 9. Jun 2006 12:41

Re: Abfragen ob Process Adminrechte hat?
 
Zitat:

Zitat von Luckie
Könntest du deine obige Funktien entsprechend anpassen, da ich kein Vista zum Testen habe?

Du brauchst kein Vista zum Testen - siehe mein Beitrag mit Anhang.


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:01 Uhr.
Seite 2 von 5     12 34     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