錯(cuò)誤1402,無法打開注冊(cè)表項(xiàng)UNKNOWN\Components故障原因,及Install Clean Up原理剖析
很多人遇到windows安裝程序msi安裝包類型的軟件錯(cuò)誤時(shí),喜歡用Windows Install Clean Up解決。
但這個(gè)軟件存在一個(gè)缺點(diǎn),就是會(huì)導(dǎo)致“錯(cuò)誤 1402。無法打開注冊(cè)表項(xiàng):UNKNOWN\Components”。

原因是Windows Install Clean Up把注冊(cè)表項(xiàng):
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Components
里某些子項(xiàng)的所有者改成SYSTEM,并刪除了所有控制權(quán)限,從而導(dǎo)致了這個(gè)故障。
解決方法比較簡單,用NSudo軟件啟用全部特權(quán)運(yùn)行regedit,將Components的所有者和控制權(quán)限替換所有子對(duì)象。
故障原因和解決方法說過了,下面來介紹下Windows Install Clean UP原理。
Windows Install Clean Up只是一個(gè)枚舉msi軟件的工具,實(shí)際完成刪除軟件功能的是msizap.exe。
Install?Clean Up的功能類似下面vbs代碼:
Set objShell = Wscript.CreateObject("Wscript.Shell")
Set objWindowsInstaller = Wscript.CreateObject("WindowsInstaller.Installer")?
Set colProducts = objWindowsInstaller.Products?
For Each product In colProducts?
strProductName = objWindowsInstaller.ProductInfo (product, "ProductName")
msgbox product+" "+strProductName
Next
枚舉出ProductCode和對(duì)應(yīng)的ProductName,當(dāng)用戶選中ProductName刪除時(shí),工具調(diào)用msizap.exe執(zhí)行下面兩個(gè)命令:
msizap.exe TAW! ProductCode
msizap.exe TW! ProductCode
導(dǎo)致1402錯(cuò)誤的是第一條命令的A參數(shù)。雖然Windows Install Clean Up用了很舊的msizap.exe版本,但是我測(cè)試過用SDK v7.1A自帶的msizap替換也會(huì)導(dǎo)致一樣的錯(cuò)誤,除非去掉A參數(shù)。
ProductCode除了用上面vbs那種com組件枚舉外,還可以用MsiEnumProducts等Win32 API枚舉,或者powershell的Get-WmiObject -class?Win32_Product。又或者是注冊(cè)表項(xiàng)HKEY_CLASSES_ROOT\Installer\Products等地方的子項(xiàng)轉(zhuǎn)換而來。
舉個(gè)例子:
HKEY_CLASSES_ROOT\Installer\Products\FEC5EBE9E06E2C33A8922EF94F2F9386
把FEC5EBE9E06E2C33A8922EF94F2F9386按序號(hào)0-31標(biāo)記:
按下面序號(hào)重新組合:
“7,6,5,4,3,2,1,0,11,10,9,8,15,14,13,12,17,16,19,18,21,20,23,22,25,24,27,26,29,28,31,30”
得到ProductCode:{9EBE5CEF-E60E-33C2-8A29-E29FF4F23968}

就扯這么多,剩下有興趣的自己研究。