对于我们这种修电脑、卖电脑的行业(软件工程师(大雾))。可能会遇到出货产品需要进行windows软件激活的订单。(真的就是属于卖电脑的范畴)
例如我们要激活windows10,我们会使用如下的命令
cscript "%windir%\system32\slmgr.vbs" /ipk {key}>nul
cscript "%windir%\system32\slmgr.vbs" /ato
而对于office,我们会使用如下命令(以office13为例)
cscript "C:\Program Files\Microsoft Office\Office14\ospp.vbs" /inpkey:{key}
cscript "C:\Program Files\Microsoft Office\Office14\ospp.vbs" /act
以上两种命令都是第一条将key写入,第二条上传至微软服务器进行激活验证。
那么如果我们先将所有的key写入,然后在统一激活会如何呢?比如
cscript "%windir%\system32\slmgr.vbs" /ipk {key}>nul
cscript "C:\Program Files\Microsoft Office\Office14\ospp.vbs" /inpkey:{key}
cscript "%windir%\system32\slmgr.vbs" /ato
或者
cscript "%windir%\system32\slmgr.vbs" /ipk {key}>nul
cscript "C:\Program Files\Microsoft Office\Office14\ospp.vbs" /inpkey:{key}
cscript "C:\Program Files\Microsoft Office\Office14\ospp.vbs" /act
实际上也能够激活成功。
那么我们就可以推测两者的激活过程中可能调用了同一种服务。
Private Sub ActivateProduct(strActivationID)
...
For Each objProduct in GetProductCollection(ProductIsPrimarySkuSelectClause & ", LicenseStatus, VLActivationTypeEnabled", PartialProductKeyNonNullWhereClause)
bCheckProductForCommand = CheckProductForCommand(objProduct, strActivationID)
...
End Sub
Function GetProductCollection(strSelect, strWhere)
...
If strWhere = EmptyWhereClause Then
Set colProducts = g_objWMIService.ExecQuery("SELECT " & strSelect & " FROM " & ProductClass)
QuitIfError()
Else
Set colProducts = g_objWMIService.ExecQuery("SELECT " & strSelect & " FROM " & ProductClass & " WHERE " & strWhere)
QuitIfError()
End If
...
set GetProductCollection = colProducts
End Function
Function ExecuteQuery(strSelect,strWhere,strClass)
Err.Clear
If strWhere = "" Then
Set productinstances = objWMI.ExecQuery("SELECT " & strSelect & " FROM " & strClass)
Else
Set productinstances = objWMI.ExecQuery("SELECT " & strSelect & " FROM " & strClass & " WHERE " & strWhere)
End If
sppErrHandle ""
End Function
For Each instance in productinstances
sppErrHandle ""
If (LCase(instance.ApplicationId) = OfficeAppId) Then
If instance.PartialProductKey <> "" Then
i = i + 1
End If
Select Case strCommand
Case "/act"
WScript.Echo MSG_ACTATTEMPT
WScript.Echo MSG_SKUID & instance.ID
WScript.Echo MSG_LICENSENAME & instance.Name
WScript.Echo MSG_DESCRIPTION & instance.Description
WScript.Echo MSG_PARTIALKEY & instance.PartialProductKey
instance.Activate
SppErrHandle(strCommand)
WScript.Echo MSG_SEPERATE
...
End Select
End If
Next
所以我们可以得出结论office和windows的key写入过程不同,但是都是走同一套激活流程
本文会经常更新,请阅读原文: https://xinyuehtx.github.io/post/windows%E5%92%8Coffice%E6%BF%80%E6%B4%BB%E5%BC%82%E5%90%8C.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验。
本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名黄腾霄(包含链接: https://xinyuehtx.github.io ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请 与我联系 。