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