Skip to content

Instantly share code, notes, and snippets.

@camark
Created October 17, 2016 06:10
Show Gist options
  • Select an option

  • Save camark/8cef71b3a26cd4c0764b5e483b351559 to your computer and use it in GitHub Desktop.

Select an option

Save camark/8cef71b3a26cd4c0764b5e483b351559 to your computer and use it in GitHub Desktop.
Shutdown with Delphi
function ShutDown :boolean;
const
ADJUST_PRIV = TOKEN_QUERY or TOKEN_ADJUST_PRIVILEGES;
SHTDWN_PRIV = 'SeShutdownPrivilege';
PRIV_SIZE = sizeOf(TTokenPrivileges);
var
Len: DWORD;
TokenPriv, Dummy: TTokenPrivileges;
Token: THandle;
Error: integer;
OSVersionInfo: TOSVERSIONINFO;
begin
OSVersionInfo.dwOSVersionInfoSize := sizeof(OSVERSIONINFO);
GetVersionEx(OSVersionInfo);
// 如果是Win NT/2000操×÷系统
if (OSVersionInfo.dwPlatformId = VER_PLATFORM_WIN32_NT) then
begin
error:=0;
// Delphi2:
//if not OpenProcessToken(GetCurrentProcess(), ADJUST_PRIV, @Token) then
if not OpenProcessToken(GetCurrentProcess(), ADJUST_PRIV, Token) then
Error := Error or 4;
if not LookupPrivilegeValue(nil, SHTDWN_PRIV,TokenPriv.Privileges[0].Luid) then
Error := Error or 8;
TokenPriv.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
TokenPriv.PrivilegeCount := 1; // One privilege to set
if not AdjustTokenPrivileges(Token, false, TokenPriv, PRIV_SIZE,Dummy, Len) then
Error:=Error or 16;
ExitWindowsEx(EWX_POWEROFF or EWX_FORCE, 0);
Result := (Error=0);
end
else
ExitWindowsEx(EWX_SHUTDOWN or EWX_FORCE, 0);
end;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment