实际使用时,会有客户的硬盘更换需要重置激活码,而主板通常而言更换的几率会比较小。先获取主板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
// mac
QString 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后台处理的这个设备码,不知道哪个环节有问题,会导致激活失败。