obsidian/笔记文件/2.笔记/WMIC功能整理.md
2025-03-26 00:02:56 +08:00

8.3 KiB
Raw Permalink Blame History

#qt

功能说明,参考Windows WMIC命令使用详解

新建一个QDialog的测试工程默认mingw编译方式即可。 再添加一个WMIC的测试C++文件对。

头文件

#ifndef WMIC_H
#define WMIC_H

#include <QObject>

namespace WMIC {

QString result(const QString& args);
QStringList list(const QString& args);
QString fingerprint();

/**
 * SMBIOS 中的计算机系统产品信息
 *
 * UUID - 通用唯一识别码这是一个在所有时间和空间中都保证是唯一的标识符例如03C00218-044D-05CE-6906-130700080009
 */
namespace CSPRODUCT {
QString UUID();
}

/**
 * 已安装操作系统的管理
 *
 * Caption - 操作系统
 * Version - 系统版本
 *
 */
namespace OS {
QString Caption();
QString Version();
}

/**
 * 图形处理单元GPU信息
 *
 * Name - 显卡的名称例如NVIDIA GeForce GTX 1660 Ti
 * AdapterCompatibility - 显卡制造商例如NVIDIA
 * DeviceID - 显卡的设备标识符例如VideoController1
 * AdapterRAM - 显卡的内存大小以字节为单位例如4293918720
 * DriverVersion - 当前安装的显卡驱动程序版本例如27.21.14.5671
 *
 */
namespace GPU {
QString Name(); // 显卡名称:
QString AdapterCompatibility();
QString DeviceID();
QString AdapterRAM();
QString DriverVersion();
}

/**
 * 处理器信息
 *
 * Name - 处理器的名称。
 * ProcessorId - 唯一的处理器识符。
 * NumberOfCores - 处理器的物理核心数量。
 * NumberOfLogicalProcessors - 处理器的逻处理器数量,这可能包括超线程技术。
 * Caption - CPU的具体型号和架构信息
 * AddressWidth - 处理器的地址宽度,通常是 32 位或 64 位
 *
 */
namespace CPU{
QString Name();
QString ProcessorId();
int NumberOfCores();
int NumberOfLogicalProcessors();
QString Caption();
int AddressWidth();
}

/**
 * 网卡信息
 * Name - 网卡名称
 * MACAddress - MAC地址
 */
namespace NIC {
QString Name();
QString MACAddress();
}

/**
 * 物理磁盘驱动器管理
 *
 * indexs - 物理磁盘序号列表
 * Caption - 指定序号的磁盘信息
 * Size - 指定序号的磁盘容量,以字节为单位
 * SerialNumber - 指定序号的磁盘序列号
 */
namespace DISKDRIVE {
QList<int> indexs();
QString Caption(int index);
qint64 Size(int index);
QString SerialNumber(int index);
}

/**
 * 计算机系统管理
 * TotalPhysicalMemory - 总物理内存,以字节为单位
 */
namespace COMPUTERSYSTEM {
qint64 TotalPhysicalMemory();
}

}

#endif // WMIC_H

cpp文件

#include "wmic.h"

#include <QProcess>
#include <QDebug>
#include <QRegularExpression>
#include <QCryptographicHash>

QString WMIC::result(const QString &cmd)
{
    static QRegularExpression re("\\s+");
    QStringList args = cmd.split(re);
    QProcess p;
    p.start("wmic", args);
    if(p.waitForFinished()){
        p.readLine();
        return p.readLine().simplified();
    }else{
        qWarning() << "WMIC.result.error:" << p.readAll();
        return "";
    }
}

QStringList WMIC::list(const QString &cmd)
{
    static QRegularExpression re("\\s+");
    QStringList args = cmd.split(re);
    QProcess p;
    p.start("wmic", args);
    if(p.waitForFinished()){
        p.readLine();
        QStringList lines;
        while(p.canReadLine()){
            QString line = p.readLine().trimmed();
            if(!line.isEmpty()){
                lines.append(line);
            }
        }
        return lines;
    }else{
        qWarning() << "WMIC.cmd.error:" << p.readAll();
        return QStringList();
    }
}


QString WMIC::CSPRODUCT::UUID()
{
    static QString _value;
    if(_value.isEmpty()){
        _value = WMIC::result("CSPRODUCT get UUID");
    }
    return _value;
}

QString WMIC::OS::Caption()
{
    static QString _value;
    if(_value.isEmpty()){
        _value = WMIC::result("OS get Caption");
    }
    return _value;
}

QString WMIC::OS::Version()
{
    static QString _value;
    if(_value.isEmpty()){
        _value = WMIC::result("OS get Version");
    }
    return _value;
}

QString WMIC::GPU::Name()
{
    static QString _value;
    if(_value.isEmpty()){
        _value = WMIC::result("path win32_videocontroller get Name");
    }
    return _value;
}

QString WMIC::GPU::AdapterCompatibility()
{
    static QString _value;
    if(_value.isEmpty()){
        _value = WMIC::result("path win32_videocontroller get AdapterCompatibility");
    }
    return _value;
}

QString WMIC::GPU::DeviceID()
{
    static QString _value;
    if(_value.isEmpty()){
        _value = WMIC::result("path win32_videocontroller get DeviceID");
    }
    return _value;
}

QString WMIC::GPU::AdapterRAM()
{
    static QString _value;
    if(_value.isEmpty()){
        _value = WMIC::result("path win32_videocontroller get AdapterRAM");
    }
    return _value;
}

QString WMIC::GPU::DriverVersion()
{
    static QString _value;
    if(_value.isEmpty()){
        _value = WMIC::result("path win32_videocontroller get DriverVersion");
    }
    return _value;
}

QString WMIC::CPU::Name()
{
    static QString _value;
    if(_value.isEmpty()){
        _value = WMIC::result("CPU get Name");
    }
    return _value;
}

QString WMIC::CPU::ProcessorId()
{
    static QString _value;
    if(_value.isEmpty()){
        _value = WMIC::result("CPU get ProcessorId");
    }
    return _value;
}

int WMIC::CPU::NumberOfCores()
{
    static QString _value;
    if(_value.isEmpty()){
        _value = WMIC::result("CPU get NumberOfCores");
    }
    return _value.toInt();
}

int WMIC::CPU::NumberOfLogicalProcessors()
{
    static QString _value;
    if(_value.isEmpty()){
        _value = WMIC::result("CPU get NumberOfLogicalProcessors");
    }
    return _value.toInt();
}

QString WMIC::CPU::Caption()
{
    static QString _value;
    if(_value.isEmpty()){
        _value = WMIC::result("CPU get Caption");
    }
    return _value;
}

int WMIC::CPU::AddressWidth()
{
    static QString _value;
    if(_value.isEmpty()){
        _value = WMIC::result("CPU get AddressWidth");
    }
    return _value.toInt();
}

QString WMIC::NIC::Name()
{
    static QString _value;
    if(_value.isEmpty()){
        _value = WMIC::result(R"(nic where "PNPDeviceID like 'PCI%'" get Name)");
    }
    return _value;
}

QString WMIC::NIC::MACAddress()
{
    static QString _value;
    if(_value.isEmpty()){
        _value = WMIC::result(R"(nic where "PNPDeviceID like 'PCI%'" get MACAddress)");
    }
    return _value;
}

QList<int> WMIC::DISKDRIVE::indexs()
{
    static QList<int> _list;
    if(_list.isEmpty()){
        QStringList index_list = WMIC::list(R"(DISKDRIVE where "MediaType='Fixed hard disk media'" get Index")");
        foreach (QString index, index_list) {
            _list.append(index.toInt());
        }
    }
    return _list;
}


QString WMIC::DISKDRIVE::Caption(int index)
{
    static QString _value;
    if(_value.isEmpty()){
        _value = WMIC::result(QString(R"(DISKDRIVE where "Index=%1" get Caption)").arg(index));
    }
    return _value;
}

qint64 WMIC::DISKDRIVE::Size(int index)
{
    static QString _value;
    if(_value.isEmpty()){
        _value = WMIC::result(QString(R"(DISKDRIVE where "Index=%1" get Size)").arg(index));
    }
    return _value.toLongLong();
}

QString WMIC::DISKDRIVE::SerialNumber(int index)
{
    static QString _value;
    if(_value.isEmpty()){
        _value = WMIC::result(QString(R"(DISKDRIVE where "Index=%1" get SerialNumber)").arg(index));
    }
    return _value;
}

qint64 WMIC::COMPUTERSYSTEM::TotalPhysicalMemory()
{
    static QString _value;
    if(_value.isEmpty()){
        _value = WMIC::result("COMPUTERSYSTEM get TotalPhysicalMemory");
    }
    return _value.toLongLong();
}

QString WMIC::fingerprint()
{
    static QString _value;
    if(_value.isEmpty()){
        QString uuid = WMIC::CSPRODUCT::UUID();
        QCryptographicHash hash(QCryptographicHash::Md5);
        hash.addData(uuid.toUtf8());
        _value = hash.result().toHex();
    }
    return _value;
}

在默认dialog测试windows内置的设备指纹即可

#include "dialog.h"
#include "ui_dialog.h"
#include "wmic.h"
#include <QDebug>

Dialog::Dialog(QWidget *parent)
    : QDialog(parent)
    , ui(new Ui::Dialog)
{
    ui->setupUi(this);
    qDebug()<<" WMIC::fingerprint():"<< WMIC::fingerprint();
}

Dialog::~Dialog()
{
    delete ui;
}

打印输出,测试成功

!Pasted image 20240706173047.png

运行测试,创建和读取正常

!Pasted image 20240706182158.png