您的位置:首页 > 其它

WMI获取系统信息 得到product name

2014-02-12 17:47 288 查看
利用WMI获取系统信息,

一般步骤:

1. 通过调用CoInitialzeEx来初始化COM参数.

2. 通过调用CoInitializeSecurity来初始化COM过程安全.

3. 通过调用CoCreateInstance来实例化。

4. 通过调用IWbemLocator::ConnectServer来获取一个本机root\cimv2命名空间的IWbemServices的指针。(注意在字符串中要写“root\\cimv2”,两个\\)

5. 设置IWbemServices代理安全,WMI service可以通过调用CoSetProxyBlanket来模拟客户端。

6. 用IWbmeServices指针来查询WMI. 本例子通过调用IWbemServies::ExecQuery 来查询操作系统名称.

   SELEC * FROM Win32_OperatingSystem 

7. 获取和现实WQL查询的数据. 

WMI 可以访问的信息类型有:

   Win32_1394Controller

   Win32_BaseBoard

   Win32_Battery

   Win32_BIOS

   Win32_Bus

   Win32_CacheMemory

   Win32_CDROMDrive

   Win32_CurrentProbe

   Win32_DesktopMonitor

   Win32_DeviceMemoryAddress

   Win32_DiskDrive

   Win32_DisplayConfiguration

   Win32_DisplayControllerConfiguration

   Win32_DMAChannel

   Win32_Fan

   Win32_FloppyController

   Win32_FloppyDrive

   Win32_HeatPipe

   Win32_IDEController

   Win32_InfraredDevice

   Win32_IRQResource

   Win32_Keyboard

   Win32_MemoryArray

   Win32_MemoryDevice

   Win32_MotherboardDevice

   Win32_NetworkAdapter

   Win32_NetworkAdapterConfiguration

   Win32_OnBoardDevice

   Win32_ParallelPort

   Win32_PCMCIAController

   Win32_PhysicalMemory

   Win32_PhysicalMemoryArray

   Win32_PnPEntity

   Win32_PointingDevice

   Win32_PortableBattery

   Win32_PortConnector

   Win32_PortResource

   Win32_POTSModem

   Win32_PowerManagementEvent

   Win32_Printer

   Win32_PrinterConfiguration

   Win32_PrintJob

   Win32_Processor

   Win32_Refrigeration

   Win32_SerialPort

   Win32_SerialPortConfiguration

   Win32_SMBIOSMemory

   Win32_SoundDevice

   Win32_SystemEnclosure

   Win32_SystemMemoryResource

   Win32_SystemSlot

   Win32_TapeDrive

   Win32_TemperatureProbe

   Win32_UninterruptiblePowerSupply

   Win32_USBController

   Win32_VideoConfiguration

   Win32_VideoController

   Win32_VoltageProbe

下面是自己写的得到product name的示例程序,dos下的命令语句是wmic.exe baseboard get product

.h文件

点击(此处)折叠或打开

/*

通过WMI,得到product name

*/

#pragma once

#include "stdafx.h"

#include <comdef.h>

#include <Wbemidl.h>

#include <Wbemcli.h>

#include <conio.h>

class GetProductName

{

public:

    GetProductName();

    ~GetProductName();

    //正确返回0,错误返回非0

    //nName:out 得到的product name

    int Get(CString & nName);

private:

    HRESULT hres;

    IEnumWbemClassObject* pEnumerator;

    IWbemLocator *pLoc;

    IWbemServices *pSvc;

    // Step 1:

    // Initialize COM.

    BOOL Setp1(void);

    // Step 2: --------------------------------------------------

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

    // Note: If you are using Windows 2000, you need to specify -

    // the default authentication credentials for a user by using

    // a SOLE_AUTHENTICATION_LIST structure in the pAuthList ----

    // parameter of CoInitializeSecurity ------------------------

    BOOL Setp2(void);

    // Step 3: ---------------------------------------------------

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

    BOOL Setp3(void);

    // Step 4: -----------------------------------------------------

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

    // Connect to the root/cimv2 namespace with

    // the current user and obtain pointer pSvc

    // to make IWbemServices calls.

    BOOL Setp4(void);

    // Step 5: --------------------------------------------------

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

    BOOL Setp5(void);

    // Step 6: --------------------------------------------------

    // Use the IWbemServices pointer to make requests of WMI ----

    // get the product name of the baseboard

    BOOL Setp6(void);

    // Step 7: -------------------------------------------------

    // Get the data from the query in step 6 -------------------

    BOOL Setp7(CString & nName);

};

.cpp

点击(此处)折叠或打开

#include "stdafx.h"

#include "GetProductName.h"

#pragma comment(lib, "wbemuuid.lib")

using namespace std;

GetProductName::GetProductName()

{

    hres = NULL;

    pEnumerator = NULL;

    pLoc = NULL;

    pSvc = NULL;

}

GetProductName::~GetProductName()

{

}

BOOL GetProductName::Setp1(void)

{

    // Step 1: --------------------------------------------------

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

    hres = CoInitializeEx(0, COINIT_MULTITHREADED);

    if (FAILED(hres))

    {

        return FALSE; // Program has failed.

    }

    return TRUE;

}

BOOL GetProductName::Setp2(void)

{

    // Step 2: --------------------------------------------------

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

    // Note: If you are using Windows 2000, you need to specify -

    // the default authentication credentials for a user by using

    // a SOLE_AUTHENTICATION_LIST structure in the pAuthList ----

    // parameter of CoInitializeSecurity ------------------------

    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))

    {

        CoUninitialize();

        return FALSE; // Program has failed.

    }

    return TRUE;

}

BOOL GetProductName::Setp3(void)

{

    // Step 3: ---------------------------------------------------

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

    hres = CoCreateInstance(

        CLSID_WbemLocator,

        0,

        CLSCTX_INPROC_SERVER,

        IID_IWbemLocator, (LPVOID *) &pLoc);

    if (FAILED(hres))

    {

        CoUninitialize();

        return FALSE; // Program has failed.

    }

    return TRUE;

}

BOOL GetProductName::Setp4(void)

{

    // Step 4: -----------------------------------------------------

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

    // Connect to the root/cimv2 namespace with

    // the current user and obtain pointer pSvc

    // to make IWbemServices calls.

    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 (e.g. Kerberos)

        0, // Context object

        &pSvc // pointer to IWbemServices proxy

        );

    if (FAILED(hres))

    {

        pLoc->Release();

        CoUninitialize();

        return FALSE; // Program has failed.

    }

    return TRUE;

}

BOOL GetProductName::Setp5(void)

{

    // Step 5: --------------------------------------------------

    // 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))

    {

        pSvc->Release();

        pLoc->Release();

        CoUninitialize();

        return FALSE; // Program has failed.

    }

    return TRUE;

}

BOOL GetProductName::Setp6(void)

{

    // Step 6: --------------------------------------------------

    // Use the IWbemServices pointer to make requests of WMI ----

    // get the product name of the baseboard

    hres = pSvc->ExecQuery(bstr_t("WQL"), bstr_t("SELECT * FROM Win32_BaseBoard"),

        WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pEnumerator);

    if (FAILED(hres))

    {

        pSvc->Release();

        return FALSE; // Program has failed.

    }

    return TRUE;

}

BOOL GetProductName::Setp7(CString & nName)

{

    // Step 7: -------------------------------------------------

    // Get the data from the query in step 6 -------------------

    IWbemClassObject *pclsObj = NULL;

    ULONG ulReturn = 0;

    do

    {

        HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1, &pclsObj, &ulReturn);

        if (!SUCCEEDED(hr))

        {

            break;

            return FALSE;

        }

        VARIANT vtProp;

        VariantInit(&vtProp);

        hr = pclsObj->Get(L"product", 0, &vtProp, 0, 0);

        nName = vtProp.bstrVal;

        VariantClear(&vtProp);

    } while(FALSE);

    pEnumerator->Release();

    pclsObj->Release();

    return TRUE;

}

int GetProductName::Get(CString & nName)

{

    int lreturn = 0;

    do

    {

        if (Setp1() == FALSE)

        {

            lreturn = 1;

            break;

        }

        if (Setp2() == FALSE)

        {

            lreturn = 2;

            break;

        }

        if (Setp3() == FALSE)

        {

            lreturn = 3;

            break;

        }

        if (Setp4() == FALSE)

        {

            lreturn = 4;

            break;

        }

        if (Setp5() == FALSE)

        {

            lreturn = 5;

            break;

        }

        if (Setp6() == FALSE)

        {

            lreturn = 6;

            break;

        }

        if (Setp7(nName) == FALSE)

        {

            lreturn = 7;

            break;

        }

    } while (FALSE);

    // Cleanup

    pSvc->Release();

    pLoc->Release();

    CoUninitialize();

    return lreturn;

}

阅读(468) | 评论(0) | 转发(0) |

0
上一篇:进程的入口函数

下一篇:设置窗口控件的焦点顺序

相关热门文章
test123

编写安全代码——小心有符号数...

使用openssl api进行加密解密...

一段自己打印自己的c程序...

sql relay的c++接口

一个简单的shell脚本问题...

网站如何做图片的防盗链功能呢...

如何将printf输出的字符(含有...

嵌入式linux wifi移植 libert...

Ø ⊆ {Ø} 是否是对的 ,这么...

给主人留下些什么吧!~~

评论热议
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: