对于我们这种修电脑、卖电脑的行业(软件工程师(大雾))。可能会遇到出货产品需要进行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
实际上也能够激活成功。
那么我们就可以推测两者的激活过程中可能调用了同一种服务。
-
slmr
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
以上是关键代码,说明在slmr进行激活时,会通过wmi服务查询所有待激活的产品类型,然后进行激活
-
ospp
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
以上是关键代码,可以看到在ospp进行激活时,也是会通过wmi服务查询所有待激活的产品类型,然后进行激活
所以我们可以得出结论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 ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请 与我联系 。