2

我一直在使用以下代码来获取 Windows 许可证密钥。它工作了很长时间。但现在我发现它可以在 Windows XP (x86) 上运行,但不能在 Windows 7 x64 上运行。

原因:DigitalProductID注册表值仅包含我们在 64 位操作系统上寻找的范围内的零。所以结果呢BBBBB-BBBBB-BBBBB-BBBBB-BBBBB。为什么会这样,我该如何解决这个问题?

    public static string LicenseCDKey
    {
        get
        {
            try
            {
                byte[] rpk = (byte[])Registry.LocalMachine
                   .OpenSubKey(@"Software\Microsoft\Windows NT\CurrentVersion")
                   .GetValue("DigitalProductId");
                string serial = "";
                const string possible = "BCDFGHJKMPQRTVWXY2346789";
                for (int i = 0; i < 25; i++)
                {
                    int accu = 0;
                    for (int a = 0; a < 15; a++)
                    {
                        accu <<= 8;
                        accu += rpk[66 - a];
                        rpk[66 - a] = (byte)(accu / 24 & 0xff);
                        accu %= 24;
                    }
                    serial = possible[accu] + serial;
                    if (i % 5 == 4 && i < 24)
                    {
                        serial = "-" + serial;
                    }
                }
                return serial;
            }
            catch
            {
                return ErrorString;
            }
        }
    }
4

2 回答 2

4

正如user287107指出的那样,在 x64 操作系统上运行的 x86 应用程序(32 位)正在使用不同的注册表(注册表视图)。

为了访问 x64 注册表,您有几个选项:

  1. 将您的平台目标更改为 x64(Visual Studio 项目设置)。
  2. 如果您使用的是 .Net Framework 4.0,您可以使用RegistryKey类和RegistryView枚举来访问 x64 注册表。

    RegistryKey key = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine,
                                              RegistryView.Registry64);
    
    string keyPath = @"Software\Microsoft\Windows NT\CurrentVersion";
    byte[] rpk = (byte[])key.OpenSubKey(keyPath).GetValue("DigitalProductId");
    
  3. 如果您不使用 .Net Framework 4.0 并且不想将平台目标设置为 x64,则必须使用 Interop(RegOpenKeyEx()带有标志的 Win32 API 函数KEY_WOW64_32KEY)来访问 x64 注册表。

开始编辑

我刚刚发现了一篇有趣的帖子,解释了为什么 DigitialProductId 键可能为空/空:

  1. 您正在使用批量许可证密钥来激活您的 Windows 7 操作系统。激活后,VLC 密钥将从注册表中删除。
  2. 有人使用命令手动删除了注册表项(修改了这个键的内容)slmgr –cpky

结束编辑

于 2012-04-04T19:10:39.480 回答
1

32 位应用程序使用不同的注册表路径

32 位应用程序访问 HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion 中找不到产品密钥的注册表路径。

将处理器类型更改为 x64 有助于我获得真正的密钥。

于 2012-04-04T18:58:22.590 回答