Einzelnen Beitrag anzeigen

caustic

Registriert seit: 17. Mai 2004
Ort: Villingen-Schwenningen
20 Beiträge
 
Delphi XE2 Architect
 
#2

Re: ADOConnection und GetProviderNames

  Alt 18. Dez 2005, 00:05
Das Problem, besteht weiterhin und ist anscheinend nicht so einfach zu lösen, naja...
Trotzdem hole ich das hier nochmal hoch in der Hoffnung jemand weiß ne einfache Lösung, hier z.B. mal eine Sache aus Delphi .Net bei einer Winforms Anwendung.
Ab und zu muss man ja bei einem Programm überprüfen, ob die Anwendung mit Administratorrechten läuft also auch schreibenden Zugriff auf die Registry und den HKLM hat. So sah das mit Delphi Win32 aus:
Delphi-Quellcode:
function IsAdmin: Boolean;
const
  SECURITY_NT_AUTHORITY: TSIDIdentifierAuthority =
  (Value: (0, 0, 0, 0, 0, 5));
  SECURITY_BUILTIN_DOMAIN_RID = $00000020;
  DOMAIN_ALIAS_RID_ADMINS = $00000220;

var
  hAccessToken: THandle;
  ptgGroups: PTokenGroups;
  dwInfoBufferSize: DWORD;
  psidAdministrators: PSID;
  x: Integer;
  bSuccess: BOOL;
begin
  Result := False;
  bSuccess:=False;
  ptgGroups:=nil;
  psidAdministrators:=nil;
  try
    bSuccess := OpenThreadToken(GetCurrentThread, TOKEN_QUERY, True,
      hAccessToken);
    if not bSuccess then
    begin
      if GetLastError = ERROR_NO_TOKEN then
      bSuccess := OpenProcessToken(GetCurrentProcess, TOKEN_QUERY,
        hAccessToken);
    end;
    if bSuccess then
    begin
      GetMem(ptgGroups, 1024);
      bSuccess := GetTokenInformation(hAccessToken, TokenGroups,
        ptgGroups, 1024, dwInfoBufferSize);
      if bSuccess then
      begin
        AllocateAndInitializeSid(SECURITY_NT_AUTHORITY, 2,
          SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS,
          0, 0, 0, 0, 0, 0, psidAdministrators);
        {$R-}
        for x := 0 to ptgGroups.GroupCount - 1 do
          if EqualSid(psidAdministrators, ptgGroups.Groups[x].Sid) then
          begin
            Result := True;
            Break;
          end;
        {$R+}
      end;
    end;
  finally
    if bSuccess then
      CloseHandle(hAccessToken);
    if Assigned(ptgGroups) then
      FreeMem(ptgGroups);
    if Assigned(psidAdministrators) then
      FreeSid(psidAdministrators);
  end;
end;
Der Code ist aus der JCL wenn mich nicht alles täuscht und so sieht das unter .NET aus

in die USES muss folgendes Aufgenommen werden:
System.Security.Principal;

und die Funktion schrumpft auf:
Delphi-Quellcode:
function IsAdmin : boolean;
begin
Result := WindowsPrincipal.Create(WindowsIdentity.GetCurrent).IsInRole(WindowsBuiltInRole.Administrator);
end;
So eine Lösung suche ich halt für die Storie mit der OleDB Provider Liste.

Gruß
caustic
  Mit Zitat antworten Zitat