Ich habe eine Software im System-Kontext laufen. Nun möchte ich aus dieser heraus einen TOpenDialog öffnen und den Benutzer eine Datei auswählen lassen. Das funktioniert zwar, aber der Dialog läuft im System-Kontext und deshalb sieht der Anwendet z.B. nicht seine Favoriten (Vista/7) und der Desktop führt auch nicht auf den Benutzer-Desktop sondern nach "C:\Windows\system32\config\systemprofile\Desk top" und noch ein paar andere Nachteile.
Nun habe ich mit Hilfe der
JWSCL versucht, das per ImpersonateLoggedOnUser zu regeln, was aber leider nicht funktioniert. Generell tut ImpersonateLoggedOnUser ja, aber es regelt wohl nur die Rechte, nicht aber die Umgebung (Environment).
Wie geht das dann also richtig?
Delphi-Quellcode:
var
isSystem : Boolean;
UserToken : TJwSecurityToken;
begin
isSystem := JwIsSystem;
if isSystem then
begin
//get the token of the logged in user
if is2000 then
UserToken := TJwSecurityToken.CreateCompatibilityQueryUserToken(MAXIMUM_ALLOWED, 'explorer.exe')
else //XP, 2003, Vista, 2008
UserToken := TJwSecurityToken.CreateWTSQueryUserTokenEx(nil, WtsGetActiveConsoleSessionID);
TJwAutoPointer.Wrap(UserToken);
UserToken.ImpersonateLoggedOnUser;
end;
if MyOpenDialog.Execute then
begin
//...
end;
if isSystem then
begin
UserToken.RevertToSelf;
end;
end;