C++ 无法使用WMI类c+获取唯一的CPU ID+;

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

在应用程序中,它需要检索特定于系统的唯一ID。因此,我试图检索CPU的唯一ID。我正在使用WMI类属性来检索它。 但在尝试检索win32_processor类的“UniqueId”属性时,它会在预期输出的变量中返回VT_NULL。但同时它也为其他属性提供有效的输出,如deciveId、processorId等,但这些属性不是唯一的,不能满足我的目的

有人知道为什么会这样吗?请帮帮我

下面是我使用的代码。。。请看一看,并说明这方面是否有问题。。。。 我可以做什么修改使它工作

   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卡时发生变化)