Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
40.088 Beiträge
 
Delphi 11 Alexandria
 
#26

Re: Abfragen ob Process Adminrechte hat?

  Alt 29. Aug 2006, 13:13
Hab meine integrierte Version nochmal auf deine zurückgeführt,
sodaß jetzt erstma was (hoffentlich) "Funktionierendes" existiert.

Delphi-Quellcode:
////////////////////////////////////////////////////////////////////////////////
// Procedure : HasAdminPrivileges
// Author : NBe
// Comment :
function HasAdminPrivileges: LongBool;
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;
  SE_GROUP_ENABLED: DWORD = $00000004;

var
  TokenHandle : THandle;
  ReturnLength : DWORD;
  TokenInformation : PTokenGroups;
  AdminSid : PSID;
  Loop : Integer;

begin
  Result := False;
  TokenHandle := 0;
  TokenInformation := nil;
  AdminSid := nil;
  if OpenProcessToken(GetCurrentProcess, TOKEN_QUERY, TokenHandle) then
  try
    ReturnLength := 0;
    GetTokenInformation(TokenHandle, TokenGroups, nil, 0, ReturnLength);
    TokenInformation := GetMemory(ReturnLength);
    if Assigned(TokenInformation) and GetTokenInformation(TokenHandle,
      TokenGroups, TokenInformation, ReturnLength, ReturnLength) then
    begin
      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
      begin
        if (SE_GROUP_ENABLED = (TokenInformation^.Groups[Loop].Attributes and SE_GROUP_ENABLED))
          and EqualSid(TokenInformation^.Groups[Loop].Sid, AdminSid) then
        begin
          Result := True;
          Break;
        end;
      end;
      FreeSid(AdminSid);
      AdminSid := nil;
    end;
  finally
    FreeSid(AdminSid);
    FreeMemory(TokenInformation);
    CloseHandle(TokenHandle);
  end;
end;
Und da ich's grad bemerkt hatte ... in meiner Unit werden jetzt an CreateProcessWithLogon auch das Arbeitsverzeichnis und die Parameterliste mit übergeben (gut daß ich da jetzt doch nochmal reingesehen hab ._.)

CheckForAdminPrivileges sorgt also dafür, daß das Programm mit Admin-Rechten gestartet wird.

Delphi-Quellcode:
If CheckForAdminPrivileges Then Begin
  // Programm gestartet
End Else Begin
  // konnte nicht mit Admin-Rechten gestartet werden,
  //
  // und/oder eine andere Instanz des Programms wurde
  // mit Admin-Rechten gestartet
End;
(ich glaub hier würde sich ein TriState-Result besser machen ... aber erstmal sehn was Nico draus macht)
Angehängte Dateien
Dateityp: zip privilegescheck_343.zip (3,1 KB, 61x aufgerufen)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014
  Mit Zitat antworten Zitat