当前位置:   article > 正文

C/C++控制Windows关机/注销/重启的正确姿势

c++builder 控制windows强制关机

简介

说到代码控制Windows关机/注销/重启的方式,有很多种,最简单的不过就是控制命令行,使用system("pause")函数执行一个shutdown -s -t 0,关机就完成了。但这种方式还要借助于命令行的方式解决问题。而Windows早就提供给我们直接控制关机/注销/重启的API了,在WindwosNT系统之前,只需调用ExitWindowsEx()就OK了。但自从出现了WindowsNT系统后,权限意识大大提高,为了提高系统的安全性,微软要求Windows执行关机/重启这类命令时一定要先提升进程权限,再执行ExitWindowsEx()函数。所以在NT代表的系统中,提升权限就得用到OpenProcessToken()函数打开进程的权限令牌,然后使用LookupPrivilegeValue()函数提取出关机权限所对应的Luid,再调用AdjustTokenPrivileges()函数修改对应权限即可。虽然操作繁琐了一些,但是并不复杂,相对于执行命令行的关机指令而言更加具有健壮性,不容易被拦截。


C++代码样例

  1. /*
  2. 本程序只演示关机,注销,重启三种功能,主要目的是理解进程权限的控制,其他功能可详见MSDN文档说明
  3. */
  4. #include <cstdio>
  5. #include <cstdlib>
  6. #include <cstring>
  7. #include <conio.h>
  8. #include <ctype.h>
  9. #include <iostream>
  10. #include <windows.h>
  11. using namespace std;
  12. /*
  13. 提升进程权限
  14. */
  15. bool improvePv()
  16. {
  17. HANDLE hToken;
  18. TOKEN_PRIVILEGES tkp;
  19. if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ALL_ACCESS, &hToken)) return false;
  20. if (!LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid)) return false;
  21. tkp.PrivilegeCount = 1;
  22. tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
  23. if (!AdjustTokenPrivileges(hToken, FALSE, &tkp, NULL, NULL, NULL)) return false;
  24. return true;
  25. }
  26. /*
  27. 关机
  28. */
  29. bool powerOffProc()
  30. {
  31. if (!improvePv() || !ExitWindowsEx(EWX_POWEROFF | EWX_FORCE, SHTDN_REASON_MAJOR_APPLICATION)) return false;
  32. return true;
  33. }
  34. /*
  35. 注销
  36. */
  37. bool logOffProc()
  38. {
  39. if (!improvePv() || !ExitWindowsEx(EWX_LOGOFF | EWX_FORCE, SHTDN_REASON_MAJOR_APPLICATION)) return false;
  40. return true;
  41. }
  42. /*
  43. 重启
  44. */
  45. bool reBootProc()
  46. {
  47. if (!improvePv() || !ExitWindowsEx(EWX_REBOOT | EWX_FORCE, SHTDN_REASON_MAJOR_APPLICATION)) return false;
  48. return true;
  49. }
  50. int main(void)
  51. {
  52. CHAR ch;
  53. printf(">>>>>>>>>>>>>>>>>>>>>> Demo >>>>>>>>>>>>>>>>>\n*\n");
  54. printf("* 1. Power_Off\n*\n");
  55. printf("* 2. Log_Off\n*\n");
  56. printf("* 3. ReBoot\n*\n");
  57. printf(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n");
  58. ch = getch();
  59. while (1)
  60. {
  61. switch (ch)
  62. {
  63. case '1':
  64. if (!powerOffProc())
  65. {
  66. printf("Process Error!\n");
  67. continue;
  68. }
  69. return 0;
  70. case '2':
  71. if (!logOffProc())
  72. {
  73. printf("Process Error!\n");
  74. continue;
  75. }
  76. return 0;
  77. case '3':
  78. if (!reBootProc())
  79. {
  80. printf("Process Error!\n");
  81. continue;
  82. }
  83. return 0;
  84. default:
  85. printf("Error!\n");
  86. }
  87. }
  88. system("pause");
  89. return 0;
  90. }

转载于:https://www.cnblogs.com/PeterZ1997/p/9531662.html

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/205193
推荐阅读
相关标签
  

闽ICP备14008679号