实际使用时,会有客户的硬盘更换需要重置激活码,而主板通常而言更换的几率会比较小。先获取主板id,主板id无效时,再去获取硬盘id,应该是比较好的方式了。
// 使用需要包含头文件 QString 和 QProcess// #include <QString>// #include <QProcess>QString getDeviceCode(){#ifdef WIN32//获取cpu名称:wmic cpu get Name//获取cpu核心数:wmic cpu get NumberOfCores//获取cpu线程数:wmic cpu get NumberOfLogicalProcessors//查询cpu序列号:wmic cpu get processorid//查询主板序列号:wmic baseboard get serialnumber//查询BIOS序列号:wmic bios get serialnumber//查看硬盘:wmic diskdrive get serialnumber// 先获取主板序列号, 主板序列号获取失败再去获取硬盘序列号.// 通常主板不会更换,而硬盘可能会更换QString deviceCode;// 获取主板序列号QString cmd = "wmic baseboard get serialnumber";QProcess p;p.start(cmd);p.waitForFinished();QString cmdResult = QString::fromLocal8Bit(p.readAllStandardOutput());deviceCode = cmdResult.remove("serialnumber", Qt::CaseInsensitive).simplified();// 主板序列号获取失败,则获取硬盘序列号if (deviceCode.isEmpty() || deviceCode == "FFFFFFFF-FFFF-FFFF-FFFF-FFFFFFFFFFFF" || deviceCode == "Default string"){QString cmd = "wmic diskdrive get serialnumber";QProcess p;p.start(cmd);p.waitForFinished();QString cmdResult = QString::fromLocal8Bit(p.readAllStandardOutput());deviceCode = cmdResult.remove("serialnumber", Qt::CaseInsensitive).simplified();}if (deviceCode.isEmpty()){deviceCode = "diskdrive";}return deviceCode;#else// macQString deviceCode = "";QProcess proc;QStringList args;// 设备序列号args << "-c" << "ioreg -rd1 -c IOPlatformExpertDevice | awk '/IOPlatformSerialNumber/ { print $3; }'";proc.start( "/bin/bash", args );proc.waitForFinished();deviceCode = proc.readAll().mid(1,12);return deviceCode;#endif}
可以参考的文章:设备唯一标识方法(Unique Identifier):如何在Windows系统上获取设备的唯一标识 zz - 马语者 - 博客园 (cnblogs.com)
问题处理
有多块硬盘的时候,获取到的设备码会多一个引号,如: MFV414771L"。
我目前所在的公司php后台处理的这个设备码,不知道哪个环节有问题,会导致激活失败。
