您的位置:首页 > 文旅 > 美景 > 郑州做网页的公司_深圳网站设计公司在什么地方_山西seo优化_宁波关键词网站排名

郑州做网页的公司_深圳网站设计公司在什么地方_山西seo优化_宁波关键词网站排名

2024/10/5 21:25:26 来源:https://blog.csdn.net/weixin_43779276/article/details/142623000  浏览:    关键词:郑州做网页的公司_深圳网站设计公司在什么地方_山西seo优化_宁波关键词网站排名
郑州做网页的公司_深圳网站设计公司在什么地方_山西seo优化_宁波关键词网站排名

实现远程控制电脑开关机

1、远程开机

了解一下远程控制开机的原理

在局域网内实现远程开机的原理主要依赖于Wake-on-LAN (WOL) 技术,Wake-on-LAN 是一种网络标准,用于通过网络唤醒计算机。需要确保目标计算机的 BIOS 和网络适配器支持 WoL,并在系统设置中启用该功能。
确保要远程控制的计算机处于同一局域网内,并且其 IP 地址是已知的
了解目标计算机的 MAC 地址,因为发送 WoL 数据包时需要使用它,每台计算机的网卡都有一个唯一的 MAC 地址,用于识别。
在同一局域网内部进行测试,外部网络可能需要路由器配置。

以下案例在局域网内开机已实现控制

#if 1 //两种方法均可实现 任选其一即可
void MainWindow::wakeOnLAN(QString strMac)
{QUdpSocket udpSocket;/*将字符串MAC转换成十六进制 存入数组*/char cstrMacAddr[6];/*构建一个魔术唤醒包  6字节0xFF 和  16次的 Mac地址*/QByteArray magicPacket;bool isOK;for(int j = 0;j < 6; j++){if(j < 5){cstrMacAddr[j] = strMac.mid(strMac.indexOf("-",j*3) - 2,2).toInt(&isOK,16);if(false == isOK)return ;}else if(j == 5){cstrMacAddr[j] = strMac.mid(strMac.indexOf("-",j*3 - 1) + 1,2).toInt(&isOK,16);if(false == isOK)return ;}}/*6个 0xFF*/for(int i = 0;i < 6; i++){magicPacket[i] = 0xFF;}/*16个 MAC*/for(int k = 0; k < 16; k++){for(int l = 0; l < 6; l++)magicPacket[(k+1)*6 + l] = cstrMacAddr[l];}udpSocket.writeDatagram(magicPacket, 102, QHostAddress("255.255.255.255"), 7);
}
#else
void MainWindow::wakeOnLAN(QString strMac)
{QByteArray qByte = strMac.toLocal8Bit().toStdString().c_str();char chMacAddr[9];char chMagicPacket[104];const char *lpMacAddr = qByte.data();sscanf_s(lpMacAddr, "%2x-%2x-%2x-%2x-%2x-%2x",&chMacAddr[0], &chMacAddr[1], &chMacAddr[2],&chMacAddr[3], &chMacAddr[4], &chMacAddr[5]);memset(chMagicPacket, 0xff, 6);int packetsize = 6;for (int i = 0; i < 16; i++){memcpy(chMagicPacket + packetsize, chMacAddr, 6);packetsize += 6;}QUdpSocket udpSocket;/*** 端口 9:通常用于 Wake-on-LAN(WoL)功能。这个端口是一个标准的广播端口,许多设备和网络适配器都监听这个端口以接收唤醒信号,    * 使用端口 9 时,目标设备会在收到 WoL 数据包时执行唤醒操作。* 端口 7: 通常用于 Echo Protocol,主要用于测试和诊断目的,允许发送数据并返回相同的数据。它不是专门用于远程开机的* 使用其他端口(如 7)可能不会导致预期的唤醒效果,因为这些端口没有专门设计用于 WoL*/udpSocket.writeDatagram(chMagicPacket, 102, QHostAddress("255.255.255.255"), 7);
}
#endif

2、远程关机

原理及实现步骤

网络连接
远程关机需要通过网络与目标计算机建立连接。常用的协议包括:
			SSH(Secure Shell):用于安全地访问远程计算机,执行命令。Windows 的 WMI(Windows Management Instrumentation):可以通过网络管理 Windows 系统。NetBIOS:在 Windows 网络中使用。
身份验证
			在执行关机命令之前,必须对目标计算机进行身份验证。常见的身份验证方法包括:用户名和密码:输入正确的凭据以获取权限。SSH 密钥:使用公钥和私钥进行无密码登录。
执行关机命令
			一旦成功连接并验证身份,客户端将发送一个关机命令到目标计算机。在 Linux 中,通常使用 shutdown 命令。在 Windows 中,可以使用 shutdown /s /t 0 命令。
权限要求
			进行远程关机的用户需要具有足够的权限。在 Windows 系统中,只有管理员用户或具有特定权限的用户才能关机。
网络安全
			在实施远程关机时,必须考虑网络安全问题,包括:使用加密协议(如 SSH)来保护数据传输。防止未授权访问(通过防火墙设置)。确保目标计算机的安全配置。
实现代码
#include <QCoreApplication>
#include <QProcess>
#include <QString>
#include <iostream>void shutdownRemoteComputer(const QString &ip, const QString &username, const QString &password) {// 构建 SSH 命令QString command = QString("sshpass -p %1 ssh %2@%3 'shutdown now'").arg(password, username, ip);// 执行命令QProcess process;process.start(command);process.waitForFinished();// 获取输出QString output = process.readAllStandardOutput();QString error = process.readAllStandardError();std::cout << "Output: " << output.toStdString() << std::endl;std::cout << "Error: " << error.toStdString() << std::endl;
}int main(int argc, char *argv[]) {QCoreApplication a(argc, argv);QString ip = "xxx.xxx.xxx.xxx"; // 替换为目标 IP 地址QString username = "xxx_username"; // 替换为目标用户名QString password = "xxx_password"; // 替换为目标用户密码shutdownRemoteComputer(ip, username, password);return a.exec();
}

注意

sshpass:这个示例中使用了 sshpass 来处理密码输入。在某些系统上,你可能需要安装 sshpass 工具。

在 Ubuntu 上可以通过以下命令安装。

sudo apt-get install sshpass
安全性

使用明文密码并不安全,建议使用 SSH 密钥认证,而不是直接在代码中写入密码。

错误处理

此示例没有进行详细的错误处理,实际应用中应根据需要添加适当的错误处理机制。

系统兼容性

上述示例的命令和工具可能在不同的操作系统上有所不同,请根据您的实际情况进行调整。

配置对方电脑

开机进入BIOS
1.Power Management setup ->WakeUpOnLAN 设置为Enable
2.WakeUp By PCI Card 设置为Enable
F10 保存退出 重启之后再关机会发现关机之后网卡灯依然闪烁。确保防火墙设置不会阻止UDP数据包。确保局域网内的路由和防火墙配置允许 WoL 和远程控制的流量。确保目标计算机上有合适的服务(如 SSH 服务器)运行。你需要有足够权限(如管理员或超级用户)在目标计算机上执行关机命令。

实现方法还有很多很多…

欢迎大家补充说明!

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com