==for Delphi
ShutDown(dwTimeOut : DWord = 0; bForceClose : Boolean = true; bReboot : Boolean = false) ;
var
PreviosPrivileges: ^TTokenPrivileges;
TokenPrivileges: TTokenPrivileges;
hToken: THandle;
tmpReturnLength: DWord;
begin
if Win32Platform = VER_PLATFORM_WIN32_NT then begin
if OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) then begin
LookupPrivilegeValue(Nil, 'SeShutdownPrivilege', TokenPrivileges.Privileges[0].Luid);
TokenPrivileges.PrivilegeCount := 1;
TokenPrivileges.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
tmpReturnLength := 0;
PreviosPrivileges := nil;
AdjustTokenPrivileges(hToken, False, TokenPrivileges, 0, PreviosPrivileges^, tmpReturnLength);
if InitiateSystemShutdown(Nil, Nil, dwTimeOut, bForceClose, bReboot) then begin
TokenPrivileges.Privileges[0].Attributes := 0;
AdjustTokenPrivileges(hToken, False, TokenPrivileges, 0, PreviosPrivileges^, tmpReturnLength);
end ;
end ;
end
else
ExitWindowsEx(EWX_FORCE or EWX_SHUTDOWN or EWX_POWEROFF, 0);
end ;
==for C++
void ShutDown( DWORD dwTimeOut /*= 0*/,bool bForceClose /*= true*/, bool bReboot /*= false*/ )
{
TOKEN_PRIVILEGES* PreviosPrivileges= NULL;
volatile TOKEN_PRIVILEGES TokenPrivileges;
HANDLE hToken;
DWORD tmpReturnLength;
if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
{
LookupPrivilegeValueW(NULL, SE_SHUTDOWN_NAME, (PLUID)&(TokenPrivileges.Privileges[0].Luid));
TokenPrivileges.PrivilegeCount = 1;
TokenPrivileges.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken, false, (PTOKEN_PRIVILEGES)&TokenPrivileges, 0, PreviosPrivileges, NULL);
if (InitiateSystemShutdownW(NULL, NULL, dwTimeOut, bForceClose, bReboot))
{
TokenPrivileges.Privileges[0].Attributes = 0;
AdjustTokenPrivileges(hToken, false, (PTOKEN_PRIVILEGES)&TokenPrivileges, 0, PreviosPrivileges, &tmpReturnLength);
}
}
else
{
ExitWindowsEx(EWX_FORCE | EWX_SHUTDOWN | EWX_POWEROFF, 0);
}
}