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

标签 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 位机器上不起作用,并使用 System.Management.dll 中的 ManagementObject 类提供了 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 )

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

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

关于c++ - 在 x86 和 x64 体系结构中获取 Windows 序列号 (MachineGuid),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38332743/

相关文章:

java - 无法在 PowerShell 中从 Java 执行 WMI 查询

c++ - 为什么 "constructor invocation"不触发任何编译器 (g++) 警告?

c++ - 参数 `NumberOfConcurrentThreads`在 `CreateIoCompletionPort`中是如何使用的

c++ - 将文字作为 const ref 参数传递

c++ - 转换为 HWND 时发出警告

c++ - 使用 WMI 的电池 FullChargeCapacity 返回 0

c++ - 具有多个函数的 Py_InitModule - 从 int 到 PyCFunction 的无效转换

windows - 自定义 git 凭据帮助程序无法在 Windows 上进行身份验证

windows - Windows 服务器上的 Redis : no config file specified

c# - 如何使用 ServiceController 远程控制 Windows 服务?