在x86和x64体系结构中获取Windows序列号(MachineGuid)

时间:2016-07-12 15:09:49

标签: c++ windows wmi

我目前正在使用以下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调用返回错误。

在其他一些帖子中,this link非常清楚地解释了为什么这不适用于64位计算机,并使用ManagementObject中的System.Management.dll类为32位和64位提供了替代方案。问题是这个解决方案适用于C#,而不适用于C ++。我找不到ManagementObject类的C ++等价物。

那么,问题的正确解决方案是什么:使用C ++在x86和x64机器上获取窗口序列号(MachineGuid)。

感谢您的帮助。

1 个答案:

答案 0 :(得分:4)

KEY_WOW64_64KEY位添加到RegOpenKeyEx参数中。像这样:

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

The documentation表示它在32位操作系统上被忽略,所以你甚至不需要检测WOW64。

P.S。我不推荐WMI,它太慢了。我目前拥有i5-4460 CPU,16GB RAM,相对较快的SSD,但WMI需要1-2秒才能初始化并运行一个简单的查询。