我一直在使用以下代码来获取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;
}
}
}
答案 0 :(得分:4)
正如 user287107 指出,在x64操作系统上运行的x86应用程序(32位)正在使用不同的注册表(注册表视图)。
要访问x64注册表,您有以下几种选择:
如果您使用的是.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");
如果您没有使用.Net Framework 4.0并且您不想将平台目标设置为x64,则必须使用Interop(RegOpenKeyEx()
Win32 API函数和KEY_WOW64_32KEY
标志)访问x64注册表。
开始编辑
我刚刚找到一个有趣的post来解释为什么DigitialProductId键可以为null / empty:
slmgr –cpky
结束编辑
答案 1 :(得分:1)
32位应用程序使用不同的注册表路径
32位应用程序访问注册表路径 HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node \微软\的Windows \ CurrentVersion 在哪里找不到产品密钥。
将处理器类型更改为x64对我来说是有用的,可以获得真正的密钥。