Как получить уникальный идентификатор системы с помощью кода VC ++? - PullRequest
3 голосов
/ 31 июля 2009

Я новичок в языке vc ++, поэтому я хочу получить системный уникальный идентификатор, используя язык vc ++. пожалуйста, кто-нибудь может мне помочь в кодировании, как получить уникальный идентификатор системы?

Ответы [ 6 ]

2 голосов
/ 31 июля 2009

Почему бы не использовать MAC-адрес с сетевой карты. Это должно быть уникальным, но изменится, если вы измените сетевую карту.

См. API GetAdaptersInfo. ссылка http://msdn.microsoft.com/en-us/library/aa365917(VS.85).aspx

2 голосов
/ 31 июля 2009

Вы хотите посмотреть на CoCreateGuid (http://msdn.microsoft.com/en-us/library/ms688568(VS.85).aspx).

1 голос
/ 31 июля 2009

Если вы хотите создать уникальный идентификатор на основе конкретной машины, я могу подумать о том, чтобы использовать старый добрый буст.

Например, вы можете найти одну из кандидатов в библиотеки Boost, называемую UUID (генерация GUID), и вы можете посмотреть boost :: filesystem. Используя файловую систему, вы можете получить даты создания некоторых системных файлов и использовать эти строки для генерации GUID.

Просто мысль, надеюсь, это поможет

  • вы можете найти библиотеку UUID здесь

    • вы можете найти библиотеку файловой системы документация здесь
0 голосов
/ 17 мая 2019

Вы можете сделать это через 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;  
0 голосов
/ 31 июля 2009

Поскольку я думаю, что ответы на данный момент и ответы на них указывают, реальный ответ не заключается в написании кода, который требует уникального идентификатора системы. Это очень легко сделать, фактически (поскольку такого идентификатора нет), это единственный разумный способ написания приложений. Все, что зависит от серийного номера привода, MAC-адресов и т. Д., Неизбежно сломается при изменении или обновлении системы.

0 голосов
/ 31 июля 2009

В качестве значения, которое я видел, используется идентификатор тома жесткого диска C-диска. Это изменится, когда вы поменяете диск.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...