c++实现远程开关机「建议收藏」

c++实现远程开关机「建议收藏」把远程开、关机写成了一个类的两个静态函数。这两个功能的实现都需要事先对目标主机进行一些设置。其中远程开机需要目标主机主板支持,并且插上网线。部分主机的设置已经写明。另可实现方法:https://www.cnblogs.com/findumars/p/6009474.html原理参考:https://blog.csdn.net/smstong/article/details/16879347…

大家好,又见面了,我是你们的朋友全栈君。

把远程开、关机写成了一个类的两个静态函数。

这两个功能的实现都需要事先对目标主机进行一些设置。其中远程开机需要目标主机主板支持,并且插上网线。部分主机的设置已经写明。另可实现方法:https://www.cnblogs.com/findumars/p/6009474.html

原理参考:https://blog.csdn.net/smstong/article/details/16879347

/*****************************************************
 Author: 张志浩
 Mail: 791745123@qq.com
 Time: 2019-1-20
 Function:
	远程开关机工具,需要对目标主机作如下设置

 远程开机:
	1、BIOS设置
	(DELL):
		system setup->BIOS设置->Power Management->设置Deep Sleep Control为Disable Wake on Lan为LAN only
	(ASUS):
		Advance->APM->开启【Power On By PCIE】(PCIE: PCI-Ethernet)
	2、系统设置
		step one:设备管理器->网络适配器->选择对应网卡设备, 属性->高级->开启【Wake on Magic Packet】->开启【Wake			on Pattern match】->开启【关机 网络唤醒】->关闭【环保节能】

		step two:设备管理器->网络适配器->选择对应网卡设备, 属性->电源管理->关闭【允许计算机关闭此设备以节约电源】

 远程关机:
	1、启动Guest账户
		管理->计算机管理->本地用户和组->用户->选择Guest进入属性->关闭【账户已停用】

	2、允许Guest用户从网络访问此计算机
		本地安全属性->用户权限分配->从【拒绝从网络访问这台计算机】中删除Guest

	3、允许Guest用户从远端系统强制关机
		本地安全属性->用户权限分配->将Guest加入到【从远端系统强制关机】

 Version: v 1.0
*****************************************************/
#pragma once

#include <Windows.h>
#include <stdio.h>

#pragma comment(lib, "ws2_32.lib")
#pragma comment(lib, "advapi32.lib")

class CRemoteControl
{
public:
	CRemoteControl(void);
	~CRemoteControl(void);


public:
	static int Startup(char *chMac);
	static int Shutdown(char *chIP, int iTimeOut, bool bForceAppsClosed, bool bRebootAfterShutDown);
};

#include "RemoteControl.h"


CRemoteControl::CRemoteControl(void)
{

}


CRemoteControl::~CRemoteControl(void)
{
}

int CRemoteControl::Startup(char *chMac)
{
	//判断Mac地址格式
	for (char *a=chMac; *a; a++)
	{
		if (*a != '-' && !isxdigit(*a))
		{
			OutputDebugStringA("Mac address must be like this: 00-d0-4c-bf-52-ba");
			return -1;
		}
	}

	//字符串转数组
	int dstaddr[6];
	int i = sscanf(chMac, "%2x-%2x-%2x-%2x-%2x-%2x", &dstaddr[0], &dstaddr[1], &dstaddr[2], &dstaddr[3]
	, &dstaddr[4], &dstaddr[5]);


	if (i != 6)
	{
		OutputDebugStringA("Invalid mac address!");
		return -1;
	}

	//构造Magic Packet (包格式: "FFFFFFFFFFFF" + 重复16编mac地址)
	unsigned char ether_addr[6];
	for (i=0; i<6; i++)
	{
		ether_addr[i] = dstaddr[i];
	}

	u_char magicpacket[200];
	memset(magicpacket, 0xff, 6);
	int packetsize = 6;
	for (i=0; i<16; i++)
	{
		memcpy(magicpacket+packetsize, ether_addr, 6);
		packetsize += 6;
	}

	//创建广播套接字
	WSADATA WSAData;
	if (WSAStartup(MAKEWORD(2, 0), &WSAData) != 0)
	{
		OutputDebugStringA("WSAStartup failed");
		return -1;
	}

	SOCKET sock = socket(AF_INET, SOCK_DGRAM, 0);
	if (sock == INVALID_SOCKET)
	{
		OutputDebugStringA("Socket Create error");
		return -1;
	}

	BOOL bOptval = TRUE;
	int iOptLen = sizeof(BOOL);
	if (setsockopt(sock, SOL_SOCKET, SO_BROADCAST, (char*)&bOptval, iOptLen) == SOCKET_ERROR)
	{
		OutputDebugStringA("setsocketopt error!");
		closesocket(sock);
		WSACleanup();
		return -1;
	}

	sockaddr_in to;
	to.sin_family = AF_INET;
	to.sin_port = htonl(0);
	to.sin_addr.S_un.S_addr = htonl(INADDR_BROADCAST);

	//发送魔法包
	if (sendto(sock, (const char*)magicpacket, packetsize, 0, (const struct sockaddr*)&to, sizeof(to)) == SOCKET_ERROR)
	{
		OutputDebugStringA("Send error!");
	}
	else
	{
		OutputDebugStringA("Send success!");
	}

	closesocket(sock);
	WSACleanup();
	return 0;
}

int CRemoteControl::Shutdown(char *chIP, int iTimeOut, bool bForceAppsClosed, bool bRebootAfterShutDown)
{
	HANDLE hToken;
	TOKEN_PRIVILEGES tkp;

	BOOL fResult;
	if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
		return false;

	LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid);  
	tkp.PrivilegeCount = 1;
	tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;  
	AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES) NULL, 0);  
	if (GetLastError() != ERROR_SUCCESS)  
		return false;

	WCHAR wszIP[20];
	memset(wszIP, 0, sizeof(wszIP));
	MultiByteToWideChar(CP_ACP, 0, chIP, strlen(chIP)+1, wszIP, sizeof(wszIP)/sizeof(wszIP[0]));

	//发送指令,iTimeOut如果小于60,则对方机器关机前会显示“一分钟内关机”
	fResult = ::InitiateSystemShutdown(wszIP, NULL, iTimeOut, bForceAppsClosed, bRebootAfterShutDown);
	if (!fResult)
		return false;

	tkp.Privileges[0].Attributes = 0;
	AdjustTokenPrivileges(hToken, false, &tkp, 0, (PTOKEN_PRIVILEGES)NULL, 0);
	if(GetLastError() != ERROR_SUCCESS)
		return false;

	return true;
}

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/137304.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • @helper的使用

    @helper的使用、前言最近翻到一篇Scott的旧文,觉得挺不错的,就试着翻译了一下,文章主要是说如何在Razor中使用@helper语法定义可复用的视图模板方法。如有疏漏,还请请各位看官指点一二~原文地址:http:

    2022年7月3日
    32
  • Unix操作系统常用命令「建议收藏」

    Unix操作系统常用命令「建议收藏」Unix操作系统常用命令一、关于档案/目录处理的命令1、ls——列目录这是最基本的档案指令。ls的意义为”list”,也就是将某一个目录或是某一个档案的内容显示出来。格式:ls-1ACFLRabcdfgilmnopqrstux-W[sv][files]ls的常用参数如下:-a:在UNIX中若一个目录或文件名字的第一个字符为…

    2022年5月20日
    77
  • 在vb中什么被称为对象_vb控件数组怎么创建

    在vb中什么被称为对象_vb控件数组怎么创建在BCB中使用VCL控件数组(一)抱雪昨晚和网友邬彦华在OICQ上闲聊,他言及正在为朋友编一个游戏菜单,其中动态创建了一组按纽,最后却无法释放。他的实现方法如下:for(inti=1;i&lt;=ButtonCount;i++){TSpeedButton*spdBtn=newTSpeedButton(this);spdBtn-&gt;Parent=ScrollBox;//指定父…

    2025年11月24日
    2
  • pycharm不会自动补全括号_pycharm代码提示

    pycharm不会自动补全括号_pycharm代码提示安装pycharm后,输入代码后,没有补全提示首先检查是否关闭了代码提示,如下图,将红框中“PowerSaveMode”前的勾去掉第二步,如果在输入某些代码时还是没有补全提醒,可能是配置好python环境则点击file->settings->projectInterpreter,如下图选择安装的python输入代码就会有提示了…

    2022年8月28日
    4
  • 什么是td-scdma_TR缩写

    什么是td-scdma_TR缩写3GPP 3rd Generation PartnershipProject 第三代移动通信伙伴组织AAAAntenna Array 天线阵AALATM Adaptation Layer ATM适配层AAL2ATM Adaptati

    2022年9月26日
    3
  • 电脑显示与域服务器失去信任,此工作站和主域间的信任关系失败,退出域后也不能重新加入…

    电脑显示与域服务器失去信任,此工作站和主域间的信任关系失败,退出域后也不能重新加入…谢谢前面的回答,但觉得只是提供了分析问题的思路!我用问题的英文翻译“Thetrustrelationshipbetweenthisworkstationandtheprimarydomainfailed”进行搜索发现以下这样一篇博文,按照其方法操作已经成功解决问题。基本原理就是通过命令重建服务器与该失信客户端之间联系的密码。具体操作步骤:(前提是没有退出域,或可以系统还原为没…

    2022年10月19日
    5

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号