C++ 让电脑关机,重启,注销

简介: C++ 让电脑关机,重启,注销

代码


#include <windows.h>
#include <iostream>
#include <string.h>
using namespace std;
//功能实现  
BOOL ReSetWindows(DWORD dwFlags, BOOL bForce)
{
  //检查参数是否正确  
  if (dwFlags != EWX_LOGOFF && dwFlags != EWX_REBOOT && dwFlags != EWX_SHUTDOWN)
    return FALSE;
  //获得系统的版本信息,让我们后面确定是否需要提升系统权限  
  OSVERSIONINFO osvi = { 0 };
  //获得参数的大小,以提供给GetVersionEx来判断这是一个新版本的OSVERSIONINFO,还是旧版本的  
  //新版本是OSVERSIONINFOEX。扩充版本  
  osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
  //if (!GetVersionExA(&osvi))
  //{
  //  return FALSE;
  //}
  //检查操作系统的版本,如果是NT类型的系统,需要提升系统权限  
  if (osvi.dwPlatformId == VER_PLATFORM_WIN32_NT)
  {
    //EnableShutDownPriv();  
  }
  //判断是否是强制关机,强制关闭系统进程。  
  dwFlags |= (bForce != FALSE) ? EWX_FORCE : EWX_FORCEIFHUNG;
  //调用API  
  return ExitWindowsEx(dwFlags, 0);
}
//用来提升系统权限
//这是一个通用的提升权限函数,如果需要提升其他权限  
//更改LookupPrivilegeValue的第二个参数SE_SHUTDOWN_NAME,即可  
BOOL EnableShutDownPriv()
{
  HANDLE hToken = NULL;
  TOKEN_PRIVILEGES tkp = { 0 };
  //打开当前程序的权限令牌  
  if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
  {
    return FALSE;
  }
  //获得某一特定权限的权限标识LUID,保存在tkp中  
  if (!LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid))
  {
    CloseHandle(hToken);
    return FALSE;
  }
  tkp.PrivilegeCount = 1;
  tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
  //调用AdjustTokenPrivileges来提升我们需要的系统权限  
  if (!AdjustTokenPrivileges(hToken, FALSE, &tkp, sizeof(TOKEN_PRIVILEGES), NULL, NULL))
  {
    CloseHandle(hToken);
    return FALSE;
  }
  return TRUE;
}
BOOL Judge(int key)
{
  //调用方法:提升软件系统的权限
  EnableShutDownPriv();
  switch (key)
  {
  case 1001://关机 
    ReSetWindows(EWX_SHUTDOWN, true);
    break;
  case 1002://重启 
    ReSetWindows(EWX_REBOOT, true);
    break;
  case 1003://注销
    ReSetWindows(EWX_LOGOFF, false);
    break;
  }
  return 0;
}
int main(int argc, char *argv[])
{
  char *tmp = argv[0];
  int key = atoi(tmp);
  Judge(key);
}
相关文章
|
6月前
|
C++
C++示例(电脑组装)展现C++多态的优势以及虚函数抽象类的应用
C++示例(电脑组装)展现C++多态的优势以及虚函数抽象类的应用
|
6月前
|
开发框架 监控 安全
电脑内网监控软件的跨平台支持:使用Qt实现的C++代码
在当今数字化时代,对于网络安全的关注越来越高。为了确保企业和个人的网络安全,监控内网活动变得至关重要。本文将介绍一种基于Qt框架实现的C++代码,用于开发跨平台的内网监控软件。
288 0
|
存储 C++
C++多态案例(三)-电脑组装
例描述:** 电脑主要组成部件为 CPU(用于计算),显卡(用于显示),内存条(用于存储) 将每个零件封装出抽象基类,并且提供不同的厂商生产不同的零件,例如Intel厂商和Lenovo厂商 创建电脑类提供让电脑工作的函数,并且调用每个零件工作的接口 测试时组装三台不同的电脑进行工作
159 0
C++多态案例(三)-电脑组装
|
6天前
|
存储 编译器 C++
【c++】类和对象(中)(构造函数、析构函数、拷贝构造、赋值重载)
本文深入探讨了C++类的默认成员函数,包括构造函数、析构函数、拷贝构造函数和赋值重载。构造函数用于对象的初始化,析构函数用于对象销毁时的资源清理,拷贝构造函数用于对象的拷贝,赋值重载用于已存在对象的赋值。文章详细介绍了每个函数的特点、使用方法及注意事项,并提供了代码示例。这些默认成员函数确保了资源的正确管理和对象状态的维护。
29 4
|
7天前
|
存储 编译器 Linux
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
26 4
|
30天前
|
存储 编译器 对象存储
【C++打怪之路Lv5】-- 类和对象(下)
【C++打怪之路Lv5】-- 类和对象(下)
27 4
|
30天前
|
编译器 C语言 C++
【C++打怪之路Lv4】-- 类和对象(中)
【C++打怪之路Lv4】-- 类和对象(中)
23 4
|
30天前
|
存储 安全 C++
【C++打怪之路Lv8】-- string类
【C++打怪之路Lv8】-- string类
21 1
|
1月前
|
存储 编译器 C++
【C++类和对象(下)】——我与C++的不解之缘(五)
【C++类和对象(下)】——我与C++的不解之缘(五)
|
1月前
|
编译器 C++
【C++类和对象(中)】—— 我与C++的不解之缘(四)
【C++类和对象(中)】—— 我与C++的不解之缘(四)