#include <WinSock2.h>
#include <windows.h>
#include <Wbemidl.h>
#include <iostream>
#include <DXGI.h>
#include <comdef.h>
#include <iostream>
using namespace std;
#pragma comment(lib,"DXGI.lib")
#pragma warning(disable: 4996)
#pragma comment(lib, "wbemuuid.lib")
QString GrantedManager::getMachineUUID(){QString uuid ="";HRESULT hres =CoInitializeEx(0, COINIT_APARTMENTTHREADED);if((hres != RPC_E_TOO_LATE)&&(hres != RPC_E_NO_GOOD_SECURITY_PACKAGES)&&FAILED(hres)){qDebug()<<"Failed to initialize security. "<<"Error code = 0x"<< hex << hres << endl;CoUninitialize();return uuid;}hres =CoInitializeSecurity(NULL,-1,// COM authenticationNULL,// Authentication servicesNULL,// ReservedRPC_C_AUTHN_LEVEL_DEFAULT,// Default authenticationRPC_C_IMP_LEVEL_IMPERSONATE,// Default ImpersonationNULL,// Authentication infoEOAC_NONE,// Additional capabilitiesNULL// Reserved);if((hres != RPC_E_TOO_LATE)&&FAILED(hres)){qDebug()<<"Failed to initialize security. Error code = 0x"<< hex << hres << endl;CoUninitialize();return uuid;// 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)){qDebug()<<"Failed to create IWbemLocator object."<<" Err code = 0x"<< hex << hres << endl;CoUninitialize();return uuid;// Program has failed.}// Step 4: -----------------------------------------------------// Connect to WMI through the IWbemLocator::ConnectServer methodIWbemServices *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 namespaceNULL,// User name. NULL = current userNULL,// User password. NULL = current0,// Locale. NULL indicates currentNULL,// Security flags.0,// Authority (e.g. Kerberos)0,// Context object&pSvc // pointer to IWbemServices proxy);if(FAILED(hres)){qDebug()<<"Could not connect. Error code = 0x"<< hex << hres << endl;pLoc->Release();CoUninitialize();return uuid;// 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 setRPC_C_AUTHN_WINNT,// RPC_C_AUTHN_xxxRPC_C_AUTHZ_NONE,// RPC_C_AUTHZ_xxxNULL,// Server principal nameRPC_C_AUTHN_LEVEL_CALL,// RPC_C_AUTHN_LEVEL_xxxRPC_C_IMP_LEVEL_IMPERSONATE,// RPC_C_IMP_LEVEL_xxxNULL,// client identityEOAC_NONE // proxy capabilities);if(FAILED(hres)){cout <<"Could not set proxy blanket. Error code = 0x"<< hex << hres << endl;pSvc->Release();pLoc->Release();CoUninitialize();return uuid;// Program has failed.}// Step 6: --------------------------------------------------// Use the IWbemServices pointer to make requests of WMI ----// For example, get the name of the operating systemIEnumWbemClassObject* pEnumerator =NULL;hres = pSvc->ExecQuery(bstr_t("WQL"),bstr_t("SELECT UUID FROM Win32_ComputerSystemProduct"),WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,NULL,&pEnumerator);if(FAILED(hres)){qDebug()<<"Query for operating system name failed."<<" Error code = 0x"<< hex << hres << endl;pSvc->Release();pLoc->Release();CoUninitialize();return uuid;// 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(FAILED(hr)||0== uReturn){break;}VARIANT vtProp;// Get the value of the Name property/*hr = pclsObj->Get(L"VolumeName", 0, &vtProp, 0, 0);wcout << " VolumeName : " << vtProp.bstrVal << endl;VariantClear(&vtProp);*/if(FAILED(pclsObj->Get(L"UUID",0,&vtProp,0,0))){qDebug()<<"The specified property is not found."<< endl;}else{qDebug()<< vtProp.bstrVal << endl;QString q_str((QChar*)vtProp.bstrVal,wcslen(vtProp.bstrVal));uuid = q_str;}pclsObj->Release();}// Cleanup// ========pSvc->Release();pLoc->Release();pEnumerator->Release();// pclsObj->Release();CoUninitialize();qDebug()<<"uuid: "<< uuid<< endl;return uuid;}
擴展
wmic WMIC - Take Command-line Control over WMI
WMI 命令行 (WMIC) 實用工具為 Windows Management Instrumentation (WMI) 提供命令行接口。 WMIC 與現有 shell 和實用工具命令兼容, 自 Windows 10 版本 21H1 和 Windows 服務器的 21H1 半年頻道版本起棄用。
wmic csproduct list
通常情況下,可以通過命令行來獲取主板ID:
wmic csproduct get uuid
獲取CPU的標識符:
wmic cpu get processorid
獲取硬盤序列號:
wmic diskdrive get serialnumber