Эх сурвалжийг харах

#IQRV #comment: 获取终端硬件信息剥离出关键路径

陈纪林80310970 7 сар өмнө
parent
commit
ff47c4a052

+ 13 - 222
Module/mod_accessauth/AccessAuthFSM.cpp

@@ -834,9 +834,18 @@ DWORD CAccessAuthFSM::GetEncTerminalInfoWithKey(CBlob& encInfo, BYTE* key)
 	pEntity->GetPinPadModel(pinpadModel, bPinPadOnline);
 	
 	GetIPandMac(ip, mac);
-	GetHardWareInfo(cpuId, mainBoardId, hardDiskId);
 	osVersion = GetOsVersion();
 
+	while (1)
+	{
+		if (pEntity->GetTermSysInfo() == -1)
+			return false;
+		else if (pEntity->GetTermSysInfo() == 1)
+			break;
+		else if (pEntity->GetTermSysInfo() == 0)
+			Sleep(1000);//oiltmp@20220917 之前的逻辑是不跳出去,现在要加么?暂时不加,连调用系统接口都有问题,让其他逻辑处理
+	}
+
 #ifdef RVC_OS_WIN
 	termInfo["osType"] = "Windows";
 #else
@@ -845,9 +854,9 @@ DWORD CAccessAuthFSM::GetEncTerminalInfoWithKey(CBlob& encInfo, BYTE* key)
 	termInfo["osVersion"] = osVersion.GetData();
 	termInfo["ip"] = ip.GetData();
 	termInfo["mac"] = mac.GetData();
-	termInfo["cpuId"] = cpuId.GetData();
-	termInfo["mainBoardId"] = mainBoardId.GetData();
-	termInfo["hardDiskId"] = hardDiskId.GetData();
+	termInfo["cpuId"] = pEntity->m_cpuId.GetData();
+	termInfo["mainBoardId"] = pEntity->m_mainBoardId.GetData();
+	termInfo["hardDiskId"] = pEntity->m_hardDiskId.GetData();
 	termInfo["pinpadModel"] = pinpadModel.GetData();
 
 	std::pair<bool, std::string> strResult;
@@ -1120,222 +1129,4 @@ void CAccessAuthFSM::GetIPandMac(CSimpleStringA& ip, CSimpleStringA& mac)
 	ip = csIP;
 
 	return;
-}
-
-void CAccessAuthFSM::GetHardWareInfo(CSimpleStringA & cpu, CSimpleStringA & mainBoard, CSimpleStringA & disk)
-{
-	auto pEntity = (CAccessAuthEntity*)m_pEntity;
-	std::map<std::string, std::string> errInfo;
-
-	//oilyang@20231008 to get system info from runcfg first
-	//no matter calculating from runcfg succeed or not,we also get system info from system api for update runcfg
-	bool bGetFromRunCfg = false;
-	CSimpleString csInfo, strErrMsg, strRet;
-	CSmartPointer<IConfigInfo> pConfigRun;
-	ErrorCodeEnum eErr = GetEntityBase()->GetFunction()->OpenConfig(Config_Run, pConfigRun);
-	if (eErr == Error_Succeed && pConfigRun->ReadConfigValue("system", "info", csInfo) == Error_Succeed && !csInfo.IsNullOrEmpty()) {
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("read device info from runcfg: [%s]", csInfo.GetData());
-		CAutoArray<CSimpleStringA> sysInfo = csInfo.Split('|');
-		if (sysInfo.GetCount() == 3)
-		{
-			cpu = sysInfo[0];
-			mainBoard = sysInfo[1];
-			disk = sysInfo[2];
-			bGetFromRunCfg = true;
-		}
-	}
-	else
-		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("GetTermSysInfo, OpenConfig Config_Run error=%d.", eErr);
-
-#ifdef RVC_OS_LINUX
-	char szTmp[1024] = {};
-	string strTmp;
-	int nTmpBufLen = 1024;
-	CSmartPointer<IEntityFunction> spFunction = GetEntityBase()->GetFunction();
-
-	CSimpleStringA runInfoPath;
-	auto rc = GetEntityBase()->GetFunction()->GetPath("runinfo", runInfoPath);
-	if (rc != Error_Succeed) {
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("GetPath runinfo error=%d.", rc);
-		return;
-	}
-	runInfoPath += SPLIT_SLASH_STR "runcfg";
-
-	//CPU
-	if (!get_cpu_id_by_system(strTmp, runInfoPath.GetData()))
-	{
-		if (!bGetFromRunCfg)
-		{
-			errInfo["errcode"] = "RTA5213";
-			errInfo["msg"] = "调用系统api获取CPU序号失败";
-			errInfo["getLastErr"] = GetLastError();
-			cpu = generateJsonStr(errInfo).second.c_str();
-		}
-
-		strErrMsg = CSimpleStringA::Format("查询CPU ID失败,请重启机器并重新初始化");
-		pEntity->SetAuthErrMsg((const char*)strErrMsg);
-
-		doWarnMsg(ERROR_ACCESSAUTH_GETCPUID,
-			GetOutPutStr("%s%s", "Processor", "False").c_str());
-		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode("RTA5213")
-			(GetOutPutStr("%s%s", "Processor", "False").c_str());
-		return;
-	}
-	cpu = strTmp.c_str();
-	strRet = strTmp.c_str();
-	strTmp.clear();
-	
-	//主板
-	if (!get_board_serial_by_system(strTmp, runInfoPath.GetData()))
-	{
-		if (!bGetFromRunCfg)
-		{
-			errInfo["errcode"] = "RTA5214";
-			errInfo["msg"] = "调用系统api获取主板ID号失败";
-			errInfo["getLastErr"] = GetLastError();
-			mainBoard = generateJsonStr(errInfo).second.c_str();
-		}
-		strErrMsg = CSimpleStringA::Format("查询主板序列号失败,  请重启机器并重新初始化");
-		pEntity->SetAuthErrMsg((const char*)strErrMsg);
-
-		doWarnMsg(ERROR_ACCESSAUTH_GETBASEBOARDSN,
-			GetOutPutStr("%s%s", "BaseBoard", "False").c_str());
-		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode("RTA5214")
-			(GetOutPutStr("%s%s", "BaseBoard", "False").c_str());
-		return;
-	}
-	mainBoard = strTmp.c_str();
-	strRet += "|";
-	strRet += strTmp.c_str();
-	
-	//硬盘
-	vector<string> diskArr;
-	int errCode = 0;
-	if (!get_disk_serial_by_system(diskArr, errCode, runInfoPath.GetData()))
-	{
-		if (!bGetFromRunCfg)
-		{
-			errInfo["errcode"] = "RTA5215";
-			errInfo["msg"] = "调用系统api获取硬盘ID号失败";
-			errInfo["getLastErr"] = GetLastError();
-			disk = generateJsonStr(errInfo).second.c_str();
-		}
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("get_disk_serial_by_system errCode:%d", errCode);
-		strErrMsg = CSimpleStringA::Format("查询磁盘序列号失败, 请重启机器并重新初始化");
-		pEntity->SetAuthErrMsg((const char*)strErrMsg);
-
-		doWarnMsg(ERROR_ACCESSAUTH_DISKDRIVESN,
-			GetOutPutStr("%s%s", "DiskDrive", "False").c_str());
-		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode("RTA5215")
-			(GetOutPutStr("%s%s", "DiskDrive", "False").c_str());
-		return;
-	}
-	strRet += "|";
-	strTmp = "";
-	vector<string>::iterator it = diskArr.begin();
-	while (it != diskArr.end()) {
-		strTmp += *it;
-		it++;
-	}
-	strRet += strTmp.c_str();
-	disk = strTmp.c_str();
-#else
-	ULONGLONG ullStart = GetTickCount64();
-	char szTmp[1024] = {};
-	int nTmpBufLen = 1024;
-	CSmartPointer<IEntityFunction> spFunction = GetEntityBase()->GetFunction();
-	if (!QueryWMIDevice(Processor, "ProcessorId", szTmp, &nTmpBufLen))
-	{
-		if (!bGetFromRunCfg)
-		{
-			errInfo["errcode"] = "RTA5213";
-			errInfo["msg"] = "调用系统api获取CPU序号失败";
-			errInfo["getLastErr"] = GetLastError();
-			cpu = generateJsonStr(errInfo).second.c_str();
-		}
-		strErrMsg = CSimpleStringA::Format("查询 cpu id 失败: %d, 请尝试重启应用", GetLastError());
-		pEntity->SetAuthErrMsg((const char*)strErrMsg);
-
-		LogWarn(Severity_Middle, Error_Unexpect, ERR_ACCESSAUTH_GET_TERMINAL_FINGERPRINT,
-			GetOutPutStr("%s%s%s%d", "QueryWMIDevice", "False", "Processor", GetLastError()).c_str());
-
-		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode("RTA5203")
-			(GetOutPutStr("%s%s%s%d", "QueryWMIDevice", "False", "Processor", GetLastError()).c_str());
-		return;
-	}
-	strRet = szTmp;
-	cpu = szTmp;
-
-	nTmpBufLen = 1024;
-	memset(szTmp, 0, sizeof(szTmp));
-	if (!QueryWMIDevice(BaseBoard, "SerialNumber", szTmp, &nTmpBufLen))
-	{
-		if (!bGetFromRunCfg)
-		{
-			errInfo["errcode"] = "RTA5214";
-			errInfo["msg"] = "调用系统api获取主板ID号失败";
-			errInfo["getLastErr"] = GetLastError();
-			mainBoard = generateJsonStr(errInfo).second.c_str();
-		}
-		strErrMsg = CSimpleStringA::Format("查询 baseboard sn 失败: %d, 请尝试重启应用", GetLastError());
-		pEntity->SetAuthErrMsg((const char*)strErrMsg);
-
-		LogWarn(Severity_Middle, Error_Unexpect, ERR_ACCESSAUTH_GET_TERMINAL_FINGERPRINT,
-			GetOutPutStr("%s%s%s%d", "QueryWMIDevice", "False", "BaseBoard", GetLastError()).c_str());
-		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode("RTA5203")
-			(GetOutPutStr("%s%s%s%d", "QueryWMIDevice", "False", "BaseBoard", GetLastError()).c_str());
-		
-		return;
-	}
-
-	strRet += "|";
-	strRet += szTmp;
-	mainBoard = szTmp;
-
-	nTmpBufLen = 1024;
-	memset(szTmp, 0, sizeof(szTmp));
-	if (!QueryWMIDevice(DiskDrive, "SerialNumber", szTmp, &nTmpBufLen))
-	{
-		if (!bGetFromRunCfg)
-		{
-			errInfo["errcode"] = "RTA5215";
-			errInfo["msg"] = "调用系统api获取硬盘ID号失败";
-			errInfo["getLastErr"] = GetLastError();
-			disk = generateJsonStr(errInfo).second.c_str();
-		}
-		strErrMsg = CSimpleStringA::Format("查询 harddisk sn 失败: %d, 请尝试重启应用", GetLastError());
-		pEntity->SetAuthErrMsg((const char*)strErrMsg);
-
-		LogWarn(Severity_Middle, Error_Unexpect, ERR_ACCESSAUTH_GET_TERMINAL_FINGERPRINT,
-			GetOutPutStr("%s%s%s%d", "QueryWMIDevice", "False", "DiskDrive", GetLastError()).c_str());
-		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)(GetOutPutStr("%s%s%s%d", "QueryWMIDevice", "False", "DiskDrive", GetLastError()).c_str());
-		
-		return;
-	}
-
-	strRet += "|";
-	strRet += szTmp;
-	disk = szTmp;
-
-	ULONGLONG ullEnd = GetTickCount64();
-	if (ullEnd - ullStart > 5000)
-	{
-		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode("RTA5201")
-			("获取系统信息耗时过长:%d秒", (ullEnd - ullStart) / 1000);
-		LogWarn(Severity_Middle, Error_Unexpect, AccessAuthorization_UserErrorCode_GetTermCostTooLong,
-			CSimpleStringA::Format("获取系统信息耗时过长:%d秒", (ullEnd - ullStart) / 1000));
-	}
-#endif // RVC_OS_LINUX
-
-	if (!bGetFromRunCfg || csInfo.Compare(strRet) != 0)
-	{
-		eErr = pConfigRun->WriteConfigValue("system", "info", strRet.GetData());
-		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("device info changed,before[%s],current[%s],write to runcfg:%d"
-			, csInfo.GetData(), strRet.GetData(), eErr);
-	}
-	else
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("device info: [%s]", strRet.GetData());
-
-	return;
-	
 }

+ 0 - 1
Module/mod_accessauth/AccessAuthFSM.h

@@ -206,7 +206,6 @@ public:
 
 	CSimpleStringA GetOsVersion();
 	void GetIPandMac(CSimpleStringA& ip, CSimpleStringA& mac);
-	void GetHardWareInfo(CSimpleStringA& cpu, CSimpleStringA& mainBoard, CSimpleStringA& disk);
 
 private:
 	void GetDiffSyncTimeFromCenterSettings();

+ 249 - 0
Module/mod_accessauth/mod_AccessAuth.cpp

@@ -118,6 +118,17 @@ struct InitializerInitMKTask : ITaskSp
 	}
 };
 
+struct GetTermSysInfoTask : ITaskSp
+{
+	CAccessAuthEntity* m_entity;
+	GetTermSysInfoTask(CAccessAuthEntity* entity) :m_entity(entity) {}
+
+	void Process()
+	{
+		m_entity->GetHardWareInfo();
+	}
+};
+
 typedef struct _REG_TZI_FORMAT
 {
 	LONG Bias;
@@ -190,6 +201,9 @@ void CAccessAuthEntity::OnStarted()
 			GetOutPutStr("%s%08X", "获取系统静态信息错误", rc).c_str(), strErrMsg.GetData());
 		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(GetOutPutStr("%s%08X", "获取系统静态信息错误", rc).c_str());
 	}
+
+	CSmartPointer<GetTermSysInfoTask> getTermSysInfoTask = new GetTermSysInfoTask(this);
+	GetFunction()->PostThreadPoolTask(getTermSysInfoTask.GetRawPointer());
 }
 
 void CAccessAuthEntity::OnPreStart(CAutoArray<CSimpleStringA> strArgs,CSmartPointer<ITransactionContext> pTransactionContext) 
@@ -1283,6 +1297,241 @@ pair<string, string> CAccessAuthEntity::EncryptedByPubKey(CSimpleStringA pubKey,
 	return make_pair(pBlock, strRam);
 }
 
+void CAccessAuthEntity::GetHardWareInfo()
+{
+	std::map<std::string, std::string> errInfo;
+
+	//oilyang@20231008 to get system info from runcfg first
+	//no matter calculating from runcfg succeed or not,we also get system info from system api for update runcfg
+	bool bGetFromRunCfg = false;
+	CSimpleString csInfo, strErrMsg, strRet;
+	CSmartPointer<IConfigInfo> pConfigRun;
+	ErrorCodeEnum eErr = GetFunction()->OpenConfig(Config_Run, pConfigRun);
+	if (eErr == Error_Succeed && pConfigRun->ReadConfigValue("system", "info", csInfo) == Error_Succeed && !csInfo.IsNullOrEmpty()) {
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("read device info from runcfg: [%s]", csInfo.GetData());
+		CAutoArray<CSimpleStringA> sysInfo = csInfo.Split('|');
+		if (sysInfo.GetCount() == 3)
+		{
+			m_cpuId = sysInfo[0];
+			m_mainBoardId = sysInfo[1];
+			m_hardDiskId = sysInfo[2];
+			bGetFromRunCfg = true;
+			m_iGetTermSysInfo = 1;
+		}
+		else
+		{
+			m_iGetTermSysInfo = -1;
+			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI("GetTerminalFingerPrint")("get sm3 hash as fingerprint fail");
+		}
+	}
+	else
+		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("GetTermSysInfo, OpenConfig Config_Run error=%d.", eErr);
+
+#ifdef RVC_OS_LINUX
+	char szTmp[1024] = {};
+	string strTmp;
+	int nTmpBufLen = 1024;
+
+	CSimpleStringA runInfoPath;
+	auto rc = GetFunction()->GetPath("runinfo", runInfoPath);
+	if (rc != Error_Succeed) {
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("GetPath runinfo error=%d.", rc);
+		return;
+	}
+	runInfoPath += SPLIT_SLASH_STR "runcfg";
+
+	//CPU
+	if (!get_cpu_id_by_system(strTmp, runInfoPath.GetData()))
+	{
+		if (!bGetFromRunCfg)
+		{
+			errInfo["errcode"] = "RTA5213";
+			errInfo["msg"] = "调用系统api获取CPU序号失败";
+			errInfo["getLastErr"] = GetLastError();
+			m_cpuId = generateJsonStr(errInfo).second.c_str();
+
+			m_iGetTermSysInfo = -1;
+		}
+
+		strErrMsg = CSimpleStringA::Format("查询CPU ID失败,请重启机器并重新初始化");
+		SetAuthErrMsg((const char*)strErrMsg);
+
+		LogWarn(Severity_Middle, Error_Unexpect, ERR_ACCESSAUTH_GET_TERMINAL_FINGERPRINT,
+			GetOutPutStr("%s%s%s%d", "QueryWMIDevice", "False", "Processor", GetLastError()).c_str());
+		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode("RTA5213")
+			(GetOutPutStr("%s%s", "Processor", "False").c_str());
+		return;
+	}
+	m_cpuId = strTmp.c_str();
+	strRet = strTmp.c_str();
+	strTmp.clear();
+
+	//主板
+	if (!get_board_serial_by_system(strTmp, runInfoPath.GetData()))
+	{
+		if (!bGetFromRunCfg)
+		{
+			errInfo["errcode"] = "RTA5214";
+			errInfo["msg"] = "调用系统api获取主板ID号失败";
+			errInfo["getLastErr"] = GetLastError();
+			m_mainBoardId = generateJsonStr(errInfo).second.c_str();
+
+			m_iGetTermSysInfo = -1;
+		}
+		strErrMsg = CSimpleStringA::Format("查询主板序列号失败,  请重启机器并重新初始化");
+		SetAuthErrMsg((const char*)strErrMsg);
+
+		LogWarn(Severity_Middle, Error_Unexpect, ERR_ACCESSAUTH_GET_TERMINAL_FINGERPRINT,
+			GetOutPutStr("%s%s%s%d", "QueryWMIDevice", "False", "BaseBoard", GetLastError()).c_str());
+		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode("RTA5214")
+			(GetOutPutStr("%s%s", "BaseBoard", "False").c_str());
+		return;
+	}
+	m_mainBoardId = strTmp.c_str();
+	strRet += "|";
+	strRet += strTmp.c_str();
+
+	//硬盘
+	vector<string> diskArr;
+	int errCode = 0;
+	if (!get_disk_serial_by_system(diskArr, errCode, runInfoPath.GetData()))
+	{
+		if (!bGetFromRunCfg)
+		{
+			errInfo["errcode"] = "RTA5215";
+			errInfo["msg"] = "调用系统api获取硬盘ID号失败";
+			errInfo["getLastErr"] = GetLastError();
+			m_hardDiskId = generateJsonStr(errInfo).second.c_str();
+
+			m_iGetTermSysInfo = -1;
+		}
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("get_disk_serial_by_system errCode:%d", errCode);
+		strErrMsg = CSimpleStringA::Format("查询磁盘序列号失败, 请重启机器并重新初始化");
+		SetAuthErrMsg((const char*)strErrMsg);
+
+		LogWarn(Severity_Middle, Error_Unexpect, ERR_ACCESSAUTH_GET_TERMINAL_FINGERPRINT,
+			GetOutPutStr("%s%s%s%d", "QueryWMIDevice", "False", "BaseBoard", GetLastError()).c_str());
+		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode("RTA5215")
+			(GetOutPutStr("%s%s", "DiskDrive", "False").c_str());
+		return;
+	}
+	strRet += "|";
+	strTmp = "";
+	vector<string>::iterator it = diskArr.begin();
+	while (it != diskArr.end()) {
+		strTmp += *it;
+		it++;
+	}
+	strRet += strTmp.c_str();
+	m_hardDiskId = strTmp.c_str();
+#else
+	ULONGLONG ullStart = GetTickCount64();
+	char szTmp[1024] = {};
+	int nTmpBufLen = 1024;
+	if (!QueryWMIDevice(Processor, "ProcessorId", szTmp, &nTmpBufLen))
+	{
+		if (!bGetFromRunCfg)
+		{
+			errInfo["errcode"] = "RTA5213";
+			errInfo["msg"] = "调用系统api获取CPU序号失败";
+			errInfo["getLastErr"] = GetLastError();
+			m_cpuId = generateJsonStr(errInfo).second.c_str();
+
+			m_iGetTermSysInfo = -1;
+		}
+		strErrMsg = CSimpleStringA::Format("查询 cpu id 失败: %d, 请尝试重启应用", GetLastError());
+		SetAuthErrMsg((const char*)strErrMsg);
+
+		LogWarn(Severity_Middle, Error_Unexpect, ERR_ACCESSAUTH_GET_TERMINAL_FINGERPRINT,
+			GetOutPutStr("%s%s%s%d", "QueryWMIDevice", "False", "Processor", GetLastError()).c_str());
+
+		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode("RTA5213")
+			(GetOutPutStr("%s%s%s%d", "QueryWMIDevice", "False", "Processor", GetLastError()).c_str());
+
+		return;
+	}
+	strRet = szTmp;
+	m_cpuId = szTmp;
+
+	nTmpBufLen = 1024;
+	memset(szTmp, 0, sizeof(szTmp));
+	if (!QueryWMIDevice(BaseBoard, "SerialNumber", szTmp, &nTmpBufLen))
+	{
+		if (!bGetFromRunCfg)
+		{
+			errInfo["errcode"] = "RTA5214";
+			errInfo["msg"] = "调用系统api获取主板ID号失败";
+			errInfo["getLastErr"] = GetLastError();
+			m_mainBoardId = generateJsonStr(errInfo).second.c_str();
+
+			m_iGetTermSysInfo = -1;
+		}
+		strErrMsg = CSimpleStringA::Format("查询 baseboard sn 失败: %d, 请尝试重启应用", GetLastError());
+		SetAuthErrMsg((const char*)strErrMsg);
+
+		LogWarn(Severity_Middle, Error_Unexpect, ERR_ACCESSAUTH_GET_TERMINAL_FINGERPRINT,
+			GetOutPutStr("%s%s%s%d", "QueryWMIDevice", "False", "BaseBoard", GetLastError()).c_str());
+		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode("RTA5214")
+			(GetOutPutStr("%s%s%s%d", "QueryWMIDevice", "False", "BaseBoard", GetLastError()).c_str());
+
+		return;
+	}
+
+	strRet += "|";
+	strRet += szTmp;
+	m_mainBoardId = szTmp;
+
+	nTmpBufLen = 1024;
+	memset(szTmp, 0, sizeof(szTmp));
+	if (!QueryWMIDevice(DiskDrive, "SerialNumber", szTmp, &nTmpBufLen))
+	{
+		if (!bGetFromRunCfg)
+		{
+			errInfo["errcode"] = "RTA5215";
+			errInfo["msg"] = "调用系统api获取硬盘ID号失败";
+			errInfo["getLastErr"] = GetLastError();
+			m_hardDiskId = generateJsonStr(errInfo).second.c_str();
+
+			m_iGetTermSysInfo = -1;
+		}
+		strErrMsg = CSimpleStringA::Format("查询 harddisk sn 失败: %d, 请尝试重启应用", GetLastError());
+		SetAuthErrMsg((const char*)strErrMsg);
+
+		LogWarn(Severity_Middle, Error_Unexpect, ERR_ACCESSAUTH_GET_TERMINAL_FINGERPRINT,
+			GetOutPutStr("%s%s%s%d", "QueryWMIDevice", "False", "DiskDrive", GetLastError()).c_str());
+		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode("RTA5215")
+			(GetOutPutStr("%s%s", "DiskDrive", "False").c_str());
+
+		return;
+	}
+
+	strRet += "|";
+	strRet += szTmp;
+	m_hardDiskId = szTmp;
+
+	ULONGLONG ullEnd = GetTickCount64();
+	if (ullEnd - ullStart > 5000)
+	{
+		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode("RTA5201")
+			("获取系统信息耗时过长:%d秒", (ullEnd - ullStart) / 1000);
+		LogWarn(Severity_Middle, Error_Unexpect, AccessAuthorization_UserErrorCode_GetTermCostTooLong,
+			CSimpleStringA::Format("获取系统信息耗时过长:%d秒", (ullEnd - ullStart) / 1000));
+	}
+#endif // RVC_OS_LINUX
+
+	if (!bGetFromRunCfg || csInfo.Compare(strRet) != 0)
+	{
+		eErr = pConfigRun->WriteConfigValue("system", "info", strRet.GetData());
+		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("device info changed,before[%s],current[%s],write to runcfg:%d"
+			, csInfo.GetData(), strRet.GetData(), eErr);
+	}
+	else
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("device info: [%s]", strRet.GetData());
+
+	return;
+
+}
+
 SP_BEGIN_ENTITY_MAP()
 	SP_ENTITY(CAccessAuthEntity)
 SP_END_ENTITY_MAP()

+ 4 - 0
Module/mod_accessauth/mod_AccessAuth.h

@@ -132,6 +132,10 @@ public:
 	pair<string, string> GenerateTmkToKMC();
 	pair<string, string> EncryptedByPubKey(CSimpleStringA pubKey, bool bNeed04Head = false);
 
+	void GetHardWareInfo();
+	CSimpleStringA m_cpuId, m_mainBoardId, m_hardDiskId;
+	int GetTermSysInfo() { return m_iGetTermSysInfo; }
+
 	CSimpleStringA m_publicKey;
 	CSimpleStringA m_privateKey;