C++ 无法使用WMI类c+获取唯一的CPU ID+;
在应用程序中,它需要检索特定于系统的唯一ID。因此,我试图检索CPU的唯一ID。我正在使用WMI类属性来检索它。 但在尝试检索win32_processor类的“UniqueId”属性时,它会在预期输出的变量中返回VT_NULL。但同时它也为其他属性提供有效的输出,如deciveId、processorId等,但这些属性不是唯一的,不能满足我的目的 有人知道为什么会这样吗?请帮帮我 下面是我使用的代码。。。请看一看,并说明这方面是否有问题。。。。 我可以做什么修改使它工作C++ 无法使用WMI类c+获取唯一的CPU ID+;,c++,visual-c++,mfc,wmi,wmi-query,C++,Visual C++,Mfc,Wmi,Wmi Query,在应用程序中,它需要检索特定于系统的唯一ID。因此,我试图检索CPU的唯一ID。我正在使用WMI类属性来检索它。 但在尝试检索win32_processor类的“UniqueId”属性时,它会在预期输出的变量中返回VT_NULL。但同时它也为其他属性提供有效的输出,如deciveId、processorId等,但这些属性不是唯一的,不能满足我的目的 有人知道为什么会这样吗?请帮帮我 下面是我使用的代码。。。请看一看,并说明这方面是否有问题。。。。 我可以做什么修改使它工作 if(CoIni
if(CoInitializeSecurity( NULL,
-1,
NULL,
NULL,
RPC_C_AUTHN_LEVEL_PKT,
RPC_C_IMP_LEVEL_IMPERSONATE,
NULL,
EOAC_NONE,
0
) != S_OK)
return;
IWbemLocator * pIWbemLocator = NULL;
IWbemServices * pWbemServices = NULL;
IEnumWbemClassObject * pEnumObject = NULL;
BSTR bstrNamespace = (L"root\\cimv2");
if(CoCreateInstance (
CLSID_WbemAdministrativeLocator,
NULL ,
CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER ,
IID_IUnknown ,
( void ** ) & pIWbemLocator
) != S_OK)
return;
if(pIWbemLocator->ConnectServer(
bstrNamespace, // Namespace
NULL, // Userid
NULL, // PW
NULL, // Locale
0, // flags
NULL, // Authority
NULL, // Context
&pWbemServices
) != S_OK)
return;
HRESULT hRes;
BSTR strQuery = (L"Select * from Win32_Processor");
BSTR strQL = (L"WQL");
hRes = pWbemServices->ExecQuery(strQL, strQuery,WBEM_FLAG_RETURN_IMMEDIATELY,NULL,&pEnumObject);
if(hRes != S_OK)
{
MessageBox("Could not execute Query");
return;
}
ULONG uCount = 1, uReturned;
IWbemClassObject * pClassObject = NULL;
hRes = pEnumObject->Reset();
if(hRes != S_OK)
{
MessageBox("Could not Enumerate");
return;
}
hRes = pEnumObject->Next(WBEM_INFINITE,uCount, &pClassObject, &uReturned);
if(hRes != S_OK)
{
MessageBox("Could not Enumerate");
return;
}
VARIANT v;
BSTR strClassProp = SysAllocString(L"UniqueId");
hRes = pClassObject->Get(strClassProp, 0, &v, 0, 0);// here the v is VT_NULL but works if the vlaue of strClassProp is processerId, deviceId
if(hRes != S_OK)
{
MessageBox("Could not Get Value");
return;
}
SysFreeString(strClassProp);
_bstr_t bstrPath = &v; //it causes exception if the v is VT_NULL in other cases its working
char* strPath = new char [1024];
_stprintf(strPath, ("%s"),(char*)bstrPath);
if (SUCCEEDED(hRes))
MessageBox(strPath);
期待专家的建议和帮助。。。。
提前谢谢 计算机可能被配置为不显示处理器id。有些人认为这是隐私问题,不希望被唯一标识。你的意思是它可以受到系统设置的限制?如果系统限制的话,我们无法检索到?类似的,是的。如果是您自己的计算机,您可以检查BIOS设置。唯一id功能在现代Intel x86 CPU中不存在。感谢u Bo Persson和Joao Ausustano的宝贵评论。。。是否有其他方法可以找到唯一的Id来区分pc?(除了更改n/w卡时可能更改的MAC地址)计算机可能被配置为不显示处理器id。有些人认为这是隐私问题,不希望被唯一标识。你的意思是它可以受到系统设置的限制?如果系统限制的话,我们无法检索到?类似的,是的。如果是您自己的计算机,您可以检查BIOS设置。唯一id功能在现代Intel x86 CPU中不存在。感谢u Bo Persson和Joao Ausustano的宝贵评论。。。是否有其他方法可以找到唯一的Id来区分pc?(MAC地址除外,因为它可能在更换n/w卡时发生变化)