• 大小: 3.06KB
    文件类型: .zip
    金币: 1
    下载: 0 次
    发布日期: 2024-04-22
  • 语言: C/C++
  • 标签:

资源简介

        通过向通过状态下的目标计算机网卡发送魔术包,远程控制目标计算机开机; 以及远程控制计算机关机。

资源截图

代码片段和文件信息

/******
 * WakeOnLAN
 * 注意:需要设置广播地址,例如:192.168.1.255
 ******/

#include 
#include 
#include 

#include “TRemoteCtrlPC.h“


TRemoteCtrlPC::TRemoteCtrlPC(Qobject *parent)
{
    Q_UNUSED(parent)
}

/* Note:
 * 被控计算机需要支持网络唤醒功能(Wake on LAN)
 * 1.组织魔法包(MgicPacket) 由6字节0xFF和重复16次的MAC地址  102字节
 * 2.通过UDP的方式广播 IP地址为路由的广播地址 如:网段为192.168.1.xIP设为192.168.1.255
 * @strMac:  格式示例 “20:af:0a:47:aa:bb“
 */
void TRemoteCtrlPC::wakeOnLAN(QString strMac)
{
    /*将字符串MAC转换成十六进制 存入数组*/
    char cstrMacAddr[6];
    bool isOK;
    for(int j = 0;j < 6; j++){
        if(j < 5){
            cstrMacAddr[j] = strMac.mid(strMac.indexOf(“:“j*3) - 22).toInt(&isOK16);
            if(false == isOK)
                return ;
        }else if(j == 5){
            cstrMacAddr[j] = strMac.mid(strMac.indexOf(“:“j*3 - 1) + 12).toInt(&isOK16);
            if(false == isOK)
                return ;
        }
    }

    /*构建一个魔术唤醒包  6字节0xFF 和  16次的 Mac地址*/
    QByteArray magicPacket;

    /*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];
    }

    QHostAddress FakeAddress;
    FakeAddress.setAddress (“255.255.255.255“);

    QUdpSocket udpSocket;
    udpSocket.writeDatagram(magicPacket 102 FakeAddress 9);
}

/* https://blog.csdn.net/smstong/article/details/16879347 */
/* https://www.cnblogs.com/shenjieblog/p/5455691.html
* Note:实现远程关机原理
* 1.用户管理:被控计算机启用来宾账户(Guest)
* 2.运行gpedit.msc  允许Guest强制关机  拒绝从网络访问计算机里删除  Guest
*/

void TRemoteCtrlPC::remoteShutDown(QString strIp)
{
    m_strIp = strIp;
    /*命令的执行过程会阻塞 放入线程执行*/
    this->start();
}

void TRemoteCtrlPC::run()
{
    QProcess cmd;
    QString strResult;
    QByteArray arrayOut;
    QString strCmd = “shutdown -s -t 5 -m \\\\“; //四个斜杠  转义
    strCmd += m_strIp;


   // qDebug()<<“关闭电脑:“<
    cmd.start(strCmd);
    cmd.waitForFinished();       // !!!阻塞操作 放在主线程会导致窗口卡死  直至执行完成

    arrayOut = cmd.readAllStandardOutput();
    strResult = QString::fromLocal8Bit(arrayOut);

    emit signalCmdFinished(strResult); //命令执行完成   返回命令执行结果
}


 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     文件         452  2020-06-14 10:06  tremotectrlpc.h
     文件        1621  2020-06-14 10:24  ttestforremotectrlpc.cpp
     文件         570  2020-06-14 10:06  ttestforremotectrlpc.h
     文件        2724  2020-06-22 07:30  tremotectrlpc.cpp

评论

共有 条评论

相关资源