首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >读取Win 8、8.1和7上的SOFTWARE\Microsoft\Cryptography\MachineGUID时出现错误2

读取Win 8、8.1和7上的SOFTWARE\Microsoft\Cryptography\MachineGUID时出现错误2
EN

Stack Overflow用户
提问于 2018-11-01 19:15:41
回答 1查看 1.5K关注 0票数 0

我在尝试从注册表中读取MachineGUID时出现错误2,下面是我当前使用的代码:

代码语言:javascript
运行
复制
LSTATUS l = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Cryptography", 0, KEY_READ | KEY_WOW64_64KEY, &hResult);
CString csError;
if (l == ERROR_SUCCESS)
{
    l = RegGetValue(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Cryptography", "MachineGUID", RRF_RT_ANY | RRF_SUBKEY_WOW6464KEY, NULL, szGUID, &lSize);
    if (l != ERROR_SUCCESS)
    {
        l = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Cryptography", 0, KEY_READ | KEY_WOW64_32KEY, &hResult);
        if (l == ERROR_SUCCESS)
        {
            l = RegGetValue(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Cryptography", "MachineGUID", RRF_RT_ANY | RRF_SUBKEY_WOW6432KEY, NULL, szGUID, &lSize);
            if (l != ERROR_SUCCESS)
            {
                l = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Cryptography", 0, KEY_READ, &hResult);
                if (l == ERROR_SUCCESS)
                {
                    l = RegGetValue(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Cryptography", "MachineGUID", RRF_RT_ANY, NULL, szGUID, &lSize);
                    if (l != ERROR_SUCCESS)
                    {
                        csError.Format("Error %lu reading machine ID.", l);
                        MessageBox(csError);
                    }
                }
                else
                {
                    csError.Format("Error %lu opening machine ID with KEY_READ.", l);
                    MessageBox(csError);
                }
            }
        }
        else
        {
            csError.Format("Error %lu opening machine ID with KEY_READ | KEY_WOW64_32KEY.", l);
            MessageBox(csError);
        }
    }
}
else
{
    csError.Format("Error %lu opening machine ID with KEY_READ | KEY_WOW64_64KEY.", l);
    MessageBox(csError);
}

所有的RegOpenKeyEx调用都是为了调试目的而放入的;是的,我知道这个键应该关闭。我只是想看看开放访问是否会有问题,而实际上没有问题。代码一直到最里面的错误消息,即read错误消息。

该代码是使用VS 2017构建的32位代码。这在windows10上运行得很好,有人能告诉我问题出在哪里吗?

这段代码应该会产生问题。它使用MBCS而不是unicode。

代码语言:javascript
运行
复制
#include <windows.h>
#include <winreg.h>
#include <stdio.h>

int main()
{
  char szGUID[37];
  memset(szGUID, 0, 37);
  DWORD lSize = 37;

  ULONG ulResult = RegGetValue(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Cryptography", "MachineGUID", RRF_RT_ANY | RRF_SUBKEY_WOW6464KEY, NULL, szGUID, &lSize);
  if (ulResult != ERROR_SUCCESS)
  {
    lSize = 37;
    ulResult = RegGetValue(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Cryptography", "MachineGUID", RRF_RT_ANY | RRF_SUBKEY_WOW6432KEY, NULL, szGUID, &lSize);
    if (ulResult != ERROR_SUCCESS)
    {
      lSize = 37;
      ulResult = RegGetValue(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Cryptography", "MachineGUID", RRF_RT_ANY, NULL, szGUID, &lSize);
      if (ulResult != ERROR_SUCCESS)
      {
        printf("Error %lu opening SOFTWARE\\Microsoft\\Cryptography\\MachineGUID.\n", ulResult);
      }
      else
        printf("Key SOFTWARE\\Microsoft\\Cryptography\\MachineGUID value %s\n", szGUID);
    }
    else
      printf("Key SOFTWARE\\Microsoft\\Cryptography\\MachineGUID (RRF_SUBKEY_WOW6432KEY) value %s\n", szGUID);
  }
  else
    printf("Key SOFTWARE\\Microsoft\\Cryptography\\MachineGUID (RRF_SUBKEY_WOW6464KEY) value %s\n", szGUID);
  return 0;
}
EN

Stack Overflow用户

发布于 2018-11-02 16:46:07

在Windows10中引入了RRF_SUBKEY_WOW6432KEY标志。在以前的Windows版本中忽略了该标志。因此,当你在Windows7和Windows8上使用RegGetValue时,你实际上是在读取没有MachineGUID值的SOFTWARE\\Wow6432Node\Microsoft\\Cryptography密钥。

您可以做的是使用RegOpenKeyExKEY_WOW64_64KEY标志显式打开"SOFTWARE\\Microsoft\\Cryptography"密钥,然后在该密钥上使用RegGetValue

下面的示例程序演示了这一点。我已经在一个真正的32位版本上进行了测试,但它应该可以按照this SO question的要求工作。

代码语言:javascript
运行
复制
#include <windows.h>
#include <winreg.h>
#include <stdio.h>

int main()
{
  char szGUID[37];
  memset(szGUID, 0, 37);
  DWORD lSize = 37;
  ULONG ulResult;

  HKEY hkey;
  ulResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Cryptography", 0, KEY_WOW64_64KEY + KEY_READ, &hkey);
  if (ulResult == 0)
  {
    ulResult = RegGetValue(hkey, "", "MachineGUID", RRF_RT_ANY, NULL, szGUID, &lSize);
    if (ulResult == 0)
    {
      printf("Key SOFTWARE\\Microsoft\\Cryptography\\MachineGUID value %s\n", szGUID);
    }
    else
    {
      printf("Error %lu during RegGetValue of MachineGUID", ulResult);
    }

    RegCloseKey(hkey);
  }
  else
  {
    printf("Error %lu opening HKEY_LOCAL_MACHINE, SOFTWARE\\Microsoft\\Cryptography\\MachineGUID.\n", ulResult);
  }
}
票数 0
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53100174

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档