加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

列出C中WMI类的所有属性

发布时间:2020-12-16 09:47:42 所属栏目:百科 来源:网络整理
导读:Deos有没有人知道在C中找到给定WMI类中每个可用属性的完整列表?我在SO上发现了一些类似的问题,但它们都使用Power shell,VB或C#. 解决方法 您可以使用 GetObject 方法获取WMI类的实例,并使用 GetNames 方法检索属性名称. 试试这个样本. #include "stdafx.h"#
Deos有没有人知道在C中找到给定WMI类中每个可用属性的完整列表?我在SO上发现了一些类似的问题,但它们都使用Power shell,VB或C#.

解决方法

您可以使用 GetObject方法获取WMI类的实例,并使用 GetNames方法检索属性名称.

试试这个样本.

#include "stdafx.h"
#define _WIN32_DCOM
#include <iostream>
using namespace std;
#include <comdef.h>
#include <Wbemidl.h>
# pragma comment(lib,"wbemuuid.lib")

#pragma argsused
int main(int argc,char* argv[])
{
    BSTR strNetworkResource;
    //To use a WMI remote connection set localconn to false and configure the values of the pszName,pszPwd and the name of the remote machine in strNetworkResource
    bool localconn = true;  
    strNetworkResource = localconn ?  L"\.rootCIMV2" : L"\remote--machinerootCIMV2";

    // Initialize COM. ------------------------------------------

    HRESULT hres;
    hres =  CoInitializeEx(0,COINIT_MULTITHREADED);
    if (FAILED(hres))
    {
        cout << "Failed to initialize COM library. Error code = 0x" << hex << hres << endl;
        cout << _com_error(hres).ErrorMessage() << endl;
        cout << "press enter to exit" << endl;
        cin.get();      
        return 1;                  // Program has failed.
    }

    // Set general COM security levels --------------------------


        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))
    {
        cout << "Failed to initialize security. Error code = 0x" << hex << hres << endl;
        cout << _com_error(hres).ErrorMessage() << endl;
        CoUninitialize();
        cout << "press enter to exit" << endl;
        cin.get();      
        return 1;                    // Program has failed.
    }

    // Obtain the initial locator to WMI -------------------------

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

    if (FAILED(hres))
    {
        cout << "Failed to create IWbemLocator object." << " Err code = 0x" << hex << hres << endl;
        cout << _com_error(hres).ErrorMessage() << endl;
        CoUninitialize();       
        cout << "press enter to exit" << endl;
        cin.get();      
        return 1;                 // Program has failed.
    }

    // Connect to WMI through the IWbemLocator::ConnectServer method

    IWbemServices *pSvc = NULL;


        hres = pLoc->ConnectServer(
             _bstr_t(strNetworkResource),// 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 (e.g. Kerberos)
             0,// Context object
             &pSvc                    // pointer to IWbemServices proxy
             );

    if (FAILED(hres))
    {
        cout << "Could not connect. Error code = 0x" << hex << hres << endl;    
        cout << _com_error(hres).ErrorMessage() << endl;
        pLoc->Release();
        CoUninitialize();
        cout << "press enter to exit" << endl;
        cin.get();          
        return 1;                // Program has failed.
    }

    cout << "Connected to rootCIMV2 WMI namespace" << endl;

    // Set security levels on the proxy -------------------------

        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))
    {
        cout << "Could not set proxy blanket. Error code = 0x" << hex << hres << endl;
        cout << _com_error(hres).ErrorMessage() << endl;
        pSvc->Release();
        pLoc->Release();
        CoUninitialize();
        cout << "press enter to exit" << endl;
        cin.get();      
        return 1;               // Program has failed.
    }

    // Use the IWbemServices pointer to make requests of WMI ----
    IWbemClassObject* pClass = NULL;
    hres = pSvc->GetObject(L"Win32_Process",NULL,&pClass,NULL);

    if (FAILED(hres))
    {
        cout << "GetObject failed" << " Error code = 0x"    << hex << hres << endl;
        cout << _com_error(hres).ErrorMessage() << endl;
        pSvc->Release();
        pLoc->Release();
        CoUninitialize();
        cout << "press enter to exit" << endl;
        cin.get();      
        return 1;               // Program has failed.
    }

    SAFEARRAY *psaNames = NULL;
    hres = pClass->GetNames(
        NULL,WBEM_FLAG_ALWAYS | WBEM_FLAG_NONSYSTEM_ONLY,&psaNames);


    if (FAILED(hres))
    {
        cout << "GetNames failed" << " Error code = 0x" << hex << hres << endl;
        cout << _com_error(hres).ErrorMessage() << endl;
        pSvc->Release();
        pLoc->Release();
        CoUninitialize();
        cout << "press enter to exit" << endl;
        cin.get();      
        return 1;               // Program has failed.
    }


   // Get the number of properties.
   long lLower,lUpper; 
   BSTR PropName = NULL;
   SafeArrayGetLBound(psaNames,1,&lLower);
   SafeArrayGetUBound(psaNames,&lUpper);

        for (long i = lLower; i <= lUpper; i++) 
        {
            // Get this property.
            hres = SafeArrayGetElement(
                psaNames,&i,&PropName);

                wcout << PropName<< endl;
                SysFreeString(PropName);
        }

    SafeArrayDestroy(psaNames);
    ULONG uReturn = 0;


    pSvc->Release();
    pLoc->Release();

    CoUninitialize();
    cout << "press enter to exit" << endl;
    cin.get();
    return 0;   // Program successfully completed.
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读