热搜词
发表于 2008-7-12 08:12:46 | 显示全部楼层 |阅读模式
代码框架,你所要做的仅是修改WQL语句,具体可看MSDN。以下代码为简介起见,一次返回所有的CPUID或硬盘厂商系列号

  1. #include "StdAfx.h"
  2. #include ".\puiddisk.h"
  3. #define _WIN32_DCOM
  4. #include <iostream>
  5. using namespace std;
  6. #include <comdef.h>
  7. #include <Wbemidl.h>

  8. # pragma comment(lib, "wbemuuid.lib")
  9. CpuIDDisk::CpuIDDisk(void)
  10. {
  11.     GetInfomation();
  12. }

  13. CpuIDDisk::~CpuIDDisk(void)
  14. {
  15. }
  16. int CpuIDDisk::GetInfomation(void)
  17. {
  18.     HRESULT hres;
  19.     //步骤1:不是必须的,COM只须也只能初始化一次
  20.      hres =  CoInitializeEx(0, COINIT_MULTITHREADED );
  21.     if (FAILED(hres))
  22.     {
  23.         return 1; //初始化COM异常:注意,COM只须也只能初始化一次
  24.     }
  25.     //步骤2:不是必须的,COM只须也只能设置一次
  26.     //Set general COM security levels
  27.     hres =  CoInitializeSecurity(
  28.         NULL,
  29.         -1,                          // COM authentication
  30.         NULL,                        // Authentication services
  31.         NULL,                        // Reserved
  32.         RPC_C_AUTHN_LEVEL_DEFAULT,   // Default authentication
  33.         RPC_C_IMP_LEVEL_IMPERSONATE, // Default Impersonation  
  34.         NULL,                        // Authentication info
  35.         EOAC_NONE,                   // Additional capabilities
  36.         NULL                         // Reserved
  37.         );
  38.                      
  39.     if (FAILED(hres))
  40.     {
  41.         CoUninitialize();
  42.         return 1;                    // Program has failed.
  43.     }
  44.    
  45.     //以上不是必须的,若已有“::COMInit();”,则要跳过
  46.     //步骤3: Obtain the initial locator to WMI
  47.     IWbemLocator *pLoc = NULL;
  48.     hres = CoCreateInstance(
  49.         CLSID_WbemLocator,            
  50.         0,
  51.         CLSCTX_INPROC_SERVER,
  52.         IID_IWbemLocator, (LPVOID *) &pLoc);

  53.     if (FAILED(hres))
  54.     {
  55.         CoUninitialize();
  56.         return 1;//Failed to create IWbemLocator object
  57.     }

  58.     //步骤4:Connect to WMI through the IWbemLocator::ConnectServer method
  59.     IWbemServices *pSvc = NULL;
  60.     hres = pLoc->ConnectServer(
  61.          _bstr_t(L"ROOT\\CIMV2"), // Object path of WMI namespace
  62.          NULL,                    // User name. NULL = current user
  63.          NULL,                    // User password. NULL = current
  64.          0,                       // Locale. NULL indicates current
  65.          NULL,                    // Security flags.
  66.          0,                       // Authority (e.g. Kerberos)
  67.          0,                       // Context object
  68.          &pSvc                    // pointer to IWbemServices proxy
  69.          );
  70.    
  71.     if (FAILED(hres))
  72.     {
  73.         pLoc->Release();     
  74.         CoUninitialize();
  75.         return 1;                // Program has failed.
  76.     }
  77.     // 步骤5: Set security levels on the proxy
  78.     hres = CoSetProxyBlanket(
  79.        pSvc,                        // Indicates the proxy to set
  80.        RPC_C_AUTHN_WINNT,           // RPC_C_AUTHN_xxx
  81.        RPC_C_AUTHZ_NONE,            // RPC_C_AUTHZ_xxx
  82.        NULL,                        // Server principal name
  83.        RPC_C_AUTHN_LEVEL_CALL,      // RPC_C_AUTHN_LEVEL_xxx
  84.        RPC_C_IMP_LEVEL_IMPERSONATE, // RPC_C_IMP_LEVEL_xxx
  85.        NULL,                        // client identity
  86.        EOAC_NONE                    // proxy capabilities
  87.     );

  88.     if (FAILED(hres))
  89.     {
  90.         pSvc->Release();
  91.         pLoc->Release();     
  92.         CoUninitialize();
  93.         return 1;
  94.     }

  95.     // 步骤6:Use the IWbemServices pointer to make requests of WMI ----
  96.     IEnumWbemClassObject* pEnumerator = NULL;
  97.     //计算CPUID
  98.     hres = pSvc->ExecQuery(
  99.         bstr_t("WQL"),
  100.         bstr_t("SELECT * FROM Win32_Processor"),//Win32_OperatingSystem
  101.         WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,
  102.         NULL,
  103.         &pEnumerator);
  104.    
  105.     if (FAILED(hres))
  106.     {
  107.         pSvc->Release();
  108.         pLoc->Release();
  109.         CoUninitialize();
  110.         return 1;
  111.     }
  112.     // 步骤7:Get the data from the query
  113.     IWbemClassObject *pclsObj;
  114.     ULONG uReturn = 0;
  115.     while (pEnumerator)
  116.     {
  117.         HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1,
  118.             &pclsObj, &uReturn);

  119.         if(0 == uReturn)
  120.         {
  121.             break;
  122.         }
  123.         VARIANT vtProp;
  124.         VariantInit(&vtProp);
  125.         hr = pclsObj->Get(L"ProcessorId", 0, &vtProp, 0, 0);
  126.         strProcessID=_com_util::ConvertBSTRToString(vtProp.bstrVal);//strProcessID:类级变量
  127.     }

  128.     //计算硬盘系列号
  129.     hres = pSvc->ExecQuery(
  130.         bstr_t("WQL"),
  131.         bstr_t("SELECT * FROM Win32_DiskDrive"),
  132.         WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,
  133.         NULL,
  134.         &pEnumerator);

  135.     if (FAILED(hres))
  136.     {
  137.         pSvc->Release();
  138.         pLoc->Release();
  139.         CoUninitialize();
  140.         return 1;
  141.     }
  142.     while (pEnumerator)
  143.     {
  144.         HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1,
  145.             &pclsObj, &uReturn);

  146.         if(0 == uReturn)
  147.         {
  148.             break;
  149.         }

  150.         VARIANT vtProp;
  151.         VariantInit(&vtProp);
  152.         hr = pclsObj->Get(L"PNPDeviceID", 0, &vtProp, 0, 0);
  153.     strDisk=_com_util::ConvertBSTRToString(vtProp.bstrVal);
  154.     }

  155.     pSvc->Release();
  156.     pLoc->Release();
  157.     pEnumerator->Release();
  158.     pclsObj->Release();
  159.     CoUninitialize();

  160.     return 0;   
  161. }
复制代码
全部评论0
回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|Archiver|手机版|小黑屋|管理员之家 ( 苏ICP备2023053177号-2 )

GMT+8, 2024-11-25 09:43 , Processed in 0.151795 second(s), 22 queries .

Powered by Discuz! X3.5

Cpoyright © 2001-2024 Discuz! Team