Qt 程序中获取 CPUID UUID 等系统信息的方法(win 平台,wmic)

这篇博客介绍了如何在Qt程序中利用wmic命令获取Windows平台上的CPUID、UUID等系统信息,虽然这种方法效率较低且不适用于跨平台,但作为临时解决方案,提供了一种实现序列号注册功能的思路。代码中展示了如何封装成一个类,包含获取CPU名称、CPU ID、系统UUID、基板序列号和BIOS序列号以及硬盘序列号的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Qt 程序中获取 CPUID UUID 等系统信息的方法(win 平台,wmic)

最近的程序中要加入序列号注册的功能。这就需要获得电脑的一些基本信息,比如 UUID 、或者 CPUID 一类的固定的信息。

五一假期简单研究了一下,有了个初步的方案。利用windows 自带的 wmic 命令来获取这些信息。 首先说明,这种方法有个很大的缺点,就是慢,很慢。随便获得什么信息都要零点几秒的时间。另外这个方法不能跨平台,只对 win 平台适用。所以这种方法只是临时应应急,以后还要再研究研究更好的方法。

下面是代码,我封装到一个类里了。

#ifndef WMIC_H
#define WMIC_H

#include <QString>

/**
 * @brief The WMIC class 通过 wnic 命令获取电脑的一些基本信息
 */
class WMIC
{
public:
    static QString cpuName();
    static QString cpuId();
    static QString csUUID();
    static QString baseboardSN();
    static QString biosSN();
    static QString diskSN(int n);// n 是硬盘序号,从 0 开始

private:
    WMIC() = delete;
    static QString result(QString cmd);
};

#endif // WMIC_H
#include "wmic.h"
#include <QProcess>
#include <QDebug>

QString WMIC::result(QString cmd)
{
    QProcess wmic;
    wmic.start(cmd);
    wmic.waitForFinished();
    wmic.readLine();
    QString ret = wmic.readLine().simplified();
    return ret;
}

QString WMIC::cpuName()
{
    QString cmd = "wmic CPU get name";
    return result(cmd);
}

QString WMIC::cpuId()
{
    QString cmd = "wmic CPU get processorid";
    return result(cmd);
}

QString WMIC::csUUID()
{
    QString cmd = "wmic CSPRODUCT get uuid";
    return result(cmd);
}

QString WMIC::baseboardSN()
{
    QString cmd = "wmic BASEBOARD get serialnumber";
    return result(cmd);
}

QString WMIC::biosSN()
{
    QString cmd = "wmic BIOS get serialnumber";
    return result(cmd);
}

QString WMIC::diskSN(int n)
{
    QString cmd = QString("wmic DISKDRIVE where index=%1 get serialnumber").arg(n);
    return result(cmd);
}

代码很简单,没什么值得多说的。有一个 C++11 的小技巧这里简单说两句。首先看下面的代码片段:

private:
    WMIC() = delete;

这个代码可以确保 WMIC 不能构造实例,因为构造函数 WMIC() 是 private 的,“= delete” 告诉编译器不要替我们生成 默认的构造函数。

<think>我们被要求生成获取本地计算机机器码的方法。根据提供的引用,有多种方法可以实现,包括使用Python、JavaScript、QT、C++等。由于用户没有指定编程语言,我们将提供几种常见语言的实现方法。参考引用内容: [^1]:使用Python的wmi库获取CPU、硬盘、显卡、MAC地址等信息,然后组合生成机器码。 [^2]:使用JavaScript结合ActiveX对象获取MAC地址(但这种方法需要降低IE安全级别,且在现代浏览器中可能不受支持)。[^3]:使用QT通过执行WMIC命令获取硬件信息(如CPU序列号、主板序列号等)。[^4]:提到C++中获取机器码,但引用内容实际描述的是在线签名流程,与问题无关,因此忽略。 [^5]:提到使用Netbios命令获取网络信息(如MAC地址)。考虑到跨平台和现代编程的适用性,我们将重点介绍Python和QT(C++)的方法,并简要提及其他方法。注意:机器码通常由多个硬件信息组合而成(如CPU序列号、主板序列号、硬盘序列号、MAC地址等),然后通过哈希算法(如MD5、SHA1)生成一个唯一的字符串。步骤:1.获取硬件信息(如CPU序列号、硬盘序列号、MAC地址等)。2.将这些信息组合成一个字符串。3.对组合字符串进行哈希(如MD5)得到机器码。下面分别介绍不同语言的方法:一、Python方法Windows平台)使用wmi库(需要安装,pipinstall wmi)获取硬件信息,然后生成机器码。代码示例:```pythonimport wmiimport hashlibdefget_machine_code():c =wmi.WMI()#获取CPU序列号cpu_info= ""forcpu inc.Win32_Processor():cpu_info= cpu.ProcessorId.strip()break#取第一个CPU#获取硬盘序列号(取第一个硬盘)disk_info= ""fordisk inc.Win32_DiskDrive():disk_info =disk.SerialNumber.strip()break#获取主板序列号board_info =""for boardin c.Win32_BaseBoard():board_info= board.SerialNumber.strip()break#获取MAC地址(取第一个物理网卡)mac_info= ""foradapter inc.Win32_NetworkAdapter(PhysicalAdapter=True):ifadapter.MACAddress:mac_info= adapter.MACAddress.strip().replace(':','')break#组合信息combined_info= cpu_info +disk_info+ board_info +mac_info#生成哈希值(这里使用MD5)md5 =hashlib.md5()md5.update(combined_info.encode('utf-8'))machine_code= md5.hexdigest()returnmachine_codeif__name__ =='__main__':code =get_machine_code()print("机器码:", code) ```注意:上述代码获取了多个硬件信息,确保唯一性。但不同机器可能某些信息为空,需要适当处理。二、QT方法(C++,Windows平台)使用QProcess执行WMIC命令获取硬件信息,然后组合生成机器码。代码示例(在QT项目中):```cpp#include<QCryptographicHash>#include <QProcess> #include<QDebug>QStringgetWMIC(constQString &cmd){QProcessp;p.start(cmd);p.waitForFinished();QStringresult =QString::fromLocal8Bit(p.readAllStandardOutput());QStringList list= cmd.split("");result =result.remove(list.last(), Qt::CaseInsensitive);result =result.replace("\r", "");result=result.replace("\n", "");result= result.simplified();returnresult;} QString getMachineCode() {QStringcpuId= getWMIC("wmic cpuget processorid");QStringdiskSerial= getWMIC("wmic diskdrive getserialnumber");QStringbaseboardSerial =getWMIC("wmicbaseboardget serialnumber");//获取MAC地址(取第一个物理网卡,这里简化处理,实际可能需要遍历)QString macAddress =getWMIC("wmicnic where(PhysicalAdapter=True)get MACAddress");//因为可能有多个网卡,我们取第一个非空的QStringList macList =macAddress.split("", QString::SkipEmptyParts);macAddress= macList.count() >0? macList[0]: "";QString combined=cpuId+ diskSerial +baseboardSerial +macAddress;QByteArray combinedBytes =combined.toUtf8();QByteArrayhash =QCryptographicHash::hash(combinedBytes,QCryptographicHash::Md5);returnhash.toHex();} //调用qDebug() <<"MachineCode:"<< getMachineCode(); ```三、JavaScript方法(仅适用于IE且安全设置较低的情况,不推荐)由于安全原因,现代浏览器不允许JavaScript获取硬件信息。引用[2]中的方法需要ActiveX支持,仅适用于旧版IE,且用户必须降低安全设置。因此,不建议使用。四、其他方法1.使用命令行(WMIC获取信息,然后由程序读取(适用于批处理或任何语言调用命令行)。2.使用系统API(如Windows的WMI API、Linux的lshw等)获取硬件信息。注意事项: -获取机器码的目的是唯一标识一台机器,因此应选择不会随软件或系统配置改变而变化的硬件信息(如硬盘序列号、主板序列号等)。-不同操作系统获取方式不同,上述代码仅适用于Windows。 -对于Linux/Mac,可以使用其他命令(如dmidecode、system_profiler等)获取硬件信息。如果用户需要跨平台方案,可以考虑使用跨平台库,如node.js的systeminformation库(Node.js)或Python的platform库(但platform库提供的信息有限,可能不足以生成唯一机器码)。根据用户需求,我们提供了Python和QT(C++)的实现方法。用户可以根据自己的开发环境选择合适的方法。相关问题:1.如何确保生成的机器码唯一且稳定?2.在Linux系统下如何获取机器码?3.获取机器码时遇到权限问题怎么办?</think>### 获取本地计算机机器码的方法 机器码通常通过组合计算机硬件的唯一标识信息(如CPU序列号、硬盘序列号、MAC地址等)生成,再经哈希算法处理得到唯一字符串。以下是不同技术栈的实现方案: --- #### **Python实现方案**(Windows平台) ```python import wmi import hashlib def get_machine_code(): c = wmi.WMI() # 获取CPU序列号 cpu_id = c.Win32_Processor()[0].ProcessorId.strip() # 获取硬盘序列号(第一块硬盘) disk_id = c.Win32_DiskDrive()[0].SerialNumber.strip() # 获取物理网卡MAC地址 mac = [adapter.MACAddress for adapter in c.Win32_NetworkAdapter() if adapter.PhysicalAdapter and adapter.MACAddress][0] # 组合硬件信息并哈希 combined = f"{cpu_id}{disk_id}{mac}" return hashlib.sha256(combined.encode()).hexdigest() print("机器码:", get_machine_code()) ``` **原理**: 通过WMI接口获取硬件唯一标识,使用SHA-256哈希生成固定长度机器码[^1]。 --- #### **C++/QT实现方案**(跨平台) ```cpp #include <QCryptographicHash> #include <QProcess> QString getMachineCode() { // 获取硬件信息(Windows示例) auto getWmic = [](const QString& cmd) { QProcess p; p.start("wmic", cmd.split(" ")); p.waitForFinished(); return p.readAllStandardOutput().simplified(); }; QString cpuId = getWmic("cpu get processorid"); QString diskId = getWmic("diskdrive get serialnumber"); QString mac = getWmic("nic where PhysicalAdapter=True get MACAddress").split('\n')[1]; // 生成哈希 QString combined = cpuId + diskId + mac; return QCryptographicHash::hash(combined.toUtf8(), QCryptographicHash::Sha256).toHex(); } ``` **原理**: 通过`wmic`命令获取硬件信息,QT内置哈希函数处理数据[^3]。 --- #### **注意事项** 1. **权限要求**: - Windows需管理员权限执行`wmic`命令 - Linux需`sudo`权限读取`/sys/class/dmi/id`等系统文件 2. **硬件变更影响**: - 更换硬盘/网卡会导致机器码变化 - 虚拟机环境可能无法获取真实硬件ID 3. **替代方案**: - Linux可使用`dmidecode -t processor`获取CPU ID - macOS可通过`ioreg -rd1 -c IOPlatformExpertDevice`获取平台UUID --- ### 相关问题 1. **如何解决虚拟机环境无法获取真实硬件ID的问题?** 2. **跨平台生成机器码的最佳实践有哪些?** 3. **机器码生成如何避免哈希冲突?** 4. **哪些硬件标识最适合作为机器码生成依据?** 5. **如何在不依赖WMI的情况下获取Windows硬件信息?** [^1]: Python通过WMI获取硬件信息生成机器码 [^3]: QT通过系统命令获取硬件标识并哈希处理 [^5]: 网络层命令(如Netbios)可作为备选方案
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值