阅读905 返回首页    go 阿里云 go 技术社区[云栖]


Windows基础排查之一 - 激活

前言


想必大家还记得,若干年前还在用Windows XP时候,为了折腾操作系统,不少人应该都尝试去网上找寻过各种密钥,由于针对不同激活方式有不同的安装镜像,当时找到方便使用的多是VOL密钥以及与之相匹配的VL版光盘镜像。从Windows Vista开始,微软改进了密钥管理办法,针对批量许可证客户推出了新的密钥类型:密钥管理服KMS(Key Management Service)以及多次激活密钥MAK(Multiple Activation Key)。后者允许对应密钥能多次永久激活,而KMS主要针对大体量的客户进行动态激活管理。这里我们只讨论KMS。

基本原理


首先我们看微软官方的说明:




简而言之就是KMS客户端向KMS服务器定期注册来维持激活状态激活。
值得注意的是,KMS的激活方式并非永久激活,而是有180天的有效期,未激活状态有30天的宽限期,期间默认会每2小时尝试激活,期间如果仍未激活那么系统部分功能会受到影响同时可能频繁重启。激活成功后默认每7天客户端会连接KMS服务器更新激活状态并刷新有效期,如果上次激活成功后的180天内客户端没有成功更新激活状态,那么系统会再次进入未激活状态。


这里提到了两个角色:


即KMS服务器,基于Windows服务器安装批量激活服务角色,使用特定的激活码向微软注册KMS Host,用于管理和维护客户端的激活请求和数据。在我们云上环境,经典网络下是内网10网段地址,对应kms.aliyun-inc.com域名,VPC环境下是100网段内部服务地址,对应kms.cloud.aliyuncs.com,KMS服务默认端口号是TCP 1688


即KMS客户端,不同于零售版本以及MAK密钥,针对不同的操作系统版本,KMS有固定的产品密钥,使用对应的产品密钥向KMS服务器注册激活,并定期请求KMS刷新激活状态。

各版本Windows系统产品密钥参考:

https://technet.microsoft.com/en-us/library/jj612867.aspx

排查分析


在云上环境,KMS服务器出问题的可能性很小,所以这里我们主要讨论客户端的排查。激活具体涉及的系统内流程十分复杂,我们需要重点关注几个组件。


部分版本ECS Windows镜像中存在自动激活脚本,位置在系统盘(默认C盘)根目录下,内容很简单,指定KMS服务器后进行激活。


echo 用户您好!Windwos Server 2012 正在激活中,请稍后...
echo.
cscript //B "%windir%\system32\slmgr.vbs" /skms  kms.aliyun-inc.com
cscript //B "%windir%\system32\slmgr.vbs" /ato


这里我们看到使用了slmgr.vbs (Software License Manager),脚本文件路径在%windir%\system32\slmgr.vbs,作为统一管理许可证和激活相关操作的接口,提供一系列参数来执行各种操作。



具体命令参数请参考:

https://technet.microsoft.com/en-us/library/dn502540(v=ws.11).aspx


这里我们主要关注以下一些命令参数:


/skms    – 指定KMS服务器
/ato     – 请求KMS服务器进行激活
/dlv     – 显示详细的许可证信息
/rilc    – 重新安装许可证
/upk     – 卸载产品密钥
/ipk     – 安装产品密钥

对应路径是%windir%/system32/sppsvc.exe,服务是Software Protection Service,spp是Software Protection Platform的缩写,在Windows Server 2008 R2之前是Software License Service,激活原理没有什么差别,这里我们只讨论Software Protection Service的情况。

实际具体的激活流程是由sppsvc.exe来完成,期间会涉及一系列DLL文件、WMI和注册表的操作。针对这个程序,我们主要关注以下两个路径:


HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\sppsvc

C:\Windows\System32\spp


Sppsvc.exe还会调用一系列spp相关组件,从Windows 8/Windows 2012开始,还引入SppExtComObj.exe (KMS Connection Broker)来完成激活程序中部分工作。


了解了两个主要组件,我们可以从以下五个方面来一步步排查和分析:


CPU、内存、系统盘空间资源使用正常,系统时钟同步正常。

另外系统被黑是一个大类,如果遇到激活报错比较奇怪的情况,可以一开始就快速检查以下几个路径:

C:\Windows
C:\Windows\system32
C:\Windows\sysWOW64
C:\Windows\temp


*显示隐藏,以日期排列,重点查看是否有较近时间点的异常exe/bat/ps1/vbs等文件,Windows自带有不少exe文件,可以通过移动鼠标到文件上查看公司显示是否是Microsoft Corporation。

首先ping KMS服务器确保可以正常解析出IP地址,之后可以简单地通过telnet KMS服务器1688端口结合同地域其他ECS服务器测试连接相同KMS服务器能否正常激活来判断,如果端口是通的同时在测试服务器slmgr /ato能激活成功,那么便可以排除KMS服务器的问题。

基于激活失败的报错并通过提示的exe命令查看错误码信息或者通过err.exe (error lookup tool,适用于0x8开头的错误码)获取错误码的含义,同时对比系统事件日志(事件日志可以通过命令行输入eventvwr快速打开)。
下载地址:https://www.microsoft.com/en-us/download/details.aspx?id=985


建议直接解压到自己的用户目录,随时打开命令行就可以跑,下面以激活场景错误0x80070424为例,一般主要看winerror.h的信息,看到描述是服务不存在:


C:\Users\Administrator>err 80070424
# as an HRESULT: Severity: SUCCESS (0), Facility: 0x4c5, Code 0xc718
# as an HRESULT: Severity: FAILURE (1), Facility: 0x7, Code 0x424
# for hex 0x424 / decimal 1060 : RMON_RESTYPE_BAD_TABLE clusvmsg.h SQL_1060_severity_15 sql_err
# The number of rows in the TOP clause must be an integer. ERROR_SERVICE_DOES_NOT_EXIST winerror.h
# The specified service does not exist as an installed# service.# 3 matches found for "80070424"

核实Software Protection服务的状态(是否存在,是否被禁止,是否能成功启动),slmgr /dlv查询许可证信息是否有异常,产品密钥是否与系统版本一致。
Software Protection服务默认启动类型是自动(延迟启动)。


5a7a72e92acf83ee7d8cb0e864bdf20233efc810

注册表项HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\sppsvc是否正常:


1545e652b2125375c21f385dc23c643a6fed9cd3

slmgr /dlv示例,我们可以获取激活相关的不少信息,同时“部分产品密钥”对应的是产品密钥最后五个字符

f839ce11660d12be277c6eb68278f04810503fbd

在这之前可以通过Google或者Bing快速检索一下相关报错,个别DLL文件或者权限引发的问题可能比较典型,如果有相关文章和论坛记录,我们参考进行DLL文件重新注册以及权限修改。如果仍然没有什么线索,通常需要利用微软sysinternals工具集中procmon(Process Monitor)来复现问题发掘具体问题点了。

下载地址:
https://docs.microsoft.com/en-us/sysinternals/downloads/procmon

步骤是 procmon开启捕获(Ctrl+E)-> 复现问题 -> 停止捕获(Ctrl+E),保存文件后进行筛选(Ctrl+L) ,怀疑问题出在sppsvc.exe这边,可以参考以下过滤器的添加筛选:


a68ef16cdbeada810a9dde7a84d9631b1d8789e2

以上筛选出现Access Denied的情况,如果没有Access Denied的情况,我们也可以排除结果是Success的情况进一步分析。


一般来说,尝试修复问题的方法包括但不限于以下一些:

1. 解决网络问题

2. slmgr /skms重新设置KMS服务器。

3. slmgr /rilc重新安装许可证。

4. slmgr /upk后slmgr /ipk <product key>重新安装产品密钥。

5. 重启Software Protection服务。

6. 修复注册表。

备份sppsvc注册表项,找到相同版本操作系统,导出HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\sppsvc,拷贝并导入到问题系统,之后重启服务器。


7. sfc /scannow尝试修复并查看%windir%\Logs\CBS\CBS.log核实修复日志。

参考微软官方文档:

https://support.microsoft.com/zh-cn/help/929833/use-the-system-file-checker-tool-to-repair-missing-or-corrupted-system

8. 修复或重置WMI(一般多为8004开头的报错,不建议操作,可能导致其他问题)。

验证和修复:
winmgmt /verifyrepository
winmgmt /salvagerepository
重置:
winmgmt /rebuildrepository

9. 根据定位的Access Denied文件修改相应的文件和路径权限。

10. 回滚和重新初始化系统盘。

此方法作为最终办法,重新初始化系统盘相当于重装系统,系统盘用户数据会被清除,所以操作前请务必备份。

重新初始化系统盘操作文档:

https://help.aliyun.com/document_detail/25449.html




具体案例


激活报错:0xC004C003,激活服务器确定指定的产品密钥被阻止。

20d81226b8d6533be9e46a1ca6ee053a6d9bdeb6


排查:

考虑产品密钥有问题,查询操作系统版本并导入正确的密钥:


84f3f04ec2e2458862c8830e44ee371021411e56


激活报错找不到产品密钥。或者报错0xC004F050

d19ef6aac902e49e7d4910c3a007661099942458


排查:
slmgr /dlv对比产品密钥和系统版本并没有异常,重新安装产品密钥问题一样,考虑服务存在异常,重启Software Protection服务后问题解决。

激活报错:0xC004F074 软件授权服务报告无法激活该计算机。密钥管理服务(KMS)不可用。


e80b52b2159309616e07b6064db7a661106a447b


排查:
- 实际测试telnet KMS服务器1688端口是通的,对比同地域其他测试服务器能正常激活。
- 重新指定并重试激活依然报错。
- 重启Software License Service问题依旧。
- 鉴于提示KMS服务不可用,说明与之相关的服务或者系统文件存在异常或者被破坏。进一步核实发现存在病毒文件。为了快速恢复系统,备份数据后操作重新初始化系统盘。

*杀毒软件也可能导致类似的问题,另外以下报错也很可能与病毒或者安全软件有关。


7bee57d285b3e312e20ebf6d9681bc42e2b1c3c5


跑任何slmgr命令都直接报VBScript运行时错误并提示没有权限,错误码800A0046


7705d470d7a436bf477eff00c616eafa79341ffb


排查:
跑slmgr命令出现VBScript运行时错误一般可以排除sppsvc.exe相关问题,因为一开始是wscript.exe在加载相关文件来运行脚本。根据报错不一定好定位问题,非Access Denied的报错建议先检索Bing和Google。
上述报错需要通过Process Monitor获取具体Permission Denied的位置,之后通过修改权限或者替换文件的方式修复。

*Software Protection服务报Access Denied/Permission Denied情况,方法类似,例如下图服务无法启动的情况。


ca128a56fc0453d25f790ca1185b1a809993d71a

*类似情况报Access Denied多跟%windir%/system32/spp/store/<version>/data.dat 和 token.dat文件相关,slmgr /rilc操作不一定能成功重装许可证,可能需要通过手动删除两个文件再通过slmgr /rilc的方式修复。

参考链接:

微软KMS介绍:
https://technet.microsoft.com/zh-cn/library/ff793434.aspx
https://technet.microsoft.com/en-us/library/ff793419.aspx

微软官方博客排查文档:
https://blogs.technet.microsoft.com/askcore/2015/11/23/troubleshooting-activation-issues/

产品密钥:
https://technet.microsoft.com/en-us/library/jj612867.aspx

最后更新:2017-09-23 17:33:05

  上一篇:go  SDN技术的发展应用任重而道远
  下一篇:go  分享几个值得学习的NodeJS开源框架