我是vc++语言的新手,想要使用vc++语言获取系统唯一标识。请问是否有人能够帮助我编写代码来获取系统唯一标识?
我是vc++语言的新手,想要使用vc++语言获取系统唯一标识。请问是否有人能够帮助我编写代码来获取系统唯一标识?
您想查看 CoCreateGuid
(http://msdn.microsoft.com/en-us/library/ms688568(VS.85).aspx)。
CoCreateGuid
函数,其是在 Windows 操作系统中用于创建全局唯一标识符 (GUID) 的函数。您可以通过上述链接查看该函数的详细信息。为什么不使用网络卡的MAC地址?这应该是唯一的,但如果更换网络卡则会改变。
参见API GetAdaptersInfo。参考资料 http://msdn.microsoft.com/en-us/library/aa365917(VS.85).aspx
我见过使用的一个值是C驱动器的硬盘卷标ID。但是,当您更换驱动器时,它会发生变化。
我认为到目前为止的答案和对它们的回应表明,真正的答案不是编写需要唯一系统ID的代码。实际上,这很容易做到(因为没有这样的ID),这也是编写应用程序的唯一明智方式。任何依赖于驱动器序列号、MAC地址等的东西,在系统更改或升级时必然会出现问题。
您可以通过对“Win32_ComputerSystemProduct”类进行WMI查询来完成。
HRESULT hres;
// Step 1: --------------------------------------------------
// Initialize COM. ------------------------------------------
hres = CoInitializeEx(0, COINIT_MULTITHREADED);
if (FAILED(hres)) { return 1; }
// Step 2: --------------------------------------------------
// Set general COM security levels --------------------------
hres = CoInitializeSecurity(nullptr, -1, nullptr, nullptr, RPC_C_AUTHN_LEVEL_DEFAULT, RPC_C_IMP_LEVEL_IMPERSONATE,
nullptr, EOAC_NONE, nullptr);
if (FAILED(hres)) { return 1; }
// Step 3: ---------------------------------------------------
// Obtain the initial locator to WMI -------------------------
IWbemLocator *pLoc = nullptr;
hres = CoCreateInstance(CLSID_WbemLocator, nullptr, CLSCTX_INPROC_SERVER, IID_IWbemLocator, reinterpret_cast<LPVOID *>(&pLoc));
if (FAILED(hres)) { return 1; }
// Step 4: -----------------------------------------------------
// Connect to WMI through the IWbemLocator::ConnectServer method
IWbemServices *pSvc = nullptr;
// 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"), nullptr, nullptr, nullptr, NULL, nullptr, nullptr, &pSvc);
if (FAILED(hres)) { pLoc->Release(); CoUninitialize(); return 1; }
// Step 5: --------------------------------------------------
// Set security levels on the proxy -------------------------
hres = CoSetProxyBlanket(pSvc, RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE, nullptr,
RPC_C_AUTHN_LEVEL_CALL, RPC_C_IMP_LEVEL_IMPERSONATE, nullptr, EOAC_NONE);
if (FAILED(hres)) { pSvc->Release(); pLoc->Release(); CoUninitialize(); return 1; }
// Step 6: --------------------------------------------------
// Use the IWbemServices pointer to make requests of WMI ----
// For example, get the name of the operating system
IEnumWbemClassObject* pEnumerator = nullptr;
hres = pSvc->ExecQuery(
bstr_t("WQL"),
bstr_t("SELECT * FROM Win32_ComputerSystemProduct"),
WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,
nullptr,
&pEnumerator);
if (FAILED(hres)) { pSvc->Release(); pLoc->Release(); CoUninitialize(); return 1; }
// Step 7: -------------------------------------------------
// Get the data from the query in step 6 -------------------
IWbemClassObject *pclsObj = nullptr;
ULONG uReturn = 0;
HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn);
VARIANT vtProp;
// Get the value of the Name property
hr = pclsObj->Get(L"UUID", 0, &vtProp, 0, 0);
wcout << " OS Name : " << vtProp.bstrVal << endl;
VariantClear(&vtProp);
pclsObj->Release();
// Cleanup
// ========
pSvc->Release();
pLoc->Release();
pEnumerator->Release();
CoUninitialize();
return 0;