905
技術社區[雲棲]
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服務默認啟動類型是自動(延遲啟動)。


slmgr /dlv示例,我們可以獲取激活相關的不少信息,同時“部分產品密鑰”對應的是產品密鑰最後五個字符。
在這之前可以通過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這邊,可以參考以下過濾器的添加篩選:

以上篩選出現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-system8. 修複或重置WMI(一般多為8004開頭的報錯,不建議操作,可能導致其他問題)。
驗證和修複:
winmgmt /verifyrepository
winmgmt /salvagerepository
重置:
winmgmt /rebuildrepository
9. 根據定位的Access Denied文件修改相應的文件和路徑權限。
10. 回滾和重新初始化係統盤。
此方法作為最終辦法,重新初始化係統盤相當於重裝係統,係統盤用戶數據會被清除,所以操作前請務必備份。
重新初始化係統盤操作文檔:
https://help.aliyun.com/document_detail/25449.html
具體案例
激活報錯:0xC004C003,激活服務器確定指定的產品密鑰被阻止。

排查:
考慮產品密鑰有問題,查詢操作係統版本並導入正確的密鑰:

激活報錯找不到產品密鑰。或者報錯0xC004F050

排查:
slmgr /dlv對比產品密鑰和係統版本並沒有異常,重新安裝產品密鑰問題一樣,考慮服務存在異常,重啟Software Protection服務後問題解決。
激活報錯:0xC004F074 軟件授權服務報告無法激活該計算機。密鑰管理服務(KMS)不可用。

排查:
- 實際測試telnet KMS服務器1688端口是通的,對比同地域其他測試服務器能正常激活。
- 重新指定並重試激活依然報錯。
- 重啟Software License Service問題依舊。
- 鑒於提示KMS服務不可用,說明與之相關的服務或者係統文件存在異常或者被破壞。進一步核實發現存在病毒文件。為了快速恢複係統,備份數據後操作重新初始化係統盤。
*殺毒軟件也可能導致類似的問題,另外以下報錯也很可能與病毒或者安全軟件有關。

跑任何slmgr命令都直接報VBScript運行時錯誤並提示沒有權限,錯誤碼800A0046

排查:
跑slmgr命令出現VBScript運行時錯誤一般可以排除sppsvc.exe相關問題,因為一開始是wscript.exe在加載相關文件來運行腳本。根據報錯不一定好定位問題,非Access Denied的報錯建議先檢索Bing和Google。
上述報錯需要通過Process Monitor獲取具體Permission Denied的位置,之後通過修改權限或者替換文件的方式修複。
*Software Protection服務報Access Denied/Permission Denied情況,方法類似,例如下圖服務無法啟動的情況。

*類似情況報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