Windows基础排查之一 - 激活-阿里云开发者社区

开发者社区> 尘轩> 正文

Windows基础排查之一 - 激活

简介: Windows KMS激活基本原理、排查以及案例分析
+关注继续查看

前言


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

基本原理


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


How KMS Works

KMS activation requires TCP/IP connectivity. By default, KMS hosts and client computers use DNS to publish and find the KMS service. The default settings can be used, which require little to no administrative action, or KMS hosts and client computers can be manually configured based on network configuration and security requirements.


KMS Activation Renewal

KMS activations are valid for 180 days—the activation validity interval. To remain activated, KMS client computers must renew their activation by connecting to the KMS host at least once every 180 days. By default, KMS client computers attempt to renew their activation every seven days. If KMS activation fails , the client will retry every two hours. After a client computer’s activation is renewed, the activation validity interval begins again.


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


这里提到了两个角色:


KMS Host

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


KMS Client

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

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

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

排查分析


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


Slmgr.vbs

部分版本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,作为统一管理许可证和激活相关操作的接口,提供一系列参数来执行各种操作。


*slmgr.vbs有操作系统版本的差别,不要在不同版本系统中拷贝使用。


具体命令参数请参考:

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


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


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

Sppsvc.exe

对应路径是%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。

二、排除KMS服务器问题

首先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


*排查系统问题,请务必先做好快照备份。

具体案例


问题1:

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

20d81226b8d6533be9e46a1ca6ee053a6d9bdeb6


排查:

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


84f3f04ec2e2458862c8830e44ee371021411e56


问题2:

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

d19ef6aac902e49e7d4910c3a007661099942458


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

问题3:

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


e80b52b2159309616e07b6064db7a661106a447b


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

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


7bee57d285b3e312e20ebf6d9681bc42e2b1c3c5


问题4:

跑任何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

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Apache Flink 零基础入门(五):流处理核心组件 Time&Window 深度解析
为什么要有 Window; Window 中的三个核心组件:WindowAssigner、Trigger 和 Evictor;Window 中怎么处理乱序数据,乱序数据是否允许延迟,以及怎么处理迟到的数据;最后我们梳理了整个 Window 的数据流程,以及 Window 中怎么保证 Exactly .
790 0
Apache Flink 零基础入门(五):流处理核心组件 Time&Window 深度解析
为什么要有 Window; Window 中的三个核心组件:WindowAssigner、Trigger 和 Evictor;Window 中怎么处理乱序数据,乱序数据是否允许延迟,以及怎么处理迟到的数据;最后我们梳理了整个 Window 的数据流程,以及 Window 中怎么保证 Exactly
3208 0
快速构建Windows 8风格应用18-基础控件I
原文:快速构建Windows 8风格应用18-基础控件I 本篇博文主要介绍Windows 8风格应用开发中常用的几种基础控件。 ProgressRing: ProgressRing控件常见的效果图: 如何在XAML代码中声明ProgressRing控件呢?代码如下: ProgressRing控件包含IsActive属性,该属性控制ProgressRing控件是否激活可用。
579 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
3956 0
windows激活失败之slmgr命令以记事本打开
【问题现象】 【问题根因】微软激活所需的命令是slmgr.vbs这个文件,但是这个文件打开方式是记事本,因此在激活的时候输入命令会直接弹出记事本,导致激活失败。 【解决方案】查看slmgr.vbs的打开方式,与正常的操作系统做对比,可以发现文件的打开方式异常: 一些情况下通过调整打开方式可以解决...
884 0
EDAS 基础排查
案例:应用发布失败 jvm crash 1) 先看下发布失败应用对应的变更记录发现发布应用失败是因为卡在了健康检查失败。健康检查的 URL 必须是返回 200 的才可以,通过报错可以知道后端的 tomcat 返回了 502。
2054 0
+关注
尘轩
Make full use of the CLOUD
6
文章
0
问答
来源圈子
更多
作为全球云计算的领先者,阿里云为全球230万企业提供着云计算服务,服务范围覆盖200多个国家和地区。我们致力于为企业、政府等组织机构提供安全可靠的云计算服务,给用户带来极速愉悦的服务体验。
+ 订阅
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载