无法从 Win32_OperatingSystem class 得到 "Description"

Cant get "Description" from Win32_OperatingSystem class

我尝试从 Win32_OperatingSystem 获取描述,这是我使用空字符串的主要问题。 我不明白为什么,当我尝试从 Win32_OperatingSystem 中获取其他类型为字符串的内容时,我可以得到它。 会不会有Description为空的情况?或者它只是我代码中的错误......? 代码:


STDMETHODIMP CSystemInfo::GetOS(CString* SystemInfo )
{
    HRESULT hres;
    CString tmp;
    hres = GetInfo( TEXT( "Win32_OperatingSystem" ), TEXT( "Description" ), &tmp );
    if( FAILED( hres ) )
    {
        return E_FAIL;
    }
    SystemInfo->SetString( tmp.GetString() );
    return S_OK;
}

STDMETHODIMP CSystemInfo::GetInfo( CString className, CString propertyName, CString* info )
{
    HRESULT hres;
    IWbemLocator* pLoc = NULL;
    IWbemServices* pSvc = NULL;
    IEnumWbemClassObject* pEnumerator = NULL;
    bool initialized = true;

    hres = CoInitialize( NULL );
    if( FAILED( hres ) )
    {
        return E_FAIL;
    }

    hres = CoInitializeSecurity(
        NULL,
        -1,                          // COM authentication
        NULL,                        // Authentication services
        NULL,                        // Reserved
        RPC_C_AUTHN_LEVEL_DEFAULT,   // Default authentication 
        RPC_C_IMP_LEVEL_IMPERSONATE, // Default Impersonation  
        NULL,                        // Authentication info
        EOAC_NONE,                   // Additional capabilities 
        NULL                         // Reserved
    );

    if( FAILED( hres ) && hres != RPC_E_TOO_LATE )
    {
    }

    hres = CoCreateInstance(
        CLSID_WbemLocator,
        0,
        CLSCTX_INPROC_SERVER,
        IID_IWbemLocator, ( LPVOID* )&pLoc );

    if( FAILED( hres ) )
    {
        return E_FAIL;
    }

    hres = pLoc->ConnectServer(
        bstr_t( L"ROOT\CIMV2" ),  // Object path of WMI namespace
        NULL,                    // User name. NULL = current user
        NULL,                    // User password. NULL = current
        0,                       // Locale. NULL indicates current
        NULL,                    // Security flags.
        0,                       // Authority (for example, Kerberos)
        0,                       // Context object 
        &pSvc                    // pointer to IWbemServices proxy
    );

    if( FAILED( hres ) )
    {
        return E_FAIL;
    }

    hres = CoSetProxyBlanket(
        pSvc,                        // Indicates the proxy to set
        RPC_C_AUTHN_WINNT,           // RPC_C_AUTHN_xxx
        RPC_C_AUTHZ_NONE,            // RPC_C_AUTHZ_xxx
        NULL,                        // Server principal name 
        RPC_C_AUTHN_LEVEL_CALL,      // RPC_C_AUTHN_LEVEL_xxx 
        RPC_C_IMP_LEVEL_IMPERSONATE, // RPC_C_IMP_LEVEL_xxx
        NULL,                        // client identity
        EOAC_NONE                    // proxy capabilities 
    );

    if( FAILED( hres ) )
    {
        return E_FAIL;
    }


    CString tmp = TEXT( "SELECT * FROM ");
    tmp += className.GetString();
    hres = pSvc->ExecQuery(
        bstr_t( "WQL" ),
        bstr_t(tmp.GetString()),
        WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,
        NULL,
        &pEnumerator );

    if( FAILED( hres ) )
    {
        return E_FAIL;
    }

    IWbemClassObject* pclsObj = NULL;
    ULONG uReturn = 0;

    while( pEnumerator )
    {
        HRESULT hr = pEnumerator->Next( WBEM_INFINITE, 1, &pclsObj, &uReturn );

        if( uReturn == 0 )
        {
            break;
        }

        VARIANT vtProp;

        hr = pclsObj->Get(propertyName.GetString(), 0, &vtProp, 0, 0 );
        if( FAILED( hres ) )
        {
            return E_FAIL;
        }
        info->SetString( vtProp.bstrVal );
        VariantClear( &vtProp );
        pclsObj->Release();
    }
    CoUninitialize();
    return S_OK;
}

这就是我调用函数的方式

HRESULT hr;
    CoInitialize( NULL );
    CSystemInfo* cSystem = NULL;
    CLSID clsid;
    hr = CLSIDFromProgID( L"Server.Inproc.1" , &clsid );
    if( FAILED( hr ) )
    {
        std::cout << "Cant get CLSID " << std::endl;
    }
    hr = CoCreateInstance( clsid,NULL, CLSCTX_INPROC_SERVER, IID_ISystemInfo, ( void** )&cSystem );
    if( FAILED( hr ) )
    {
        std::cout << "Cant Create Instance" << std::endl;
    }
    CString tmp;
    hr = cSystem->GetOS( &tmp );
    std::wcout << "OS Info: \t" ;
    std::wcout << tmp.GetString() << std::endl;

我也无法从 Win32_DesktopMonitor 获得描述。

您可以通过在 Windows PowerShell 上执行 gwmi Win32_OperatingSystem 命令来检查“Description” 属性 是否存在。我在我的电脑上找不到 Win32_OperatingSystem 的“描述”属性。