Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Bin ich lokaler Admin? (https://www.delphipraxis.net/3294-bin-ich-lokaler-admin.html)

Phoenix 5. Mär 2003 12:56


Bin ich lokaler Admin?
 
Hi,

weiss nicht, ob API die richtige Sparte ist, hat aber auf jeden Fall was mit Win zu tun:

Wie kann ich geschickt abprüfen, ob ich lokale Adminrechte habe?

Ne Lösung wäre zwar etwas zu versuchen, daß nur ein Admin kann (z.B. bestimmte Registry-Einträge ändern) und dann gucken ob das geklappt hat, aber ich finde das wäre dann doch eine SEHR unsaubere Lösung :)

Viele Grüße,

Sebastian

:party: <- immer noch im Karnevalsrausch *g*

Luckie 5. Mär 2003 12:59

Delphi-Quellcode:
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;

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;

TorstenS 23. Apr 2003 13:38

Liste der Anhänge anzeigen (Anzahl: 2)
Hi,

es geht auch einfacher ( relativ, ich weiß )

Binde die Unit os_info2.pas mit ein und siehe

" Label1.Caption := SystemInfo.AdminInfo ; "

mfg

TorstenS

Luckie 23. Apr 2003 13:41

Und was macht deine os_info2 Klasse anders als mein Code? :roll:

Hm, ist ja nur eine Unit noch nicht mal eine Klasse. Wer hat denn das verbrochen? :mrgreen:

TorstenS 23. Apr 2003 13:45

Mann erspart sich das abtippen des Codes?

Luckie 23. Apr 2003 13:48

Aber wenn man den Rest nicht brauch, hat man einen ziemlichen Overhead.

Weißt du von wem die Unit ist?

TorstenS 23. Apr 2003 15:05

Die Unit ist mir von einem Arbeitskollegen zugetragen worden. Normalerweise tut sich ja der programmierer in der Unit verewigen.

TorstenS

Luckie 23. Apr 2003 18:05

LOL. Da hat sie aber einen weiten Weg genommen. Die ist aus der SysInfo von Daniel (also unserem Admin) aus der Open-Source-Sparte. :mrgreen:

TorstenS 24. Apr 2003 07:09

Da muß ich Ihm ja danken, da sie mir schon bei einigen Problemen weitergeholfen.

Vader 9. Jul 2004 06:30

Re: Bin ich lokaler Admin?
 
hallo thorstens

hab dein file runtergeladen aber es kommt bei mir eine fehlermeldung:

[Fehler] Unit1.pas(29): Undefinierter Bezeichner: 'SystemInfo'

was ist da falsch



mfg vader


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:43 Uhr.
Seite 1 von 2  1 2      

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