分享

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

 流楚丶格念 2022-01-14

不展示了,一运行关机了就

在这里插入图片描述

代码

#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);
}


    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多