Mein kleines Installationsprogram benötigt Administratoren-Rechte, welche ich via Manifest einfordere.
Unter Windows 7 /Vista erfolgt damit bereits vor Program-Start ein User-Wechsel auf einen
User mit Amdinistrator-Rechte, falls der eingeloggte User keine entsprechenden Rechte besitzt.
Beim Installieren hole ich mit SHGetFolderPath verschiedene User-spezifische Folders.
Wenn im dritte Parameter
Token 0 übergeben wird, erhalten ich in dieser Situation
natürlich den Pfad des Administrator-Users und nicht jenen des ursprüglich eingeloggten Users.
Jetzt versuchte ich mit dem dritten Parameter das Token des geforderten Users mitzugeben, doch kriege ich immer
"The
handle is Invalid" zurück.
Mit folgender Funktion erhalte ich das Token vom Parent-Prozess (welcher in der Regel auf den eingeloggten User verweist):
Code:
function GetTokenOfProcess(ProcessId: DWORD): THandle;
const
PROCESS_QUERY_LIMITED_INFORMATION = $1000;
var
ProcessHandle, TokenHandle: THandle;
begin
Result := 0;
ProcessHandle := 0;
try
ProcessHandle:= OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, True, ProcessId);
if ProcessHandle <> 0 then
begin
if OpenProcessToken(ProcessHandle, TOKEN_QUERY or TOKEN_IMPERSONATE, TokenHandle) then
result := TokenHandle;
// call CloseHandle(TokenHandle) at the end
end;
finally
CloseHandle(ProcessHandle);
end;
end;
Beim Aufruf erhalte ich dann immer ein HResult für "The
handle is Invalid" zurück.
Code:
hRes := SHGetFolderPath(
Handle, CSIDL_PROGRAMS, GetTokenOfProcess(ParentProcessID), SHGFP_TYPE_DEFAULT, Folder)
Hat jemand eine Idee was hier falsch läuft. Oder gibt es einen einfacheren Weg für dieses Problem?