2013-01-09 96 views
1

當我從命令行運行命令「msiexec/fm」時,我注意到某些HKLM註冊表項未被修復。同樣的事情發生在C++中,如下所示:「MsiReinstallProduct(ProductCode,REINSTALLMODE_REPAIR | REINSTALLMODE_MACHINEDATA);」MSI不修復某些註冊表項

情況是這樣的。我有一個必須註冊的COM DLL。此DLL的CLSID信息位於MSI註冊表中。在安裝過程中,MSI會將信息放入註冊表中。如果我手動刪除CLSID項並執行修復「msiexec/fm」,則註冊表項將被正確恢復。 Simlarly如果我手動更改註冊表中指向DLL的路徑,則MSI會將該字符串修復爲原始值。

有一個工作流程,密鑰不會被修復。如果我在機器上放置新版本的DLL以替換安裝時附帶的DLL,那麼MSI將不再修復CLSID密鑰。這就好像MSI正在決定不應該修復該密鑰,因爲DLL不一樣。我需要強制MSI修復來修復註冊表項,即使DLL已更改。

命令「msiexec/fdm」實際上會修復註冊表項,但它也會將文件更新回原始。在我的情況下,我有一個新的文件,因爲它安裝在一個服務包。我希望新文件保留,並且只修復註冊表項。

回答

2

我的猜測是DLL文件是保存註冊表項的組件中的關鍵成員。默認情況下,除非密鑰成員丟失,否則不會重新安裝該組件。您應該指定幾個標誌以確保組件重新安裝被觸發。例如。/fpem

http://technet.microsoft.com/en-us/library/cc759262(v=ws.10).aspx#BKMK_Repair

+0

是的,你是正確的,我可以給喜歡/ FDM和密鑰將被恢復選項。我有一個要求,不要重新安裝源.msi文件中的任何文件。如果我給出像你所建議的選項那麼文件將被覆蓋,這不是我想要的。在這種情況下,該機器有一個新的DLL,因爲該DLL是在一個服務包(基本上只是原來的覆蓋)交付。我希望新文件保留,但更新了破壞的註冊表路徑。我會在上面更新我的問題。 – user1882841

+0

我可以將.msi文件中的註冊表和文件分隔到.msi中的不同組件中嗎?如果我這樣做了,那麼即使文件仍然存在,我還是希望能夠修復密鑰? – user1882841

+0

是的,你可以。註冊表項可以是組件中的關鍵成員。 – Ciprian