为什么VC中调用ExitWindowsEX(,)函数能够注销却不能进行关机和重启等操作
答案:2 悬赏:20 手机版
解决时间 2021-02-12 15:27
- 提问者网友:献世佛
- 2021-02-11 21:08
为什么MFC中调用ExitWindowsEX(,)函数能够注销却不能进行关机和重启等操作
最佳答案
- 五星知识达人网友:怙棘
- 2021-02-11 21:32
ExitWindowsEx在Window98中可以直接调用实现windows的关闭,注销,重启
但在windows2000/XP中需要铜鼓AdjustTokenPrivileges来修改当前进程的令牌权限后才能实现关闭和重启
// 获取执行权限
void CWindowsOPDlg::AdjustToken()
{
// 该函数在OnInitDialog()函数中调用
static HANDLE hToken;
static TOKEN_PRIVILEGES tp;
static LUID luid;
::OpenProcessToken(::GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken);
::LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &luid);
tp.PrivilegeCount = 1;
tp.Privileges[0].Luid = luid;
tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
::AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(TOKEN_PRIVILEGES), NULL, NULL);
}
// 重启
void CWindowsOPDlg::OnButton1()
{
::ExitWindowsEx(EWX_REBOOT, 0);
}
// 关闭
void CWindowsOPDlg::OnButton2()
{
::ExitWindowsEx(EWX_POWEROFF, 0);
}
// 注销
void CWindowsOPDlg::OnButton3()
{
::ExitWindowsEx(EWX_LOGOFF, 0);
}
但在windows2000/XP中需要铜鼓AdjustTokenPrivileges来修改当前进程的令牌权限后才能实现关闭和重启
// 获取执行权限
void CWindowsOPDlg::AdjustToken()
{
// 该函数在OnInitDialog()函数中调用
static HANDLE hToken;
static TOKEN_PRIVILEGES tp;
static LUID luid;
::OpenProcessToken(::GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken);
::LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &luid);
tp.PrivilegeCount = 1;
tp.Privileges[0].Luid = luid;
tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
::AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(TOKEN_PRIVILEGES), NULL, NULL);
}
// 重启
void CWindowsOPDlg::OnButton1()
{
::ExitWindowsEx(EWX_REBOOT, 0);
}
// 关闭
void CWindowsOPDlg::OnButton2()
{
::ExitWindowsEx(EWX_POWEROFF, 0);
}
// 注销
void CWindowsOPDlg::OnButton3()
{
::ExitWindowsEx(EWX_LOGOFF, 0);
}
全部回答
- 1楼网友:渊鱼
- 2021-02-11 23:12
我是来看评论的
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯