以编程方式获取 Office 2013 产品密钥

Posted

技术标签:

【中文标题】以编程方式获取 Office 2013 产品密钥【英文标题】:Programmatically attain Office 2013 Product Key 【发布时间】:2014-05-04 05:02:30 【问题描述】:

我刚刚开始执行 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 的密钥覆盖?还是我的做法完全错误?

【问题讨论】:

【参考方案1】:

下面的代码显示了 Windows 操作系统的产品密钥。但它使用完全相同的原理来获得 Office Key。密钥是从 Windows 注册表中获取的。找到注册表并将其分配给代码,它应该可以正常工作:)

Public Function GetProductKey(ByVal KeyPath As String, ByVal ValueName As String) As String

    Dim HexBuf As Object = My.Computer.Registry.GetValue(KeyPath, ValueName, 0)

    If HexBuf Is Nothing Then Return "N/A"

    Dim tmp As String = ""

    For l As Integer = LBound(HexBuf) To UBound(HexBuf)
        tmp = tmp & " " & Hex(HexBuf(l))
    Next

    Dim StartOffset As Integer = 52
    Dim EndOffset As Integer = 67
    Dim Digits(24) As String

    Digits(0) = "B" : Digits(1) = "C" : Digits(2) = "D" : Digits(3) = "F"
    Digits(4) = "G" : Digits(5) = "H" : Digits(6) = "J" : Digits(7) = "K"
    Digits(8) = "M" : Digits(9) = "P" : Digits(10) = "Q" : Digits(11) = "R"
    Digits(12) = "T" : Digits(13) = "V" : Digits(14) = "W" : Digits(15) = "X"
    Digits(16) = "Y" : Digits(17) = "2" : Digits(18) = "3" : Digits(19) = "4"
    Digits(20) = "6" : Digits(21) = "7" : Digits(22) = "8" : Digits(23) = "9"

    Dim dLen As Integer = 29
    Dim sLen As Integer = 15
    Dim HexDigitalPID(15) As String
    Dim Des(30) As String

    Dim tmp2 As String = ""

    For i = StartOffset To EndOffset
        HexDigitalPID(i - StartOffset) = HexBuf(i)
        tmp2 = tmp2 & " " & Hex(HexDigitalPID(i - StartOffset))
    Next

    Dim KEYSTRING As String = ""

    For i As Integer = dLen - 1 To 0 Step -1
        If ((i + 1) Mod 6) = 0 Then
            Des(i) = "-"
            KEYSTRING = KEYSTRING & "-"
        Else
            Dim HN As Integer = 0
            For N As Integer = (sLen - 1) To 0 Step -1
                Dim Value As Integer = ((HN * 2 ^ 8) Or HexDigitalPID(N))
                HexDigitalPID(N) = Value \ 24
                HN = (Value Mod 24)

            Next

            Des(i) = Digits(HN)
            KEYSTRING = KEYSTRING & Digits(HN)
        End If
    Next

    Return StrReverse(KEYSTRING)

End Function

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    Label1.Text = GetProductKey("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\", "DigitalProductId")
End Sub

【讨论】:

嗨,詹姆斯,感谢您的回复。我在一个单独的函数中调用了它,它与 Office 2013 的注册表位置匹配。但是,我的结果好坏参半。在安装了 2013 的系统上,我检索了一个被标识为 Microsoft Project 2013 密钥“仅”的密钥。它不适用于办公套件。在未安装 2013 的系统上,它返回 Microsoft Lync 2013 的密钥。在安装了 Professional 2013 的系统上,它返回与其他系统上相同的 Lync 密钥。令人困惑,是吗? D: 我注意到 90150000-012D-0000-0000-0000000FF1CE 可以从 PC 更改为 PC,我会检查您公司的一些 PC,看看这个地址是否相同他们都是。如果不是,那将是您的问题。我检查了我工作场所的几台电脑,其中一些略有不同。希望对您有所帮助。 嗨詹姆斯。我为 5 台不同的 PC 手动更改了硬编码的注册表位置,即使在那时也遇到了障碍。第 5 台 PC 甚至没有 90150000,而是有 91150000,并且有两个带有 DigitalProductId 的文件夹。我测试了两者都无济于事。似乎2013年对我来说仍然遥不可及。我明天再试一次并报告我的结果。再次感谢。 我发现了这个:dropbox.com/s/7sq18lcsllvzsxs/… - 不适合我,但使用了另一种可能感兴趣的方法,我现在打算修复它。 哈哈,信不信由你,我经历过这个项目。我在第 68 行有一个问题(注册表中的根无效)。我一直在同时解决这个问题,但没有取得任何进展。如果我确实取得任何进展,我会报告。

以上是关于以编程方式获取 Office 2013 产品密钥的主要内容,如果未能解决你的问题,请参考以下文章

~!!!!!!!!!!!!求最新可用的 office07 plus 密钥!!!

kms命令激活Microsoft Office 2013

产品id是密钥吗可以激活office吗

产品密钥在电脑的哪里

office2019密钥激活怎么弄

Excel2019产品密钥是啥?求个能用的Excel2019产品密钥