我刚刚开始处理 IT 部门在工作中分配给我的任务,创建一个程序,该程序可以读取用于安装 Microsoft Office 2013 的产品密钥并将其分配给计算机名称,以便他们可以将其存储在需要恢复的数据库(请记住,这是一家拥有 150 多个系统的公司)。
我已经通过网络查找了一些建议的程序来获取产品密钥,然后我深入研究了使用 AutoIT 和 VB.net 自己制作程序。
我正在测试此程序的系统安装了 Microsoft 商业零售版,并且运行时C:\Program Files(x86)\Microsoft Office\Office15\ cscript ospp.vbs
为我提供了两个 5 个字符的密钥 - 一个用于 Microsoft Project (BWTM4),一个用于 Office 2013 (7PYM4)。当我运行我创建的应用程序时,我得到一个带有 BWMT4 密钥的密钥,来自网络的应用程序(Belarc、SterJo 等)返回相同的密钥。但同样,这是 Project 的密钥,Microsoft Office 2013 安装通过以下消息验证这一点:此密钥适用于 Microsoft Project 2013。
我的 AutoIT 代码:
Case "Office 2013 x86"
$RegKey = 'HKLM\SOFTWARE\Microsoft\Office\15.0\Registration'
If @OSArch = 'x64' Then $RegKey = 'HKLM64\SOFTWARE\Wow6432Node\Microsoft\Office\15.0\Registration'
For $i = 1 To 1024
$var = RegEnumKey($RegKey, $i)
If @error <> 0 Then ExitLoop
$bKey = RegRead($RegKey & '\' & $var, 'DigitalProductId')
If Not @error Then ExitLoop
Next
$iKeyOffset = 0x328
Case "Office 2013 x64"
If @OSArch <> 'x64' Then SetError(1, 0, "Product not found")
$RegKey = 'HKLM64\SOFTWARE\Microsoft\Office\15.0\Registration'
For $i = 1 To 1024
$var = RegEnumKey($RegKey, $i)
If @error <> 0 Then ExitLoop
$bKey = RegRead($RegKey & '\' & $var, 'DigitalProductId')
If Not @error Then ExitLoop
Next
$iKeyOffset = 0x328
我的 VB.net 代码: 此代码基于来自网络的代码,并非声称制作此代码
Dim digitalProductId As IList(Of Byte) = Nothing
If True Then
Dim registry As RegistryKey = Nothing
registry = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64).OpenSubKey("SOFTWARE\Wow6432Node\Microsoft\Office\15.0\Registration\{90150000-012D-0000-0000-0000000FF1CE}", False)
If registry IsNot Nothing Then
digitalProductId = TryCast(registry.GetValue("DigitalProductId"), Byte())
registry.Close()
Else
Return Nothing
End If
End If
Dim keyStartIndex As Integer = 52
Dim keyEndIndex As Integer = keyStartIndex + 15
现在,Office 2013 密钥是否有不同的起始索引,或者它是否被 Lync 2013 的密钥/Project 2013 的密钥覆盖?还是我以完全错误的方式解决这个问题?