閱讀905 返回首頁    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開源框架