QQ登录

只需一步,快速开始

上位机MFC如何注销关闭重启系统

[ 复制链接 ]
这里准备三个按钮的点击函数,可以在自己的工程里调用测试效果。
记录保存电脑全部任务。

  1. void CDemoDlg::OnTest1()
  2. {
  3.         if (IDNO == MessageBox(_T("是否注销系统?"), _T("Demo"), MB_YESNO))
  4.         {
  5.                 return;
  6.         }

  7.         //打开进程令牌
  8.         HANDLE hToken;
  9.         if (!OpenProcessToken(GetCurrentProcess(),
  10.                         TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
  11.         {
  12.                 AfxMessageBox(_T("OpenProcessToken Error."));
  13.         }

  14.         //获得LUID
  15.         TOKEN_PRIVILEGES tkp;
  16.         LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid);
  17.         tkp.PrivilegeCount = 1;
  18.         tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

  19.         //调整令牌权限
  20.         AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES)NULL, 0);
  21.     if (GetLastError() != ERROR_SUCCESS)
  22.         {
  23.         AfxMessageBox(_T("AdjustTokenPrivileges Error."));
  24.         }

  25.         //注销系统
  26.     if (!ExitWindowsEx(EWX_LOGOFF, 0))
  27.         {
  28.         AfxMessageBox(_T("ExitWindowsEx Error."));
  29.         }       
  30. }

  31. void CDemoDlg::OnTest2()
  32. {
  33.         if (IDNO == MessageBox(_T("是否关闭系统?"), _T("Demo"), MB_YESNO))
  34.         {
  35.                 return;
  36.         }

  37.         //打开进程令牌
  38.         HANDLE hToken;
  39.         if (!OpenProcessToken(GetCurrentProcess(),
  40.                         TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
  41.         {
  42.                 AfxMessageBox(_T("OpenProcessToken Error."));
  43.         }

  44.         //获得LUID
  45.         TOKEN_PRIVILEGES tkp;
  46.         LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid);
  47.         tkp.PrivilegeCount = 1;
  48.         tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

  49.         //调整令牌权限
  50.         AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES)NULL, 0);
  51.     if (GetLastError() != ERROR_SUCCESS)
  52.         {
  53.         AfxMessageBox(_T("AdjustTokenPrivileges Error."));
  54.         }

  55.         //关闭系统
  56.     if (!ExitWindowsEx(EWX_SHUTDOWN, 0))
  57.         {
  58.         AfxMessageBox(_T("ExitWindowsEx Error."));
  59.         }       
  60. }

  61. void CDemoDlg::OnTest3()
  62. {
  63.         if (IDNO == MessageBox(_T("是否重启系统?"), _T("Demo"), MB_YESNO))
  64.         {
  65.                 return;
  66.         }

  67.         //打开进程令牌
  68.         HANDLE hToken;
  69.         if (!OpenProcessToken(GetCurrentProcess(),
  70.                         TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
  71.         {
  72.                 AfxMessageBox(_T("OpenProcessToken Error."));
  73.         }

  74.         //获得LUID
  75.         TOKEN_PRIVILEGES tkp;
  76.         LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid);
  77.         tkp.PrivilegeCount = 1;
  78.         tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

  79.         //调整令牌权限
  80.         AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES)NULL, 0);
  81.     if (GetLastError() != ERROR_SUCCESS)
  82.         {
  83.         AfxMessageBox(_T("AdjustTokenPrivileges Error."));
  84.         }

  85.         //重启系统
  86.     if (!ExitWindowsEx(EWX_REBOOT, 0))
  87.         {
  88.         AfxMessageBox(_T("ExitWindowsEx Error."));
  89.         }       
  90. }
复制代码


回复

使用道具 举报

快速回复 返回列表 客服中心 搜索