Nein, @Matze. Ich wollt´ halt nur meinen (Optimierungs-)Senf zu der von dir geposteten Routine aus der Code-Lib dazugeben. Meine private, die ich nutze, sieht nämlich so aus:
Delphi-Quellcode:
procedure CallLogOffSequence(ExitCode: dword);
var
os : TOSVersionInfo;
Token : THandle;
tkp : TTokenPrivileges;
begin
os.dwOSVersionInfoSize := sizeof(
os);
GetVersionEx(
os);
if(
os.dwPlatformId = VER_PLATFORM_WIN32_NT)
then begin
if(OpenProcessToken(GetCurrentProcess,
TOKEN_ADJUST_PRIVILEGES
or TOKEN_QUERY,Token))
then
try
if(
not LookupPrivilegeValue(
nil,'
SeShutdownPrivilege',
tkp.Privileges[0].Luid))
then exit;
tkp.PrivilegeCount := 1;
tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(Token,false,tkp,
0,PTokenPrivileges(
Nil)^,PDWord(
Nil)^);
if(GetLastError <> ERROR_SUCCESS)
then exit;
finally
CloseHandle(Token);
end;
end;
ExitWindowsEx(ExitCode,0);
end;
Wie du siehst, rufe ich "ExitWindowsEx" nur einmal auf.