Dee*_*y90 5 vb.net cmd autoit ms-office product-key
我刚刚开始处理IT部门在工作中分配给我的任务,创建一个程序,可以读取用于安装Microsoft Office 2013的产品密钥并将其分配给计算机名称,这样他们就可以将其存储在数据库以便在需要恢复时(请记住,这是一家拥有150多个系统的公司).
我已经通过网络检查了一些建议的程序来获取产品密钥,然后我已经深入研究了使用AutoIT和VB.net制作程序.
我正在测试该程序的系统安装了Microsoft Business Retail Edition,并且运行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
Run Code Online (Sandbox Code Playgroud)
我的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
Run Code Online (Sandbox Code Playgroud)
现在,Office 2013密钥是否有不同的起始索引,还是由Lync 2013的密钥/ Project 2013密钥覆盖?或者我是以完全错误的方式解决这个问题的?
小智 2
下面的代码显示 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
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
5904 次 |
最近记录: |