uses Windows, Forms, SysUtils; {$WARN SYMBOL_PLATFORM OFF} procedure ShutdownWindows(Flags: DWORD); var TokenHandle: THandle; ReturnLength: DWord; NewTKP: TTokenPrivileges; begin { Set shutdown privilege } if Win32Platform = VER_PLATFORM_WIN32_NT then begin { Get current process token } Win32Check(OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, TokenHandle)); { Get privilege } Win32Check(LookupPrivilegeValue(nil,'SeShutdownPrivilege', NewTKP.Privileges[0].Luid)); { New privilege } NewTKP.PrivilegeCount := 1; NewTKP.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED; { Get privilege for setting date and time } ReturnLength := 0; Win32Check(AdjustTokenPrivileges(TokenHandle,False,NewTKP,0,nil,ReturnLength)); if GetLastError <> ERROR_SUCCESS then begin RaiseLastOSError; end; end; { ExitWindowsEx } Win32Check(ExitWindowsEx(Flags,0)); { Terminate application } Application.Terminate; end; {$IFDEF VER200} // Delphi 2009 or later {$WARN SYMBOL_PLATFORM DEFAULT} {$ELSE} {$WARN SYMBOL_PLATFORM ON} {$ENDIF} const CForceIfHung: array [Boolean] of DWORD = (0,EWX_FORCEIFHUNG); procedure LogOff(ForceIfHung: Boolean); begin ShutdownWindows(EWX_LOGOFF or CForceIfHung[ForceIfHung]); end; procedure PowerOff(ForceIfHung: Boolean); begin ShutdownWindows(EWX_POWEROFF or CForceIfHung[ForceIfHung]); end; procedure Reboot(ForceIfHung: Boolean); begin ShutdownWindows(EWX_REBOOT or CForceIfHung[ForceIfHung]); end; procedure Shutdown(ForceIfHung: Boolean); begin ShutdownWindows(EWX_SHUTDOWN or CForceIfHung[ForceIfHung]); end;
2008年7月24日
Windowsをログオフ/リブート/シャットダウンする
Windowsをログオフ/リブート/シャットダウンするにはExitWindowsExを呼び出すのですが、NT系のOSではそれなりの特権をOpenProcessToken/LookupPrivilegeValue/AdjustTokenPrivilegesで取得しておく必要があります。
登録:
コメントの投稿 (Atom)
0 件のコメント:
コメントを投稿