前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >2018-9-17-windows和office激活异同

2018-9-17-windows和office激活异同

作者头像
黄腾霄
发布2020-06-10 11:11:57
9290
发布2020-06-10 11:11:57
举报
文章被收录于专栏:黄腾霄的博客

对于我们这种修电脑、卖电脑的行业(软件工程师(大雾))。可能会遇到出货产品需要进行windows软件激活的订单。(真的就是属于卖电脑的范畴)


例如我们要激活windows10,我们会使用如下的命令

代码语言:javascript
复制
cscript "%windir%\system32\slmgr.vbs" /ipk {key}>nul
cscript "%windir%\system32\slmgr.vbs" /ato

而对于office,我们会使用如下命令(以office13为例)

代码语言:javascript
复制
cscript "C:\Program Files\Microsoft Office\Office14\ospp.vbs" /inpkey:{key}
cscript "C:\Program Files\Microsoft Office\Office14\ospp.vbs" /act

以上两种命令都是第一条将key写入,第二条上传至微软服务器进行激活验证。

那么如果我们先将所有的key写入,然后在统一激活会如何呢?比如

代码语言:javascript
复制
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

或者

代码语言:javascript
复制
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
代码语言:javascript
复制
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
代码语言:javascript
复制
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 ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请 与我联系

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-09-17 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档