Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.183 Beiträge
 
Delphi 12 Athens
 
#21

Re: Abfragen ob Process Adminrechte hat?

  Alt 25. Aug 2006, 14:17
@Nico:
Dat is aus deiner (alten) Variante heraus entstanden ... was genau würdest du jetzt noch ändern wollen?

kann's grad nich testen, aber dieses SE_GROUP_ENABLED hab'sch erstma reingemacht
Code:
For Loop := 0 to TokenInformation^.GroupCount - 1 do
  If [color=#ff0000](TokenInformation^.Groups[Loop].Attributes and SE_GROUP_ENABLED <> 0)[/color]
    and EqualSid(TokenInformation^.Groups[Loop].Sid, AdminSid) Then Begin
Delphi-Quellcode:
//ganze Unit siehe Anhang

  Function CheckForAdmin: Boolean;
    Const SECURITY_NT_AUTHORITY: TSIDIdentifierAuthority = (Value: (0, 0, 0, 0, 0, 5));
      SECURITY_BUILTIN_DOMAIN_RID = $00000020;
      DOMAIN_ALIAS_RID_ADMINS = $00000220;

    Var TokenHandle: THandle;
      ReturnLength: LongWord;
      TokenInformation: PTokenGroups;
      AdminSid: PSID;
      Loop: Integer;
      AdminCheckForm: TAdminCheckForm;

    Begin
      Result := False;
      TokenHandle := 0;
      TokenInformation := nil;
      If OpenProcessToken(GetCurrentProcess, TOKEN_QUERY, TokenHandle) Then
        Try
          GetTokenInformation(TokenHandle, TokenGroups, nil, 0, ReturnLength);
          TokenInformation := GetMemory(ReturnLength);
          If (TokenInformation <> nil) and GetTokenInformation(TokenHandle,
            TokenGroups, TokenInformation, ReturnLength, ReturnLength) Then Begin
            AdminSid := nil;
            AllocateAndInitializeSid(SECURITY_NT_AUTHORITY, 2, SECURITY_BUILTIN_DOMAIN_RID,
              DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0, AdminSid);
            For Loop := 0 to TokenInformation^.GroupCount - 1 do
              If ((TokenInformation^.Groups[Loop].Attributes and SE_GROUP_ENABLED) = SE_GROUP_ENABLED)
                and EqualSid(TokenInformation^.Groups[Loop].Sid, AdminSid) Then Begin
                Result := True;
                Break;
              End;
            FreeSid(AdminSid);
          End;
        Finally
          FreeMemory(TokenInformation);
          CloseHandle(TokenHandle);
        End;
      If not Result Then Begin
        AdminCheckForm := TAdminCheckForm.Create(nil);
        AdminCheckForm.ShowModal;
        AdminCheckForm.Free;
      End;
    End;
Aufrufen tu ich's einfach ma so:
Delphi-Quellcode:
Program ...;

Uses DataRescue_AdminCheck, ...;

Begin
  ...
  If not CheckForAdmin Then Exit;
  ...
End.
Angehängte Dateien
Dateityp: pas datarescue_admincheck_158.pas (5,2 KB, 52x aufgerufen)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat