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

C++ 让电脑关机,重启,注销_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);
}