//关机函数 BOOL Shutdown(BOOL bForce) { EnableShutdownPrivilege(); //使能关机特权函数 if(bForce) return ::ExitWindowsEx(EWX_SHUTDOWN | EWX_FORCE,0); //强制关机 else return ::ExitWindowsEx(EWX_SHUTDOWN,0); }
//重启函数 BOOL Reboot(BOOL bForce) { EnableShutdownPrivilege(); //使能关机特权函数 if(bForce) return ::ExitWindowsEx(EWX_REBOOT | EWX_FORCE,0); //强制重启 else return ::ExitWindowsEx(EWX_REBOOT,0); }
MI_Result ScheduleRestart( _Outptr_result_maybenull_ MI_Instance **cimErrorDetails) { MI_Uint32 dwError = ERROR_SUCCESS; HANDLE hToken; MI_Boolean bRevertToSelf = MI_FALSE; Intlstr intlstr = Intlstr_Null; MI_Result result = MI_RESULT_OK; if (cimErrorDetails == NULL) { return MI_RESULT_INVALID_PARAMETER; } *cimErrorDetails = NULL; // Explicitly set *cimErrorDetails to NULL as _Outptr_ requires setting this at least once. DSC_EventWriteMessageScheduleReboot(); GetResourceString(ID_LCMHELPER_SHUTDOWN_MESSAGE, &intlstr); if (!OpenThreadToken(GetCurrentThread(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY | TOKEN_DUPLICATE, TRUE, &hToken)) { if (GetLastError() == ERROR_NO_TOKEN) { SetLastError(ERROR_SUCCESS); if (!ImpersonateSelf(SecurityImpersonation)) { return GetCimWin32Error(GetLastError(), cimErrorDetails, ID_LCMHELPER_THREADIMPERSONATION_FAILED); } if (!OpenThreadToken(GetCurrentThread(), TOKEN_IMPERSONATE | TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY | TOKEN_DUPLICATE, TRUE, &hToken)) { RevertToSelf(); return GetCimWin32Error(GetLastError(), cimErrorDetails, ID_LCMHELPER_THREADIMPERSONATION_FAILED); } bRevertToSelf = MI_TRUE; } else { return GetCimWin32Error(GetLastError(), cimErrorDetails, ID_LCMHELPER_THREADIMPERSONATION_FAILED); } } result = EnableShutdownPrivilege(hToken, cimErrorDetails); if (result != MI_RESULT_OK) { if (bRevertToSelf) { RevertToSelf(); } return result; } #ifdef _PREFAST_ #pragma prefast (push) #pragma prefast (disable: 28159) //This is needed to reconfigure windows server to finish configuring the system by DSC. #endif /* _PREFAST_ */ dwError = InitiateSystemShutdownEx(NULL, (MI_Char*)intlstr.str, DSC_REBOOT_GRACEPERIOD, TRUE, TRUE, SHTDN_REASON_MAJOR_APPLICATION | SHTDN_REASON_MINOR_MAINTENANCE | SHTDN_REASON_FLAG_PLANNED); #ifdef _PREFAST_ #pragma prefast (pop) #endif /* _PREFAST_ */ if (bRevertToSelf) { RevertToSelf(); } if (intlstr.str ) { Intlstr_Free(intlstr); } if (!dwError) { return GetCimWin32Error(GetLastError(), cimErrorDetails, ID_LCMHELPER_SHUTDOWN_FAILED); } return MI_RESULT_OK; }