3 回答

TA貢獻2012條經驗 獲得超12個贊
自修復,簡單簡短解釋:如果刪除文件,為什么MSI安裝程序會重新配置?
WiX / MSI文件的具體設計建議
我一直在嘗試為開發人員重復進行MSI自修復,但最終涉及的細節過多。這是我的最后嘗試:WiX / MSI文件中不執行操作的具體設計建議。
下面的答案提供了一個清單,用于解決任何供應商或來源提供的自我修復方案,而不僅僅是您自己的。查看上面鏈接的答案,以解決您自己的MSI封裝設計問題。
“簡短版本”-自我修復清單
為了永久和可靠地修復每個人的自我修復問題,開發人員和設置開發人員必須參與其中,因為真正的修復必須在供應商級別進行。
如果您在公司環境中,劣質的應用程序重新打包也可能導致自我修復問題,因此,您應讓應用程序包裝商與他們聯系,以確定問題是否出在供應商身上。
系統管理員必須知道他們在看什么,并且當沒有可用的修復程序時,請使用各種變通辦法來野外解決問題。甚至最終用戶也可以自己嘗試一些簡單的解決方法(請參閱第5節)。
自我修復問題的實質:
大多數自我修復問題與COM相關,并且針對供應商和開發人員有兩個常規修復:1)使用通常通過合并模塊部署的正確部署的共享COM庫,或2)使用無需注冊的COM來“屏蔽”您的自我修復和兼容性問題的應用程序。
您的安裝開發人員可以實施合并模塊修復,開發人員必須進行測試。合并模塊是用于共享文件的標準化共享部署庫。
免注冊COM 僅在我的經驗中與開發人員合作。如果開發人員需要使用特定版本的COM文件(無論出于何種原因),則此選項特別相關。詳情請參閱下文的5.4節。
除了COM之外,還可以通過讓安裝開發人員在MSI設置中注冊文件和MIME關聯以及命令動詞來引起自我修復問題。請謹慎使用,并確保您的文件/ MIME關聯是唯一的。
最后,兩個已安裝的MSI文件之間的任何文件沖突或注冊表沖突都可能導致自我修復。他們“ 錯誤地共享資源 ”,并將其視為自己的資源-爭奪解決沖突之前。
某些自我修復問題根本不是由供應商應用程序或安裝程序中的錯誤引起的,而是由相關計算機環境中的外部因素引起的,例如,來自修補用戶,腳本,病毒,防病毒軟件或安全軟件的干擾。有關更多詳細信息,請參見第3節。
處理問題應用程序的快速選項
如果您確定所看到的自我修復僅由MSI引起(而不是由下文前幾節所述的其他外部原因所致),則可以直接跳至第5部分以獲取建議的修復和解決方法的列表。
第5節中提出的大多數“解決方案”實際上都是系統管理員的技巧,不能解決根本的問題-如上所述,真正的解決方法必須來自供應商。例外是“ 5.4:無需注冊的COM”,它實際上可以幫助開發人員 “屏蔽”其應用程序免受自我修復問題。
如果你沒有在你的機器管理員權限建議您嘗試的“解決方案” 5.2,5.3或5.1(5.1通常需要管理員權限的嘗試,但它是不復雜)。這些是“ 快速解決方法 ”,其他則更多。如果這些解決方法不起作用,請讓您的管理員閱讀其他建議。
了解Windows Installer自我修復
在此之前,我已經寫了很長的篇幅,但是它過多地專注于理解問題,而不是為它實際找到可以接受的解決方案。您可以在此處閱讀有關自我修復問題的完整說明:如何確定導致Windows Installer自我修復重復的原因?。
解決Windows Installer自我修復問題
要真正解決反復無休止的自我修復,您可以嘗試以下第5節中的建議-以復雜性和難度遞增的順序。在執行此操作之前,您應該驗證自我修復問題的真正根源是什么。它可能不是由MSI文件引起的,而是由其他外部原因引起的(例如腳本或用戶刪除文件或防病毒阻止文件)。
如果問題確實與MSI相關,則可以嘗試禁用廣告的快捷方式和COM插件,使用無需注冊的COM,從應用程序供應商處獲取幫助,卸載有問題的應用程序,虛擬化軟件包或完全破解已緩存的MSI數據庫和注冊表(不推薦,只有在專家的幫助下才有可能)。這完全取決于您的情況。如果腳本等外部原因有誤,則必須消除這種干擾。請參閱下面的詳細信息-只需遵循清單即可。
解決問題的第一步是確定問題確實存在于您的平臺上,然后首先確定哪些應用程序觸發自我修復:
1. 確認問題確實存在于您的環境中。
這是一般總是能夠以弄清楚是怎么回事,使有問題的自我修復,并有幾個可行的解決方法,可以被利用來處理這個問題。但是,并非總能找到一個好的永久性修復程序(沒有供應商的幫助-如下所述)。
因此,如果你是系統管理員試圖找到你的自我修復問題的解決辦法,或許是確保問題被認為是在多臺計算機上-特別是如果這個問題被認為是一個對開發人員,QA-甚至測試電腦。
如果您僅在一臺計算機上看到自我修復問題,則另一種方法可能是重建有問題的計算機。有效地消除而不是“解決”問題。但是,您可能再次遇到該問題的風險相對較高。如果您問我,不要重建,那不是解決方案-但我想在現實世界中往往會做些什么。
要知道,一個AD-廣告MSI安裝是安裝速度慢和用戶不斷得到中止,可以“看起來像”自我修復問題的桌面支持,但預計MSI的行為。允許安裝一次完成(可以更改安裝程序進度欄以禁用取消按鈕-類似于
msiexec.exe /I "MyApp.msi" /QB-!
進度條,僅沒有取消按鈕且最后沒有模式對話框)。
2. 確定造成自我修復的罪魁禍首。
這是可能的一個單一的應用程序,以使自身的問題,但通常至少有兩個應用程序沖突(它們共享錯誤一些資源)。
通常,可以在發生自我修復的系統上的事件查看器中找到自我修復的觸發器。請按照以下步驟打開事件查看器:
右鍵單擊“我的電腦”
點擊管理
如果收到UAC提示,請單擊“繼續”。
轉到“事件查看器”部分,然后檢查Windows日志
確定在問題的應用程序Windows事件日志,通過查看“ 應用程序部分的事件日志”,你應該找到從事件源“警告MsiInstaller ”與編號1001和1004。
您可以在以下更詳盡的答案中找到有關如何執行此操作的更多詳細信息:如何確定導致Windows Installer重復自我修復的原因?。在“ 查找自我修復的觸發因素或罪魁禍首 ”部分中查找。
您也可以嘗試從咨詢獨立部署專家,MSI-專家和MVP斯特凡·克魯格。他有一篇關于同一自我修復問題的文章。他至關重要地討論了實際的事件日志條目及其含義。請在此處閱讀有關實際調試過程的信息。
3. 驗證外部非MSI原因不是引起問題的原因
任何手動或自動刪除文件或注冊表設置的操作都可以觸發MSI自修復。尤其是在您要刪除用戶個人資料或注冊表的HKCU部分中的內容時。
在大多數情況下,此類觸發器只會導致運行一次自我修復,然后問題得以解決(這是應該進行自我修復并為用戶提供幫助的方式)。允許自我修復運行一次,然后再次啟動應用程序以測試問題是否消失。應該是這樣,并且您的應用程序應該從現在開始正確啟動。
特殊情況:具有諷刺意味的是,有時您可以通過重命名HKCU應用程序密鑰(在注冊表的用戶部分中)來修復損壞的應用程序,以實際上強制自我修復在用戶配置文件中運行并安裝該應用程序的默認數據-如果該數據是偶然的已刪除(此修復程序通常在終端服務器上不起作用)。
如果同一文件或注冊表項再次通過自動方式刪除并導致自我修復,則必須消除或更新引起該問題的自動過程,并且問題已解決,您可以停止閱讀。如果您自己再次手動刪除了文件,則可能會遇到內存不足的問題:-)。
總之,清理腳本,登錄腳本,清理應用程序或修補程序,活動過度的用戶都可能導致這種自我修復。
最終,病毒以及防病毒軟件(和其他安全軟件)會阻止對文件的訪問并觸發永遠無法成功進行的自我修復。
對于受感染的計算機,只需重建計算機即可。它將為您節省總體時間。
對于防病毒/安全軟件問題,請請安全人員來解決。在某些情況下(特別是誤報),他們可能需要與供應商聯系。
無論是與病毒還是與反病毒有關,請檢查http://www.virustotal.com上的有問題的文件,以確認它實際上是病毒還是假陽性(這可能是自我修復的更大問題)。
我個人已經看到了一些與防病毒/安全軟件有關的自我修復問題,但到目前為止還沒有真正的與病毒有關的問題。我猜病毒通常會感染核心系統文件而不是應用程序文件,并且核心系統文件不會由MSI文件部署(共享的系統文件可能包含在MSI文件中,而不包含在核心系統文件中)。
4. 與供應商(或您自己的包裝部門)聯系。
一旦確認自我修復問題是基于MSI的,而不是您自己的軟件,首先要嘗試的是與應用程序供應商聯系,并查看他們是否具有更新的安裝程序來消除該問題。
嘗試此選項非常重要,因為所有其他選項都是“變通辦法”,而不是真正的解決方案。只有通過更改供應商安裝程序以及可能的應用程序可執行文件才能永久完全解決該問題。
修補程序1:修補程序很簡單,只需讓供應商使用適當的共享“ 合并模塊 ” 刪除私下安裝但已全局注冊的COM文件,即可為所有人正確安裝運行時。這些應將COM文件正確安裝到共享位置,在此處可以進行全局注冊而不會產生副作用。準備好供大家使用。
修復2:如果供應商聲稱這是不可能的-那么他們應該能夠提供正確的無注冊COM安裝,并在主應用程序文件夾中安裝正確隔離的COM文件。他們還應隨時注意部署任何安全更新。
重要!:如果供應商使用正確的共享合并模塊來部署文件,或者使用無需注冊的COM提供隔離安裝,則該問題應為每個人永久解決。
該問題也可能是由其他問題引起的,但COM通常是罪魁禍首。有時清理他們的MSI安裝程序可以解決其他更晦澀的沖突。如果您知道一個好的應用程序包裝商,則他/她應該能夠快速識別沖突(并為供應商提供反饋)。
請注意,自我修復也可能是由供應商軟件的錯誤(內部)重新包裝引起的。在這種情況下,您可以通過自己的打包/部署部門提供的更新來修復自己的軟件包(在大多數情況下,他們肯定應該能夠實現此目的)。這實際上是一個非常普遍的問題。
5. 選擇一種“解決方法”或解決此沖突情況。
如果供應商不提供固定的安裝程序包,則需要找到“替代方法”來解決這種情況。有多種選擇,在探究過多的復雜性之前,應嘗試一些“ 快速解決方法 ”。以下是一些解決問題的建議,以提高難度和復雜度的順序:
如果問題對于您的桌面環境非常嚴重,并且以上選項均無效,則可以嘗試在Windows Installer級別解決此問題。如果外接程序(或任何其他軟件)對于在公司的主PC環境中可用至關重要,則可能是值得的。
本質上,您需要做的是從系統緩存的MSI和/或注冊表中刪除有問題的條目(禁用廣告的入口點,例如廣告的快捷方式,COM注冊,文件關聯,MIME關聯或命令動詞等)。
這涉及很多,不是很好的做法,并且有一些副作用(如卸載,彈性等),但這是我所知道的唯一的“最后手段”。
在這些情況下,建議您與部署/ Windows Installer專家聯系,并讓他們分析是否可以進行“修復”。它可以工作,但不要指望奇跡。
如果您堅持自己進行調試,則需要掌握一種工具來打開系統上的緩存MSI文件(例如Orca,Installshield,Advanced Installer或類似文件),并且需要“破解”數據庫-不推薦。
除了卸載或禁用組件外,最簡單的解決方法可以說是使用虛擬化來“隔離”發生沖突的應用程序。如果仍然需要將應用程序放在主SOE(標準操作環境)上,則可以嘗試使用虛擬部署程序包(APP-V)。這是一個基本上按需安裝(在啟動時)并運行“沙盒”或與系統中其他應用程序隔離的應用程序。
您還可以通過VMWare或Microsoft Virtual PC等系統使用虛擬機,以在其自己的操作系統中運行有問題的應用程序。人們在使用虛擬機時通常具有管理員權限,但不在其主SOE系統(主工作站)上。許多開發人員應用程序更有效地使用管理員權限,因此在與開發團隊及其需求打交道時,此解決方案可能特別有用。
可以說,該解決方案比虛擬化(在下一個要點中進行介紹)要復雜得多,但是我將其放在此處,因為它可能是某些人的首選。
免注冊COM是我很少使用的東西,但是據說它是一種可行的解決方案:為免注冊COM生成清單文件。這實際上繞過了注冊表,并激活了由放置在應用程序可執行文件旁邊的清單文件控制的COM文件的私有副本-有效地保護了應用程序免受COM注冊表干擾(理論上)。“所有事情都發生在同一文件夾中”。
您的內部包裝部門也許可以使用它來處理“困難的供應商包裝”,以“隔離”他們的問題。但是,我不相信無需注冊的COM就能在原始解決方案開發人員做出一些其他應用程序調整的情況下正常工作,但是我缺乏經驗數據來支持它。如果它是具有可用源的內部應用程序,請對其進行測試(并告訴我們)。
我的主要問題這種方法,就在于它打開了潛在的安全漏洞(也永遠不會被微軟補丁的COM文件傳抄),如果不確保隔離組件自己更新。更新也可能會導致很多清單重寫工作(但是這些舊的COM文件是否仍會更新嗎?)
請注意,至少從理論上講,無注冊COM可以用于所有與COM相關的沖突,無論它們是VB6可執行文件,使用COM的VC ++應用程序,等等。 COM插件(dll)和VBA表單。
這似乎是關于無注冊COM的MSDN更好的文章之一:https : //msdn.microsoft.com/en-us/library/ms973913.aspx(甚至還有帶有示例的可下載MSI-其中具有諷刺意味的是,啟動時似乎觸發了我一個錯誤。
就我個人而言,我可能寧愿嘗試使用APP-V來嘗試虛擬軟件包,而不是嘗試使用無需注冊的COM(請參閱下一個要點)。
需要重申的是,與其“屏蔽”自己的應用程序,不如說正確的供應商修補程序是停止部署在系統范圍內錯誤注冊的共享COM文件的私有副本,并使用適當的合并模塊按計劃開始安裝它們。部署。
如果您的問題涉及到的加載插件(用于Outlook,Excel和Word或其他應用程序,如AutoCAD或類似的),那么有沒有捷徑可調整-該插件加載上推出了其“宿主應用程序”的。
最簡單的嘗試是在有問題的應用程序(通常是Outlook,Excel或Word或類似的應用程序)的“插件”對話框中禁用不需要的任何插件,然后查看是否可以解決問題。在某些情況下,您只是禁用了用戶最初從未使用過的COM加載項,因此問題已消除。
而且,很顯然,還嘗試禁用您實際需要的插件,以便檢查問題是否可能與其加載有關。如果外來元兇是罪魁禍首,則應繼續檢查清單中的下一個提議的解決方案(下一個要點)。
我應該重申,首選解決方案是供應商提供的修復程序(大多數情況下,它將涉及使外接程序正確使用所涉及的最新的共享ActiveX / OCX控件-但是,其他外接程序仍可能觸發問題。您可能最終會與多個供應商打交道-通常會互相指責)。
為了公平起見,如果您使用的是公司計算機,則問題也可能是由于公司應用程序重新包裝不正確而引起的。然后,您必須與包裝部門聯系以尋求修復。
嘗試使用的Windows Installer的第一種解決方法是刪除“ 廣告的快捷方式 ”(本質上是一種特殊類型的快捷方式,它指向Windows Installer應用程序功能,而不直接指向可執行文件或文件)。閱讀Symantec的鏈接文章,以了解有關宣傳的快捷方式的詳細信息。
然后,您重新創建一個常規快捷方式,該快捷方式直接指向相關的可執行文件。這將“繞過”最常見的自我修復觸發器(所宣傳的快捷方式)。在某些情況下,這避免了整個自我修復問題。值得一試。
請注意,即使這似乎可以立即解決,但在您在應用程序內部進行操作時(例如,當您打開特定表單時)自我修復可能仍會重新出現。您需要與實際積極使用該應用程序的某些用戶“試用”此修補程序,以確保它對您的環境而言是足夠好的解決方法。
您還只是消除了問題的征兆,即引起它的注冊表或文件沖突僅被“繞過”或“沉默了”-仍然存在,但是如果應用程序在運行期間沒有出現問題,這可能就足夠了。
實際上,有一種方法可以在安裝任何MSI軟件包時禁用所有公告的快捷方式。設置屬性DISABLEADVTSHORTCUTS(以鏈接中描述的一種方式),然后所有快捷方式都將創建為常規快捷方式,并且不會觸發自我修復。至少有兩個問題:
請注意,可以在任何位置創建快捷方式,包括在特殊文件夾(如“啟動”文件夾)中。此特定位置意味著可以在系統啟動時自行觸發自我修復(無需用戶交互)。
使用MSI查看器工具并打開系統緩存的MSI,并檢查其“快捷方式”表以查找所有快捷方式。為了找到所有緩存包的列表,您可以嘗試以下答案:如何找到已安裝的MSI安裝程序的產品GUID?(打開“ LocalPackage”中指定的程序包路徑)。
1)該軟件包可以設計為使用自我修復來安裝用戶配置文件或HKCU設置。在這種情況下,由于永遠不會運行自我修復,并且安裝實際上是不完整的,因此該數據將永遠不會按預期添加到系統中。
2)不能保證自修復不會繼續發生-因為它可以由其他公告的入口點觸發,例如COM調用,文件和MIME關聯以及命令動詞。
絕對最簡單的解決方法是找出哪些應用程序觸發了自我修復,然后將其卸載(如果這是您的環境可接受的解決方案)(很少是)。
如果有兩個(或多個)應用程序發生沖突,而其中一個很少使用或“可選”,則這是可以接受的。
您可以在虛擬機上運行問題應用程序(請參閱第5.5節)。對于非常“行為異?!钡膽贸绦颍@將是我的首選“解決方案”。所有問題都應消失,而無需任何實際調試(這是昂貴的)。
普通卸載是至少值得考慮的一個選項-某些軟件的問題可能不止一種,而應僅被拒絕使用。確保讓供應商知道該軟件也被拒絕。這可能是使他們認真對待問題的唯一方法。
5.1:只需卸載罪魁禍首。
5.2:刪除廣告快捷方式。
5.3:禁用COM插件(如果可能)。
5.4:嘗試免注冊COM
5.5:虛擬化(APP-V,虛擬機等)。
5.6:Windows Installer調整 -(僅適用于專家!)。
6. 總結與結論
我認為,第4步 - 與供應商聯系以尋求修復 -是唯一的“ 真正的修復 ”。
所有其他建議都試圖解決由供應商錯誤引起的問題,而不是提供持久的解決方案。
現實問題是,許多供應商往往互相指責,因此您可能會走運。一些做對的廠商確實遭受了其他廠商的設計錯誤。
提案5.1,5.2,5.3是不復雜的 “ 解決方法 ”。
應該安全地為每個人嘗試。
即使沒有管理員權限,建議5.2和5.3也應可以嘗試。
提案5.4 - 無注冊COM -是一個相當參與其中,潛在的“修復”。
可能需要開發人員參與才能找到所有“隔離”的相關文件。
以我的經驗,這種項目最終要花幾天的時間才能嘗試(即使在專家的幫助下),但并不能真正保證它最終會成功。
我聽到專家們相互矛盾的事情,有些成功了,有些說失敗了。有權使用解決方案源的人們似乎成功了。
我個人不喜歡它帶來的潛在安全漏洞,并且要部署的任何新文件版本都可能意味著新一輪的清單重新創作(我相信)。
但是,現在有問題的COM文件太舊了,以至于它們不太可能會看到對它們所做的任何安全更新。我想現在這些COM對象主要用于.NET互操作。
提案5.5- 虛擬化 - 如今是一種常見的選擇,如果環境中可用,應該在5.4之前嘗試。俗話說,“ 認真虛擬化 ”。
老實說,我不知道(缺乏經驗)虛擬化是否適用于(辦公室)插件。如果可以確認,請更新。
可執行文件絕對可以虛擬化。
提案5.6- “ 緩存的MSI調整 ”-是一種“ hack ”,如果由部署專家正確完成,則可以“足夠好”地工作。
有一些“ 副作用 ”,特別是對于卸載 -以及“彈性”,但是如果操作正確,則應該可以控制。
這是“現實世界”-沒有什么是“干凈的”。

TA貢獻1934條經驗 獲得超2個贊
您的包裝內一定有問題。尋找問題。
清除事件日志-應用程序。
使用AdminRigths以用戶身份運行您的應用程序
應用程序應在自我修復后運行。您可以運行兩次,如果不出現自我修復,則在第二次運行后,這意味著要在MachinePart中創建條目的組件存在問題,例如HKLM或Programfiles或Windows文件夾。
打開事件日志,并使用源MSIInstaller查找條目。
帶有警告的條目將為您提供信息,說明哪些功能和組件會引起自我修復。
如果您可以在此處顯示該warinig的日志,我們可以告訴您更多有關您的問題的信息,但總的來說,eventviewer中的消息很清楚,并指出缺少哪些資源。
- 3 回答
- 0 關注
- 1261 瀏覽
添加回答
舉報