Hallo Olli,
mit einer Antwort hatte ich gar nich mehr gerechnet
Also ich verwende bisher folgenden Code zum ermitteln ob der aktuelle Benutzer Administrator Rechte hat:
Delphi-Quellcode:
const
SECURITY_NT_AUTHORITY: TSIDIdentifierAuthority =
(Value: (0, 0, 0, 0, 0, 5));
SECURITY_BUILTIN_DOMAIN_RID = $00000020;
DOMAIN_ALIAS_RID_ADMINS = $00000220;
function IsAdmin: Boolean;
var
hAccessToken: THandle;
ptgGroups: PTokenGroups;
dwInfoBufferSize: DWORD;
psidAdministrators: PSID;
x: Integer;
bSuccess: BOOL;
begin
Result := False;
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);
CloseHandle(hAccessToken);
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+}
FreeSid(psidAdministrators);
end;
FreeMem(ptgGroups);
end;
end;
Diese Funktion liefert auf allen neueren Vista Versionen mit UAP natürlich "True" da der angemeldete Benutzer Administrator Rechte hat.
Was ich noch herausgefunden habe ist das MS es wohl über einen Manifest Eintrag steuert ob das Programm Administrator Rechte benötigt und den Benutzer speziell dann darauf hinweist.
Mein Programm kann aber auch unter eingeschränkten Rechten problemlos laufen, wenn ich diese Funktionen in dem Fall nicht durchführe. Deswegen würde ich nun gerne abfragen können welche Rechte das Programm hat und nicht welche Rechte der angemeldete Benutzer hat.