日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

获取机器UUID

發布時間:2023/12/20 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 获取机器UUID 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目的

我們都知道UUID(UUID 是 通用唯一識別碼(Universally Unique Identifier)的縮寫), 其目的,是讓分布式系統中的所有元素,都能有唯一的辨識信息,而不需要通過中央控制端來做辨識信息的指定。

應用

好比身份證一樣, 我們需要UUID, 作唯一辨識信息。 那么問題來了, 如何綁定唯一電腦呢,
一般會立馬想到mac地址, 實際經驗來說, mac太不可靠了, 對于那些usb轉網口的, 其生成獲取到mac地址是臨時性的。
那么可采取的具有唯一性的, 可靠性較好的辨識唯一機器(主機), 那就是 獲取機器的UUID-(也就是此計算機系統產盤的uuid), 也有一種說法此表示的是電腦主板唯一標識。如下圖


代碼如下

#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

總結

以上是生活随笔為你收集整理的获取机器UUID的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。