Habe ich mal ausprobiert:
Delphi-Quellcode:
var
isSystem : Boolean;
UserToken : TJwSecurityToken;
od : TOpenDialog;
begin
isSystem := JwIsSystem;
if isSystem then
begin
if is2000 then
UserToken := TJwSecurityToken.CreateCompatibilityQueryUserToken(MAXIMUM_ALLOWED, 'explorer.exe')
else
UserToken := TJwSecurityToken.CreateWTSQueryUserTokenEx(nil, WtsGetActiveConsoleSessionID);
TJwAutoPointer.Wrap(UserToken);
UserToken.ImpersonateLoggedOnUser;
end;
od := TOpenDialog.Create(Form1);
od.Execute;
od.Free;
if isSystem then
UserToken.RevertToSelf;
end;
Leider mit dem gleichen Ergebnis. Generell funktioniert das Impersonate schon korrekt (GetUserName gibt zb vorher SYSTEM und danach den Benutzernamen aus. Aber irgendwie ist die Personifizierung nicht vollständig oder es fehlt ganz einfach der Environment-Block. Ich weiß nur leider nicht, wie man das da mit einbauen könnte. Die Verwendung eines Envirunment-Blocks kenne ich nur beim Starten eines neuen Prozesses.
Hättest Du noch eine andere Idee? Kannst das Code-Schnippsel auch gern selbst ausprobieren. Vielleicht wird die Ursache dann offensichtlicher.