获取 XP、Vista 和 7 的 windows 序列号
Posted
技术标签:
【中文标题】获取 XP、Vista 和 7 的 windows 序列号【英文标题】:Get windows serial for XP, Vista and Seven 【发布时间】:2011-03-08 19:29:47 【问题描述】:我正在使用此功能检索 Windows XP 许可证密钥,但它不适用于 Vista 和 Seven。如何获得这两个 Windows 版本的许可证密钥?
Public Function sGetXPKey() As String
Dim result As String = String.Empty
Dim RegKey As RegistryKey = _
Registry.LocalMachine.OpenSubKey("Software\Microsoft\Windows NT\CurrentVersion", False)
Dim bytDPID() As Byte = RegKey.GetValue("DigitalProductID")
Dim bytKey(14) As Byte
Array.Copy(bytDPID, 52, bytKey, 0, 15)
Dim strChar As String = "BCDFGHJKMPQRTVWXY2346789"
Dim strKey As String = ""
For j As Integer = 0 To 24
Dim nCur As Short = 0
For i As Integer = 14 To 0 Step -1
nCur = CShort(nCur * 256 Xor bytKey(i))
bytKey(i) = CByte(Int(nCur / 24))
nCur = CShort(nCur Mod 24)
Next
strKey = strChar.Substring(nCur, 1) & strKey
Next
For i As Integer = 4 To 1 Step -1
strKey = strKey.Insert(i * 5, "-")
Next
Return strKey
End Function
【问题讨论】:
为什么需要获取序列号? 我正在使用序列号的 md5 哈希为我的程序生成许可证密钥。 为什么不直接使用加密值的哈希值呢?还是在 Vista+ 上读取失败的密钥? @Rowland Shaw:在 Windows 7 x64 上 bytDPID 为空 :)。我查看了注册表,还有一个 DigitalProductID4 键。但不确定是否会使用它。 但是,如果你只是在做一些独特的事情来做一个 MD5 散列,那就按原样使用它。 【参考方案1】:我建议您使用 WMI,而不是使用注册表。特别是Win32_OperatingSystem
类,如here 所述。从该页面上可以看出,有一个名为 SerialNumber
的属性。
This 页面包含一个完整的示例(带有说明),说明如何操作。
【讨论】:
我在尝试定义 ManagementObjectSearcher、ManagementObjectCollection 和 Management.ManagementObject 时遇到错误。 @HasanGursoy:我认为您可能需要添加对System.Management
的引用(如果您之前没有这样做,请在Project
菜单上选择Add Reference
,然后向下滚动到你需要的那个)。
嗯,是的,你是对的。我虽然 Imports System.Management 就足够了。
@HasanGursoy:这对于框架的公共部分来说已经足够了,但是其中一些你需要手动添加(Management 和 DirectoryServices 是我现在唯一能想到的,我用过的)需要那个)。以上是关于获取 XP、Vista 和 7 的 windows 序列号的主要内容,如果未能解决你的问题,请参考以下文章
Vista 和 Windows 7 中的 OLEDB JET 错误,而不是 XP
我如何在 Windows(xp、vista、7)欢迎屏幕或锁定屏幕(如 VNC 或 Dame Ware)中进行交互
哪里是存储与XP,Vista和Windows 7兼容的日志文件的安全位置?