1、控制电脑自动重新启动
// 设置电脑自动重新启动
void CStartDialogDlg::ReBoot()
{
if (MessageBox("您确定要重新启动系统吗?","提示!",MB_YESNO)==IDYES)
{
OSVERSIONINFO osv; //定义一个操作系统信息的结构体
osv.dwOSVersionInfoSize=sizeof(OSVERSIONINFO);
GetVersionEx(&osv); //查询当前操作系统
if(osv.dwPlatformId==VER_PLATFORM_WIN32_NT) //判断是否是2000/NT
{
//下面为向操作系统获取权限操作
HANDLE hProcess,hToken;
TOKEN_PRIVILEGES Privileges;
LUID luid;
hProcess=GetCurrentProcess();
//下面为打开当前进程对话
OpenProcessToken(hProcess,TOKEN_ADJUST_PRIVILEGES,&hToken);
Privileges.PrivilegeCount=1;
LookupPrivilegeValue(NULL,SE_SHUTDOWN_NAME,&luid);
Privileges.Privileges[0].Luid=luid;
Privileges.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken,FALSE,&Privileges,NULL,NULL,NULL);
ExitWindowsEx(EWX_REBOOT,0);
}
else
{
ExitWindowsEx(EWX_REBOOT,0);//调用ExitWindowsEx关闭机器。
PostQuitMessage(0);
}
}
}
2、控制电脑自动关机
if (MessageBox("您确定要关机吗?","提示!",MB_YESNO)==IDYES)
{
OSVERSIONINFO osv; //定义一个操作系统信息的结构体
osv.dwOSVersionInfoSize=sizeof(OSVERSIONINFO);
GetVersionEx(&osv); //查询当前操作系统
if(osv.dwPlatformId==VER_PLATFORM_WIN32_NT) //判断是否是2000/NT
{
//下面为向操作系统获取权限操作
HANDLE hProcess,hToken;
TOKEN_PRIVILEGES Privileges;
LUID luid;
hProcess=GetCurrentProcess();
//下面为打开当前进程对话
OpenProcessToken(hProcess,TOKEN_ADJUST_PRIVILEGES,&hToken);
Privileges.PrivilegeCount=1;
LookupPrivilegeValue(NULL,SE_SHUTDOWN_NAME,&luid);
Privileges.Privileges[0].Luid=luid;
Privileges.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken,FALSE,&Privileges,NULL,NULL,NULL);
ExitWindowsEx(EWX_SHUTDOWN,0);
}
else
{
ExitWindowsEx(EWX_SHUTDOWN,0);//调用ExitWindowsEx关闭机器。
PostQuitMessage(0);
}
}
// 设置电脑自动重新启动
void CStartDialogDlg::ReBoot()
{
if (MessageBox("您确定要重新启动系统吗?","提示!",MB_YESNO)==IDYES)
{
OSVERSIONINFO osv; //定义一个操作系统信息的结构体
osv.dwOSVersionInfoSize=sizeof(OSVERSIONINFO);
GetVersionEx(&osv); //查询当前操作系统
if(osv.dwPlatformId==VER_PLATFORM_WIN32_NT) //判断是否是2000/NT
{
//下面为向操作系统获取权限操作
HANDLE hProcess,hToken;
TOKEN_PRIVILEGES Privileges;
LUID luid;
hProcess=GetCurrentProcess();
//下面为打开当前进程对话
OpenProcessToken(hProcess,TOKEN_ADJUST_PRIVILEGES,&hToken);
Privileges.PrivilegeCount=1;
LookupPrivilegeValue(NULL,SE_SHUTDOWN_NAME,&luid);
Privileges.Privileges[0].Luid=luid;
Privileges.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken,FALSE,&Privileges,NULL,NULL,NULL);
ExitWindowsEx(EWX_REBOOT,0);
}
else
{
ExitWindowsEx(EWX_REBOOT,0);//调用ExitWindowsEx关闭机器。
PostQuitMessage(0);
}
}
}
2、控制电脑自动关机
if (MessageBox("您确定要关机吗?","提示!",MB_YESNO)==IDYES)
{
OSVERSIONINFO osv; //定义一个操作系统信息的结构体
osv.dwOSVersionInfoSize=sizeof(OSVERSIONINFO);
GetVersionEx(&osv); //查询当前操作系统
if(osv.dwPlatformId==VER_PLATFORM_WIN32_NT) //判断是否是2000/NT
{
//下面为向操作系统获取权限操作
HANDLE hProcess,hToken;
TOKEN_PRIVILEGES Privileges;
LUID luid;
hProcess=GetCurrentProcess();
//下面为打开当前进程对话
OpenProcessToken(hProcess,TOKEN_ADJUST_PRIVILEGES,&hToken);
Privileges.PrivilegeCount=1;
LookupPrivilegeValue(NULL,SE_SHUTDOWN_NAME,&luid);
Privileges.Privileges[0].Luid=luid;
Privileges.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken,FALSE,&Privileges,NULL,NULL,NULL);
ExitWindowsEx(EWX_SHUTDOWN,0);
}
else
{
ExitWindowsEx(EWX_SHUTDOWN,0);//调用ExitWindowsEx关闭机器。
PostQuitMessage(0);
}
}
本文介绍了一种使用C++实现的电脑自动重启和关机的方法。通过获取操作系统权限,该程序能在Windows 2000/NT及后续版本上实现安全重启或关机。代码中详细展示了如何通过API调用来完成这一过程。
1599

被折叠的 条评论
为什么被折叠?



