Windows系统,获取cpu序列号、BIOS序列号、网卡mac地址
代码
#ifdef CXBD_WINDOWS
QString WinGetHwID()
{
QString str1 = getWMIHWInfo(0);
printLog("cpu序列号: " + str1);
QString md5Str1 = QCryptographicHash::hash(str1.toLatin1(), QCryptographicHash::Md5).toHex();
QString str2 = getWMIHWInfo(1);
printLog("BIOS序列号: " + str2);
QString md5Str2 = QCryptographicHash::hash(str2.toLatin1(), QCryptographicHash::Md5).toHex();
QString str3 = getWMIHWInfo(2);
printLog("网卡: " + str3);
QString md5Str3 = QCryptographicHash::hash(str3.toLatin1(), QCryptographicHash::Md5).toHex();
QString authStr = md5Str1 + md5Str2 + md5Str3;
return authStr;
}
QString getWMIHWInfo(int type)
{
QString hwInfo;
QStringList sqlCmd;
sqlCmd.clear();
sqlCmd << "SELECT ProcessorId FROM Win32_Processor WHERE (ProcessorId IS NOT NULL)";
sqlCmd << "SELECT SerialNumber FROM Win32_BIOS WHERE (SerialNumber IS NOT NULL)";
sqlCmd << "SELECT MACAddress FROM Win32_NetworkAdapter WHERE (MACAddress IS NOT NULL) AND (PNPDeviceID LIKE 'PCI%')";
QStringList columnName;
columnName.clear();
columnName << "ProcessorId";
columnName << "SerialNumber";
columnName << "MACAddress";
QAxObject *objIWbemLocator = new QAxObject("WbemScripting.SWbemLocator");
QAxObject *objWMIService = objIWbemLocator->querySubObject("ConnectServer(QString&,QString&)",QString("."), QString("root\\cimv2"));
QString query;
if (type < sqlCmd.size()) {
query = sqlCmd.at(type);
}
QAxObject *objInterList = objWMIService->querySubObject("ExecQuery(QString&))", query);
QAxObject *enum1 = objInterList->querySubObject("_NewEnum");
IEnumVARIANT *enumInterface = 0;
enum1->queryInterface(QUuid(IID_IEnumVARIANT), (void**)&enumInterface);
enumInterface->Reset();
for ( int i = 0; i < objInterList->dynamicCall("Count").toInt(); ++i )
{
VARIANT *theItem = (VARIANT*)malloc(sizeof(VARIANT));
if (enumInterface->Next(1, theItem, NULL) != S_FALSE)
{
QAxObject *item = new QAxObject((IUnknown *)theItem->punkVal);
if (item) {
if (type<columnName.size()) {
QByteArray datagram(columnName.at(type).toLatin1());
const char* tempConstChar = datagram.data();
hwInfo+=item->dynamicCall(tempConstChar).toString().trimmed();
}
}
}
}
return hwInfo;
}
#endif
Linux系统,获取硬盘序列号、网卡MAC地址
代码
#ifdef CXBD_GUOCHAN
QString LinuxGetHwID()
{
QString cmd1 = "lsblk -d -no serial /dev/sda 2>/dev/null || lsblk -d -no serial /dev/nvme0n1 2>/dev/null || lsblk -d -no serial /dev/hda 2>/dev/null";
QString str1 = getWMIC1(cmd1);
printLog("硬盘序列号: " + str1);
QString md5Str1 = QCryptographicHash::hash(str1.toLatin1(), QCryptographicHash::Md5).toHex();
QString cmd2 = "ip addr";
QString str2 = getWMIC2(cmd2);
printLog("网卡MAC地址: " + str2);
QString md5Str2 = QCryptographicHash::hash(str2.toLatin1(), QCryptographicHash::Md5).toHex();
QString authStr = md5Str1 + md5Str2;
return authStr;
}
QString getWMIC(const QString &cmd)
{
QProcess p;
p.start(cmd);
p.waitForFinished();
return QString::fromLocal8Bit(p.readAllStandardOutput());
}
QString getWMIC1(const QString &cmd)
{
QString result = getWMIC(cmd);
QStringList list = cmd.split(" ");
result = result.remove(list.last(), Qt::CaseInsensitive);
result = result.replace("\r", "");
result = result.replace("\n", "");
result = result.replace(" ", "");
result = result.simplified();
return result;
}
QString getWMIC2(const QString &cmd)
{
QString result = getWMIC(cmd);
QStringList list;
foreach (QString lineStr,result.split("\n"))
{
if (lineStr.contains("ether")) {
list.append(lineStr.left(lineStr.indexOf("ether") + 5 + 18).right(18).trimmed());
}
}
result = list.join("");
return result;
}
#endif
生成的授权码
代码
QString sysHid;
#ifdef CXBD_WINDOWS
sysHid = WinGetHwID();
#endif
#ifdef CXBD_GUOCHAN
sysHid = LinuxGetHwID();
#endif
sysHid += "xy@123456";
QString md5Str1 = QCryptographicHash::hash(sysHid.toLatin1(), QCryptographicHash::Md5).toHex();
printLog("生成的授权码: " + md5Str1);
读取授权文件中的授权码
代码
QString readHwID()
{
QString authFilePath = QCoreApplication::applicationDirPath() + QDir::separator() + "authFileInfo";
printLog("授权校验文件路径: " + authFilePath);
QString authStrRead;
QFile file(authFilePath);
if(file.exists() && file.open(QIODevice::ReadOnly | QIODevice::Text))
{
authStrRead.append(file.readAll());
file.close();
}
printLog("读取的授权码: " + authStrRead);
return authStrRead;
}
校验
代码
bool authorizationVerification()
{
QString sysHid;
#ifdef CXBD_WINDOWS
sysHid = WinGetHwID();
#endif
#ifdef CXBD_GUOCHAN
sysHid = LinuxGetHwID();
#endif
sysHid += "xy@123456";
QString md5Str1 = QCryptographicHash::hash(sysHid.toLatin1(), QCryptographicHash::Md5).toHex();
bool boo = false;
QString sysHidRead = readHwID();
sysHidRead = sysHidRead.replace("\n", "");
printLog("读取的授权码: " + sysHidRead);
if (sysHidRead == md5Str1) {
printLog("------>授权码一致,通过授权校验!");
boo = true;
}
return boo;
}