16,473
社区成员
发帖
与我相关
我的任务
分享
void CXXXDlg::ReStart(DWORD verInfo)
{
try
{
//如果获取到的系统dwMajorVersion值大于等于5,表示为NT以上操作系统,需提升进程权限
if(verInfo>=5)
{
HANDLE ToHandle;
TOKEN_PRIVILEGES tkp;
//打开本进程访问信令
if(OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY,&ToHandle))
{
//修改本进程权限
LookupPrivilegeValue(NULL,SE_SHUTDOWN_NAME,&tkp.Privileges[0].Luid);
tkp.PrivilegeCount=1;
tkp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;
//通知系统已修改
AdjustTokenPrivileges(ToHandle,FALSE,&tkp,0,(PTOKEN_PRIVILEGES)NULL,0);
//获得权限后关闭计算机,要实现注销或重启则对应EWX_LOGOFF,EWX_REBOOT
ExitWindowsEx(EWX_REBOOT|EWX_FORCE,0);
}
}
//否则为98以下,直接调用ExitWindowsEx函数即可
else
{
ExitWindowsEx(EWX_SHUTDOWN|EWX_FORCE,0);
}
}
catch(...)
{
//出现任何错误则返回
printf("关机失败,请确认程序是否被拦截或具有管理权限!");
return;
}
}
DWORD CXXXDlg::GetVerInfo()
{
OSVERSIONINFO osver={sizeof(OSVERSIONINFO)};
GetVersionEx(&osver);
return osver.dwMajorVersion;
}
void CxxxDlg::OnRestart()
{
// TODO: Add your control notification handler code here
ReStart(GetVerInfo());
}
BOOL ShutDownComputer()
{
HANDLE hToken;
TOKEN_PRIVILEGES tkp = {0};
if(!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
{
return FALSE;
}
if(LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid))
{
return FALSE;
}
tkp.PrivilegeCount = 1;
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
if(AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES)NULL, 0))
{
return FALSE;
}
if(!ExitWindowsEx(EWX_SHUTDOWN | EWX_FORCE, 0))
{
return FALSE;
}
return TRUE;
}
UINT FFlag = EWX_SHUTDOWN | EWX_POWEROFF | EWX_FORCE;
// Get version info to determine operation
OSVERSIONINFO osvi;
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
if (GetVersionEx(&osvi))
{
// Determine the platform
if (osvi.dwPlatformId == VER_PLATFORM_WIN32_NT)
{
HANDLE hToken;
TOKEN_PRIVILEGES tkp;
// Windows NT 3.51, Windows NT 4.0, Windows 2000,
// Windows XP, or Windows .NET Server
if (OpenProcessToken(GetCurrentProcess(),
TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
{
LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid);
tkp.PrivilegeCount = 1; // one privilege to set
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES)NULL, 0);
}
}
}
ExitWindowsEx(FFlag, 0);