3

我是 vc++ 语言的新手,所以我想使用 vc++ 语言获取系统唯一 ID。所以请任何人都可以帮我编写如何获取系统唯一ID的编码吗?

4

6 回答 6

2

你想看看CoCreateGuidhttp://msdn.microsoft.com/en-us/library/ms688568(VS.85).aspx)。

于 2009-07-31T10:34:00.733 回答
2

为什么不使用网卡中的 MAC 地址。这应该是唯一的,但如果您更改网卡,则会更改。

请参阅 API GetAdaptersInfo。参考 http://msdn.microsoft.com/en-us/library/aa365917(VS.85).aspx

于 2009-07-31T13:13:17.413 回答
1

如果您希望基于特定机器创建唯一 ID,我能想到的方法之一是使用良好的旧提升。

例如,您可以查找名为 UUID(GUID 生成)的 boost 候选库之一,您可以查找 boost::filesystem。使用文件系统,您可以获得某些系统文件的创建日期,并使用这些字符串生成 GUID。

一个想法,希望对你有帮助

于 2009-07-31T13:38:41.077 回答
0

正如我认为到目前为止的答案和对它们的响应所表明的那样,真正的答案不是编写需要唯一系统 ID 的代码。这很容易做到,事实上(因为没有这样的 ID)它是编写应用程序的唯一明智的方式。当系统更改或升级时,任何依赖于驱动器序列号、MAC 地址等的东西都将不可避免地损坏。

于 2009-07-31T14:10:54.327 回答
0

我见过使用的一个值是 C 驱动器的硬盘卷 ID。但是,当您更换驱动器时,它会发生变化。

于 2009-07-31T13:40:32.853 回答
0

您可以通过 WMI 查询“Win32_ComputerSystemProduct”类来完成。

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;  
于 2019-05-17T16:30:50.063 回答