Autor Beitrag
carre
Hält's aus hier
Beiträge: 11


D4 Standard
BeitragVerfasst: Fr 04.10.02 23:33 
Grüß Euch,

welche Möglichkeit habe ich um herauszufinden ob der aktuelle User unter NT4/W2000 Admin Rechte besitzt?
(Wird für ein NT Service benötigt)

Danke und Gruß
Thomas
carre Threadstarter
Hält's aus hier
Beiträge: 11


D4 Standard
BeitragVerfasst: Fr 04.10.02 23:43 
Titel: Thanks!
Hallo Leute,

habs schon in einem anderen Beitrag gefunden - sorry! :lol:

Gruß Thomas
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Sa 05.10.02 01:13 
Hoffentlich den richtigen.

Zitat:

Grundsätzlich gibt es zwei Möglichkeiten zu ermitteln, ob der Benutzer Administrator-Rechte besitzt (Um genau zu sein - Mitglied der lokalen Gruppe der Administratoren).
Die erste und (leider) immer wieder programmierte Variante arbeitet mit den Lookup-Funktionen, die nicht unbedingt sprachenunabhängig sind! (Deswegen scheitern viele englische Tools, da die Gruppe der Administratoren einfach anders heißt, aber auch deutsche Programme scheitern, wenn man einfach die Administartor-Gruppe umbenennt ;)
Die zweite und (von mir empfohlene) Variante geht über die allgemein-bekannten SIDs (Security Identifier), die auf einem NT-System immer vorhanden sind. Im Gegensatz zu den Namen sind die System-SIDs eindeutig definiert, und auf jedem NT-System gleich. Natürlich bedeutet es etwas mehr Aufwand, aber wenn die Funktion einmal geschrieben wurde, wozu dann noch darüber nachdenken wie sie funktioniert ;)
Hier nun also die Implementation der IsAdmin-Funktion...
Sie wurde unter Delphi 5 geschrieben und benutzt auschließlich Funktionen und Konstanten, die in Windows.pas deklariert wurden. Es kann durchaus sein, das frühere Delphi-Versionen den ein oder andere Typen beziehungsweise die ein oder andere Konstante noch nicht kennen, in diesem Falle könnte man einfach die Deklaration aus der Delphi 5 -Version davor kopieren...
code:

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
function GetAdminSid: PSID;
const
  // bekannte SIDs ... (WinNT.h)
  SECURITY_NT_AUTHORITY: TSIDIdentifierAuthority = (Value: (000005));
  // 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,
    000000, 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, nil0, 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;

procedure TForm1.Button1Click(Sender: TObject);
begin
  if IsAdmin then
    MessageBox(0'Glückwunsch, Du bist Admin!'';o)'0);
end;


Gruß Nico
PS: und immer eine handvoll Handles... ;)


Moderiert von user profile iconTino: Code- durch Delphi-Tags ersetzt.