C#获取Windows CD密钥
本文关键字:密钥 CD Windows 获取 | 更新日期: 2023-09-27 18:30:14
我一直在使用以下代码来获取Windows许可证密钥。它运行了很长一段时间。但现在我发现它适用于Windows XP(x86),但不适用于Windows 7 x64。
原因:DigitalProductID
注册表值仅包含我们在64位操作系统上查找的范围内的零。因此结果是CCD_ 2。为什么会这样?我该如何解决?
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;
}
}
}
Asuser287107指出,在x64操作系统上运行的x86应用程序(32位)使用不同的注册表(注册表视图)。
为了访问x64注册表,您有几个选项:
- 将您的平台目标更改为x64(Visual Studio项目设置)
-
如果您使用的是.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(带有
KEY_WOW64_32KEY
标志的RegOpenKeyEx()
Win32 API函数)来访问x64注册表。
开始编辑
我刚刚发现了一篇有趣的帖子,解释了为什么DigitialProductId密钥可能为空:
- 您正在使用批量许可证密钥激活您的Windows 7操作系统。VLC密钥在激活后从注册表中删除
- 有人使用命令
slmgr –cpky
手动删除了注册表项(修改了此项的内容)
结束编辑
32位应用程序使用不同的注册表路径
32位应用程序访问中的注册表路径HKEY_LOCAL_MACHINE''SOFTWARE''Wow6432Node''Microsoft''Windows''CurrentVersion在那里它找不到产品密钥。
将处理器类型更改为x64使我获得了真正的密钥。