【问题标题】:Getting windows serial number (MachineGuid) in both x86 and x64 architectures在 x86 和 x64 架构中获取 Windows 序列号 (MachineGuid)
【发布时间】:2016-07-12 15:09:48
【问题描述】:

我目前正在使用以下 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 位机器上不起作用,并使用来自 System.Management.dllManagementObject 类为 32 位和 64 位提供了替代方案。问题是这个解决方案适用于 C#,而不是 C++。我找不到 ManagementObject 类的 C++ 等价物。

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

感谢您的帮助。

【问题讨论】:

  • WMI 可通过 COM API 用于 C++ 应用程序。我建议查看Creating a WMI Application using C++。您将寻求执行 WQL 查询(类似于 SQL)来查询 Win32_Provider 类之一。我现在不能告诉你的是哪个包含MachineGuid 的等价物。 Win32_ComputerSystem 可能是您的起点。
  • 如果您继续追求 WMI 解决方案,Win32_ComputerSystemProduct UUID 与 Windows 操作系统系统信息应用程序中的 UUID 相关,我一眼就能找到可能与 @ 987654335@.

标签: c++ windows wmi


【解决方案1】:

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

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

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

附:不推荐WMI,太慢了。我目前有 i5-4460 CPU、16GB RAM、相对较快的 SSD,但 WMI 需要 1-2 秒来初始化和运行即使是一个简单的查询。

【讨论】:

  • 谢谢...我是否应该为 32 位和 64 位实现都添加 KEY_WOW64_64KEY 仅适用于 64 位选项并保留 32 位而不使用它?
  • 只适用于 32 位就可以,但同时为两者添加是无害的。
猜你喜欢
  • 1970-01-01
  • 2020-07-14
  • 1970-01-01
  • 2011-11-29
  • 2010-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多