实际使用时,会有客户的硬盘更换需要重置激活码,而主板通常而言更换的几率会比较小。先获取主板id,主板id无效时,再去获取硬盘id,应该是比较好的方式了。

  1. // 使用需要包含头文件 QString 和 QProcess
  2. // #include <QString>
  3. // #include <QProcess>
  4. QString getDeviceCode()
  5. {
  6. #ifdef WIN32
  7. //获取cpu名称:wmic cpu get Name
  8. //获取cpu核心数:wmic cpu get NumberOfCores
  9. //获取cpu线程数:wmic cpu get NumberOfLogicalProcessors
  10. //查询cpu序列号:wmic cpu get processorid
  11. //查询主板序列号:wmic baseboard get serialnumber
  12. //查询BIOS序列号:wmic bios get serialnumber
  13. //查看硬盘:wmic diskdrive get serialnumber
  14. // 先获取主板序列号, 主板序列号获取失败再去获取硬盘序列号.
  15. // 通常主板不会更换,而硬盘可能会更换
  16. QString deviceCode;
  17. // 获取主板序列号
  18. QString cmd = "wmic baseboard get serialnumber";
  19. QProcess p;
  20. p.start(cmd);
  21. p.waitForFinished();
  22. QString cmdResult = QString::fromLocal8Bit(p.readAllStandardOutput());
  23. deviceCode = cmdResult.remove("serialnumber", Qt::CaseInsensitive).simplified();
  24. // 主板序列号获取失败,则获取硬盘序列号
  25. if (deviceCode.isEmpty() || deviceCode == "FFFFFFFF-FFFF-FFFF-FFFF-FFFFFFFFFFFF" || deviceCode == "Default string")
  26. {
  27. QString cmd = "wmic diskdrive get serialnumber";
  28. QProcess p;
  29. p.start(cmd);
  30. p.waitForFinished();
  31. QString cmdResult = QString::fromLocal8Bit(p.readAllStandardOutput());
  32. deviceCode = cmdResult.remove("serialnumber", Qt::CaseInsensitive).simplified();
  33. }
  34. if (deviceCode.isEmpty())
  35. {
  36. deviceCode = "diskdrive";
  37. }
  38. return deviceCode;
  39. #else
  40. // mac
  41. QString deviceCode = "";
  42. QProcess proc;
  43. QStringList args;
  44. // 设备序列号
  45. args << "-c" << "ioreg -rd1 -c IOPlatformExpertDevice | awk '/IOPlatformSerialNumber/ { print $3; }'";
  46. proc.start( "/bin/bash", args );
  47. proc.waitForFinished();
  48. deviceCode = proc.readAll().mid(1,12);
  49. return deviceCode;
  50. #endif
  51. }

可以参考的文章:设备唯一标识方法(Unique Identifier):如何在Windows系统上获取设备的唯一标识 zz - 马语者 - 博客园 (cnblogs.com)

问题处理

有多块硬盘的时候,获取到的设备码会多一个引号,如: MFV414771L"
我目前所在的公司php后台处理的这个设备码,不知道哪个环节有问题,会导致激活失败。