簡體   English   中英

在x86和x64體系結構中獲取Windows序列號(MachineGuid)

[英]Getting windows serial number (MachineGuid) in both x86 and x64 architectures

我目前正在使用以下C ++代碼從Windows注冊表中獲取MachineGuid ,並將該信息用於我的許可算法:

std::wstring key = L"SOFTWARE\\Microsoft\\Cryptography";
std::wstring name = L"MachineGuid";

HKEY hKey;

if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, key.c_str(), 0, KEY_READ, &hKey) != ERROR_SUCCESS)
    throw std::runtime_error("Could not open registry key");

DWORD type;
DWORD cbData;

if (RegQueryValueEx(hKey, name.c_str(), NULL, &type, NULL, &cbData) != ERROR_SUCCESS)
{
    RegCloseKey(hKey);
    throw std::runtime_error("Could not read registry value");
}

if (type != REG_SZ)
{
    RegCloseKey(hKey);
    throw "Incorrect registry value type";
}

std::wstring value(cbData/sizeof(wchar_t), L'\0');
if (RegQueryValueEx(hKey, name.c_str(), NULL, NULL, reinterpret_cast<LPBYTE>(&value[0]), &cbData) != ERROR_SUCCESS)
{
    RegCloseKey(hKey);
    throw "Could not read registry value";
}

RegCloseKey(hKey);

在x86系統(32位)上,此方法效果很好。 現在,我已將整個代碼遷移到x64(64位)Windows, RegQueryValueEx調用返回錯誤。

在其他一些文章中, 此鏈接非常清楚地說明了為什么它在64位計算機上不起作用,並使用System.Management.dllManagementObject類為32位和64位提供了替代方法。 問題在於此解決方案適用於C#,而不適用於C ++。 我找不到與ManagementObject類相對應的C ++。

因此,解決該問題的正確方法是什么:使用C ++在x86和x64機器上獲取窗口序列號( MachineGuid )。

感謝您的幫助。

KEY_WOW64_64KEY位添加到RegOpenKeyEx參數。 像這樣:

RegOpenKeyEx( HKEY_LOCAL_MACHINE, key.c_str(), 0, KEY_READ | KEY_WOW64_64KEY, &hKey )

該文檔說它在32位操作系統上被忽略,因此您甚至不需要檢測WOW64。

PS我不推薦WMI,它太慢了。 我目前擁有i5-4460 CPU,16GB RAM,相對較快的SSD,但是WMI只需1-2秒即可初始化和運行一個簡單的查詢。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM