Zitat von
xZise:
[...]Ist natürlich doof, dass der Dienst sich lieber beenden sollte, wenn das zurückgschalten fehlschlägt[...]
Ha ich weiß jetzt wieder, warum ich das gesagt habe
Ein Prozess unter einem anderem Benutzer ausführen - Teil 1 Impersonate
Mit der Funktion RevertToSelf wird die Verkörperung eines anderen Benutzers wieder aufgehoben. Aus Sicherheitsgründen sollte man den Prozess beenden, wenn diese Funktion fehlschlägt, da sonst der Prozess weiter unter den Benutzerrechten des anderen Benutzers ausgeführt wird.
(Siehe
hier)
Was mich wieder zur Frage zurückbringt. Ich habe das erstmal so implementiert:
Delphi-Quellcode:
token := TJwSecurityToken.CreateWTSQueryUserToken(TOKEN_ALL_ACCESS);
try
if ImpersonateLoggedOnUser(token.TokenHandle)
then
begin
vi.dwOSVersionInfoSize:=SizeOf(vi);
GetVersionEx(vi);
if vi.dwPlatformId = VER_PLATFORM_WIN32_NT
then // Windows NT
begin
OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES,hToken);
LookupPrivilegeValue(
nil,'
SeShutdownPrivilege',
tp.Privileges[0].Luid);
tp.PrivilegeCount := 1;
tp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
h := 0;
AdjustTokenPrivileges(hToken,False,
tp,0,PTokenPrivileges(
nil)^,h);
CloseHandle(hToken);
Result := ExitWindowsEx(flag,0);
end;
end;
finally
token.Free;
end;
MfG
xZise