CAD工具之家's Archivers

From boitboy on 2013-12-05 23:01:25

通过WMI获取机器码

机器码 源代码下载 GetComputeId 核心代码:通过WMI查询硬件属性+单独获取硬盘ID的代码 注意,并不是所有的都要用,像CPUID不建议使用,因为查询速度很慢。 WMI查询出来的硬盘ID不正确,所以单独使用了一个硬盘ID的获取代码 如果您在线程中使用还需要考虑COM初始化的问题,COM初始化那块要少量修改。 如果您需要考虑到用户重装系统或者双系统切换机器码仍然不能改变,建议使用 主板序列号+主板型号+硬盘ID(不能通过WMI获取,请使用专门代码获取,部分机器可能取不到,三个中至少获取到两个对于一般机器应该都可以了) typedef struct _T_WQL_QUERY  {      CHAR*   szSelect;       // SELECT语句       WCHAR*  szProperty;     // 属性字段  TCHAR*  szName;//名称 } T_WQL_QUERY; // WQL查询语句   const T_WQL_QUERY szWQLQuery[] = {      // 网卡原生MAC地址       "SELECT * FROM Win32_NetworkAdapter WHERE (MACAddress IS NOT NULL) AND (NOT (PNPDeviceID LIKE 'ROOT%'))",      L"PNPDeviceID",  _T("网卡原生MAC地址"),       // 硬盘序列号       "SELECT * FROM Win32_DiskDrive WHERE (SerialNumber IS NOT NULL) AND (MediaType LIKE 'Fixed hard disk%')",      L"SerialNumber",  _T("硬盘序列号"),       // 主板序列号       "SELECT * FROM Win32_BaseBoard WHERE (SerialNumber IS NOT NULL)",      L"SerialNumber",  _T("主板序列号"),           // 处理器ID       "SELECT * FROM Win32_Processor WHERE (ProcessorId IS NOT NULL)",      L"ProcessorId",  _T("处理器ID"),        // BIOS序列号       "SELECT * FROM Win32_BIOS WHERE (SerialNumber IS NOT NULL)",      L"SerialNumber",  _T("BIOS序列号"),        // 主板型号       "SELECT * FROM Win32_BaseBoard WHERE (Product IS NOT NULL)",      L"Product",  _T("主板型号"),       // 网卡当前MAC地址       "SELECT * FROM Win32_NetworkAdapter WHERE (MACAddress IS NOT NULL) AND (NOT (PNPDeviceID LIKE 'ROOT%'))",      L"MACAddress",  _T("网卡当前MAC地址") }; int Test(CString& strResult) {  HRESULT hres;     // Step 1: --------------------------------------------------     // Initialize COM. ------------------------------------------     hres =  CoInitializeEx(0, COINIT_MULTITHREADED);     if (FAILED(hres))     {         cout << "Failed to initialize COM library. Error code = 0x"             << hex << hres << endl;         return 1;                  // Program has failed.     }     // 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))     {         cout << "Failed to initialize security. Error code = 0x"             << hex << hres << endl;         CoUninitialize();         return 1;                    // Program has failed.     }         // Step 3: ---------------------------------------------------     // Obtain the initial locator to WMI -------------------------     IWbemLocator *pLoc = NULL;     hres = CoCreateInstance(         CLSID_WbemLocator,                     0,         CLSCTX_INPROC_SERVER,         IID_IWbemLocator, (LPVOID *) &pLoc);       if (FAILED(hres))     {         cout << "Failed to create IWbemLocator object."             << " Err code = 0x"             << hex << hres << endl;         CoUninitialize();         return 1;                 // Program has failed.     }     // Step 4: -----------------------------------------------------     // Connect to WMI through the IWbemLocator::ConnectServer method     IWbemServices *pSvc = NULL;       // 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 (for example, Kerberos)          0,                       // Context object          &pSvc                    // pointer to IWbemServices proxy          );         if (FAILED(hres))     {         cout << "Could not connect. Error code = 0x"              << hex << hres << endl;         pLoc->Release();             CoUninitialize();         return 1;                // Program has failed.     }     cout << "Connected to ROOT\\CIMV2 WMI namespace" << endl;     // 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))     {         cout << "Could not set proxy blanket. Error code = 0x"             << hex << hres << endl;         pSvc->Release();         pLoc->Release();             CoUninitialize();         return 1;               // Program has failed.     }  for(int i=0;i<6;i++)  {   const _T_WQL_QUERY query=szWQLQuery[i];   // Step 6: --------------------------------------------------   // Use the IWbemServices pointer to make requests of WMI ----   // For example, get the name of the operating system   IEnumWbemClassObject* pEnumerator = NULL;   hres = pSvc->ExecQuery(    bstr_t("WQL"),    bstr_t(query.szSelect),    WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,    NULL,    &pEnumerator);   if (FAILED(hres))   {    cout << "Query for operating system name failed."     << " Error code = 0x"     << hex << hres << endl;    pSvc->Release();    pLoc->Release();    CoUninitialize();    return 1;               // Program has failed.   }   // Step 7: -------------------------------------------------   // Get the data from the query in step 6 -------------------   IWbemClassObject *pclsObj;   ULONG uReturn = 0;   while (pEnumerator)   {    HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1,     &pclsObj, &uReturn);    if(0 == uReturn)    {     break;    }    VARIANT vtProp;    // Get the value of the Name property    hr = pclsObj->Get(query.szProperty, 0, &vtProp, 0, 0);    if(FAILED(hr))    {     break;    }    CString strTmp=query.szName;    strTmp+=_T("=");    strTmp+=vtProp.bstrVal;    if(!strResult.IsEmpty())    {     strResult+=_T("\r\n");    }    strResult+=strTmp;    wcout << " OS Name : " << vtProp.bstrVal << endl;    VariantClear(&vtProp);    pclsObj->Release();   }   pEnumerator->Release();   /*   const _T_WQL_QUERY query=szWQLQuery[i];   // Step 6: --------------------------------------------------   // Use the IWbemServices pointer to make requests of WMI ----   // For example, get the name of the operating system   IEnumWbemClassObject* pEnumerator = NULL;   hres = pSvc->ExecQuery(    bstr_t("WQL"),    bstr_t("SELECT * FROM Win32_OperatingSystem"),    WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,    NULL,    &pEnumerator);   if (FAILED(hres))   {    cout << "Query for operating system name failed."     << " Error code = 0x"     << hex << hres << endl;    pSvc->Release();    pLoc->Release();    CoUninitialize();    return 1;               // Program has failed.   }   // Step 7: -------------------------------------------------   // Get the data from the query in step 6 -------------------   IWbemClassObject *pclsObj;   ULONG uReturn = 0;   while (pEnumerator)   {    HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1,     &pclsObj, &uReturn);    if(0 == uReturn)    {     break;    }    VARIANT vtProp;    // Get the value of the Name property    hr = pclsObj->Get(L"Name", 0, &vtProp, 0, 0);    wcout << " OS Name : " << vtProp.bstrVal << endl;    VariantClear(&vtProp);    pclsObj->Release();   }   pEnumerator->Release();   */  }     // Cleanup     // ========         pSvc->Release();     pLoc->Release();     CoUninitialize();     return 0;   // Program successfully completed. }

查看完整版本: 通过WMI获取机器码

Tags: COM, WMI, 机器码


©CAD工具之家
创办于:2013年5月24日