共用方式為


Windows Installer 最佳做法

本節列舉連結至主要 Windows Installer SDK 檔的秘訣列表,以協助應用程式開發人員、安裝作者、IT 專業人員和基礎結構開發人員探索使用 Windows Installer 的最佳做法:

更新 Windows Installer 版本。

  • 在 Windows Server 2008 R2 和 Windows 7 上使用 Windows Installer 5.0。 這是操作系統所提供的 Windows Installer 版本。
  • 在 Windows Server 2008、Windows Server 2003 搭配 Service Pack 1(SP1)、Windows Vista Service Pack 1 (SP1) 或 Windows XP 搭配 Service Pack 2 (SP2) 上使用 Windows Installer 4.5。 如需取得最新 Windows Installer 版本的相關信息,請參閱 Windows Installer 可轉散發套件
  • 在 Windows 2000 上搭配 Service Pack 3 (SP3) 使用 Windows Installer 3.1。 Windows Installer 3.1 版的功能有助於改善應用程式服務和 修補
  • 許多重要的功能是引進 3.0 版,並列在 Windows Installer 2.0 版不支援的章節中。 您可以使用 Windows Installer 3.0 和更新版本來安裝針對 Windows Installer 2.0 建立的安裝套件和更新。 包含 Windows Installer 3.0 所用新數據表的修補程式套件仍可使用舊版 Windows Installer 來套用,但不含 Windows Installer 3.0 修補功能。 您也可以撰寫明確要求舊版 Windows Installer 無法套用的 Windows Installer 3.0 修補程式。 如果使用者無法更新安裝程式版本,請確定您的應用程式或更新與 Windows Installer 的未來更新相容。
  • 如需舊版 Windows 安裝程式不支援的 Windows Installer 功能清單,請參閱 Windows Installer 的新功能。

符合 Windows 標誌認證需求。

  • 即使您不打算將應用程式提交至標誌計劃,遵循標誌認證指導方針也有助於讓您的 Windows Installer 套件變得更好。 如需標誌需求的概觀,以及特定標誌認證計劃的連結,請參閱 Windows Installer 和標誌需求

準備套件以進行當地語系化。

  • 撰寫原始安裝套件時,最好為未來的當地語系化做好準備。 您可以在本地化 Windows Installer 套件遵循建議的套件當地語系化程式。

更新您的 Windows Installer 開發工具和檔。

  • Windows Installer 開發工具無法轉散發,而且您應該只使用可從 Microsoft取得的這些工具版本。 這些適用於 Windows Installer 開發人員 的 Windows SDK 元件可在 Microsoft Windows 軟體開發工具包 (SDK) 中使用。
  • 數個獨立軟體廠商提供工具來建立或修改 Windows Installer 套件。 這些工具可以提供套件撰寫環境,可能比 Windows Installer SDK 中提供的工具更容易使用。 您可以從其他 Windows Installer 資訊來源中討論的資訊資源深入瞭解這些工具。
  • 從文本檔建置套件的功能對於某些開發人員來說可能更直覺。 Sourceforge.net 上提供的 Windows Installer XML (WiX) 工具組會從 XML 原始碼建置 Windows 安裝套件。
  • Windows Installer SDK 中的文件最常更新。
  • 使用 Windows SDK 元件中適用於 Windows Vista 或更新版本的 Windows Installer 開發人員版中提供的最新版本Msizap.exe(3.1.4000.2726 版或更新版本)。 較舊版本的Msizap.exe可以移除已套用至用戶電腦上其他應用程式之所有更新的相關信息。 如果移除這項資訊,可能需要移除並重新安裝這些其他應用程式,才能接收其他更新。
  • 資料庫數據表編輯器 Orca.exe 是用來建立和編輯 Windows Installer 套件和合併模組的資料庫數據表編輯器。 它具有基本的 GUI 介面,但支援進階編輯 Windows Installer 資料庫。 即使您使用另一個應用程式作為主要開發工具,在疑難解答和測試套件時,仍可能會發現使用Orca.exe很方便。
  • 如需部落格、技術聊天、新聞群組、技術文章和網站中提供的最新 Windows Installer 資訊,請參閱 其他 Windows Installer 資訊 的來源。

如果您決定重新封裝舊版安裝應用程式,請遵循良好的重新封裝做法。

許多應用程式廠商提供安裝或其產品的原生 Windows Installer 套件。 將現有舊版安裝應用程序轉換成 Windows Installer 套件的軟體稱為重新封裝工具。 重新封裝現有的安裝應用程式不是最佳開發作法。 從一開始就設計來利用 Windows Installer 功能的應用程式,可以讓使用者更輕鬆地安裝及服務。 如果您決定使用重新封裝軟體,下列做法可協助您產生更好的 Windows Installer 套件。

  • 重新封裝工具會將舊版安裝轉換成 Windows Installer 套件,方法是在安裝前後拍攝預備系統的照片。 任何在擷取程式期間發生的登錄變更、檔案變更或系統設定都會包含在安裝中。 設定計算機的硬體與軟體,以盡可能接近預定用戶的系統重新封裝安裝。 為每個不同的硬體元件建立個別的套件。 使用乾淨的預備電腦重新封裝。 拿掉任何不必要的應用程式。 停止所有不必要的進程。 關閉所有非基本系統服務。
  • 在開始處理之前,請一律製作原始安裝的複本。 一律在複本上運作。 在完成建置套件之前,請勿停止重新封裝。 如果重新封裝程式損毀套件,您仍然會有原始套件。
  • 請勿將Microsoft軟體更新重新封裝到 Windows Installer 套件中。 Microsoft發行軟體更新,例如 Service Pack,作為自動執行安裝的自我解壓縮檔案。 這些更新會使用與 Windows Installer 不同的安裝程式來取代受保護的 Windows 資源,而且無法轉換成 Windows Installer 套件。 如需如何部署 Windows Service Pack 的資訊,請參閱 TechNet Microsoft 上的 Service Pack 部署指南。
  • 請勿使用重新封裝工具來將 Windows Installer 套件轉換成新的套件。 Windows Installer 會將組態資訊新增至系統和應用程式資源。 當重新封裝工具在安裝前後比較系統時,重新封裝工具會錯誤解譯設定資訊做為應用程式的一部分。 這通常會損害重新封裝的應用程式。 請改用 自定義轉換 來修改現有的 Windows Installer 套件,或建立新的套件。 您可以使用 Msitran.exe 工具來建立自訂轉換
  • 請勿使用重新封裝工具來將數個 Windows Installer 套件合併成單一套件。 相反地 ,您可以使用Msistuff.exe 工具來設定Setup.exe啟動程式可執行檔,以一個接一個地安裝套件。
  • 讓您的 Windows Installer 套件可供客戶輕鬆自定義。 Windows Installer 在安裝期間使用的全域變數可以使用公用 屬性自定義轉換來設定。 針對所有可自定義的值,提供使用這些屬性和實際預設值的檔。 如需取得和設定屬性的相關信息,請參閱 使用屬性。 如需自定義轉換的範例,請參閱 自定義轉換範例

請勿嘗試取代受保護的資源。

Windows Installer 套件不應該嘗試在安裝或更新期間取代受保護的資源。 Windows Installer 不會移除或取代這些資源,因為 Windows 會防止取代必要的系統檔案、資料夾和登錄機碼。 保護這些資源可防止應用程式和操作系統失敗。

  • 在 Windows Server 2008 或 Windows Vista 上執行時,Windows Installer 會略過由 Windows 資源保護 (WRP) 保護的任何檔案或登錄機碼安裝,安裝程式會在記錄檔中輸入警告,並繼續進行其餘安裝,而不會發生錯誤。 如需詳細資訊,請參閱 使用 Windows Installer 和 Windows 資源保護
  • WRP 是 Windows 檔案保護的新名稱(WFP)。 WRP 會保護登錄機碼和資料夾,以及基本的系統檔案。 在 Windows Server 2003、Windows XP 和 Windows 2000 中,當 Windows Installer 遇到受 WFP 保護的檔案時,安裝程式會要求 WFP 安裝檔案。 如需詳細資訊,請參閱 使用 Windows Installer 和 Windows 資源保護

不要相依於非關鍵資源。

基於下列原因,您的安裝或更新不應取決於非重要資源的安裝。

  • 如果自定義動作相依於屬於使用者公告而不是安裝的功能元件,則自定義動作可能會失敗。
  • 如果自定義動作相依於包含所安裝元件的元件,在 InstallFinalize 動作之前排序的自定義動作可能會失敗。 在 InstallFinalize 動作完成之前,Windows Installer 不會將元件認可至全域程式集緩存 (GAC)。

使用 API 來擷取 Windows Installer 組態資訊。

應用程式或更新的安裝不應取決於您計算機上儲存的 Windows Installer 設定資訊的直接存取權。 請改用 Windows Installer 應用程式開發介面來擷取組態資訊。 組態資訊的位置和格式是由 Windows Installer 服務所管理,而且可以變更。

  • Windows Installer API 的安裝和組態函式會在安裝程式函式參考說明。
  • 態屬性 會在屬性參考中描述。
  • 自動化方法和屬性會在自動化介面參考說明。 範例腳本 WiLstPrd.vbs 會連線到 Installer 對象,並列舉已註冊的產品和產品資訊。 如需詳細資訊,請參閱 列出產品、屬性、功能和元件

在元件周圍組織應用程式的安裝。

Windows Installer 服務會安裝或移除稱為 元件的資源集合。 由於元件通常是共用的,因此安裝套件的作者在指定功能或應用程式的元件時,必須遵循規則。

  • 將應用程式組織成元件,請遵循元件規則,以確保可以安裝及移除新元件或新版本的元件,而不會損害其他應用程式。 您可以遵循定義安裝程式元件中所述的程式。
  • 安裝程式會依元件數據表中指定的個別元件標識元 GUID 來追蹤每個元件。 對於元件標識碼 GUID 正確之 Windows Installer 參考計數機制的作業而言,這是不可或缺的。 遵循變更元件程式代碼中的指導方針。
  • 如果您的套件必須中斷元件規則,請注意可能的後果,並確定您的安裝永遠不會在用戶系統上損毀元件時安裝這些元件。 如需詳細資訊,請參閱 如果元件規則中斷,會發生什麼事?
  • 請注意 Windows Installer 如何在取代現有檔案時套用檔案版本控制規則 Windows Installer 會先判斷元件金鑰檔案是否已安裝,然後再嘗試安裝元件的任何檔案。 如果安裝程式找到與目標位置所安裝元件金鑰檔案同名的檔案,它會比較兩個金鑰檔案的版本、日期和語言,並使用檔案版本控制規則來判斷是否要安裝套件所提供的元件。 如果安裝程序判斷它需要取代密鑰檔上的元件,則會在每個已安裝的檔案上使用檔案版本控制規則來判斷是否要取代檔案。

減少大型 Windows Installer 套件的大小。

非常大的 Windows 套件會佔用系統資源,而且使用者很難安裝。 最好使用下列方法來減少非常大的 Windows Installer 套件大小。

  • 壓縮安裝中的檔案,並將其儲存在封包(.cab)檔案中。 安裝程式可讓.cab檔案儲存為個別的外部檔案,或儲存為 MSI 套件本身的數據流。 如需詳細資訊,請參閱 使用封包和壓縮來源
  • 使用減少.msi檔案大小中所述 的其中一個選項,移除.msi檔案中浪費的儲存空間。
  • 如果您的 Windows Installer 套件包含超過 32767 個檔案,您必須變更資料庫的架構。 如需資訊,請參閱 撰寫大型套件

如果您使用自定義動作,請遵循良好的自定義動作做法。

Windows Installer 有許多內 建標準動作 ,可用於安裝和維護應用程式。 開發人員應該儘可能嘗試依賴標準動作,而不是建立自己的 自定義動作。 不過,在某些情況下,安裝套件的開發人員發現需要撰寫自定義動作。

  • 遵循使用自定義動作指導方針。
  • 遵循保護自定義動作的指導方針。 使用敏感性資訊的自定義動作不應將此資訊寫入記錄中。 如需詳細資訊,請參閱 自定義動作安全性
  • 自定義動作不得嘗試從自定義動作內設定系統還原進入點。 如需詳細資訊,請參閱 從自定義動作設定還原點。
  • 從自定義動作傳回錯誤訊息,並將其寫入記錄檔,以利針對自定義動作進行疑難解答。 如需詳細資訊,請參閱 錯誤訊息自定義動作從自定義動作傳回錯誤訊息。
  • 請勿從立即自定義動作變更系統狀態。 直接變更系統或呼叫另一個系統服務的自定義動作,必須延後到執行安裝腳本的時間。 每次 延遲執行變更系統狀態的自定義動作 之前,都必須有 復原自定義動作 ,才能復原安裝復原時的系統狀態變更。 如需詳細資訊,請參閱 使用自定義動作變更系統狀態。
  • 執行複雜安裝作業的自定義動作應該是 可執行檔動態連結庫。 將根據 文稿 的自定義動作使用限制為簡單的安裝作業。
  • 讓系統管理員輕鬆探索自定義動作對系統執行哪些動作的詳細數據。 將自定義動作所使用的登錄專案和檔案詳細數據放入自定義數據表中,並讓自定義動作從此數據表讀取。 此範例示範 於使用自定義動作在本機計算機上建立用戶帳戶。 如需將自定義數據表新增至資料庫的資訊,請參閱使用SQL和腳本處理資料庫查詢的查詢和範例。
  • 自訂動作不應該顯示對話框。 需要使用者介面的 自定義動作可以改用 MsiProcessMessage 函式。 請參閱 使用 MsiProcessMessage 將訊息傳送至 Windows Installer。
  • 自定義動作不得使用頁面上所列的任何函式: 函式不適用於自定義動作
  • 如果安裝是要在終端伺服器上執行,請測試您的所有自定義動作都能夠在終端伺服器上執行。 如需詳細資訊,請參閱 TerminalServer 屬性。
  • 若要在卸載特定修補程式時執行自定義動作,自定義動作必須存在於原始應用程式中,或是一律套用產品的修補程式中。 如需詳細資訊,請參閱 修補卸載自定義動作
  • 自定義動作不應該使用UI層級作為將錯誤訊息傳送至安裝程式的條件,因為這可能會干擾記錄和外部訊息。 如需詳細資訊,請參閱 從自定義動作判斷 UI 層級。
  • 使用條件語句和 條件語句語法 ,以確保您的套件正確執行自定義動作、未執行自定義動作,或在卸載封裝時執行替代自定義動作。 測試套件在卸載自定義動作如預期般運作。 如需詳細資訊,請參閱 移除期間要執行的調理動作
  • 如果安裝必須能夠由沒有系統管理員許可權的使用者執行,請測試以確保所有自定義動作都可以以非系統管理員許可權執行。 自定義動作需要提高的許可權,才能修改非使用者特定系統的元件。 如果已安裝受控應用程式,或已針對提高許可權指定系統原則,安裝程式可能會執行具有更高許可權的自定義動作。 任何需要提高許可權的自定義動作都必須在自定義動作類型中包含 msidbCustomActionTypeInScript 和 msidbCustomActionTypeNoImpersonate 自定義動作腳本執行選項 。 此範例示範 於使用自定義動作在本機計算機上建立用戶帳戶。

如果您使用元件,請遵循良好的元件作法

如果您的套件使用軟體元件,請遵循將元件新增至套件更新元件,以及安裝及移除元件的指導方針。

請勿寄送並行安裝。

並行安裝,也稱為巢狀安裝,在目前正在執行的安裝期間安裝另一個 Windows Installer 套件。 並行安裝的使用不是很好的做法,因為客戶很難提供服務。 修補和升級可能無法與並行安裝搭配使用。 建議使用並行安裝的替代方案是改用安裝程式應用程式和外部UI處理程式,循序安裝數個Windows Installer套件。

如需使用外部 UI 處理程式的詳細資訊,請參閱 使用 MsiSetExternalUI 監視安裝。 如需使用記錄型外部處理程式的詳細資訊,請參閱 使用 MsiSetExternalUIRecord 監視安裝。

並行安裝有時會用於受控制的公司環境,以安裝不適合公用的應用程式。 如果您決定使用並行安裝,請遵循這些指導方針。

  • 請勿使用並行安裝來安裝或更新出貨產品。
  • 並行安裝不應該共享元件。
  • 系統管理安裝不應包含並行安裝。
  • 整合式 ProgressBars 不應該與並行安裝搭配使用。
  • 要公告的資源不應該由並行安裝安裝來安裝。
  • 執行應用程式並行安裝的套件,也應該在卸載父產品時卸載並行應用程式。 巢狀安裝存在於 控制台 的 [新增/移除程式] 中父產品的內容之下。

讓套件名稱和套件程式代碼保持一致。

.msi檔案可以指定任何可協助使用者識別套件的名稱,但名稱不應變更,而不需變更原始程式碼。

  • 為您的.msi檔案提供使用者易記的名稱,讓用戶能夠識別 Windows Installer 套件的內容。
  • 產品代碼是應用程式的主體識別,而且每當應用程式有完整的更新時,都必須變更。 如需詳細資訊,請參閱 ProductCode變更 Product Code。 變更應用程式.msi檔案的名稱會被視為全面變更,而且一律需要對應的產品代碼變更,才能維持一致性。
  • 套件 程式代碼 是安裝程式用來搜尋和驗證指定安裝的正確套件的主要標識碼。 沒有兩個非標識碼.msi檔案應該具有相同的套件程式代碼。 如果封裝變更而不變更套件程式代碼,則如果安裝程式仍可存取這兩個套件,安裝程式可能無法使用較新的套件。 封裝程式代碼會儲存在摘要資訊數據流修訂編號摘要屬性中。
  • 請注意,產品代碼和套件程式代碼 GUID 中的字母都必須是大寫。

請勿使用 SelfReg 和 TypeLib 數據表。

  • 強烈建議安裝套件作者不要使用自我註冊和 SelfReg 數據表。 相反地,它們應該藉由在登錄數據表群組撰寫一或多個數據表來註冊模組。 Windows Installer 的許多優點都會因為自我註冊而遺失,因為自我註冊例程通常會隱藏重要的組態資訊。 如需避免自我註冊的原因清單,請參閱 SelfReg 表格
  • 強烈建議您不要使用 TypeLib 數據表安裝套件作者。 不使用 TypeLib 數據表,而是使用 登錄 數據表來註冊類型庫。 如果使用 TypeLib 資料表的安裝失敗且必須復原,則復原可能不會將計算機還原到復原之前存在的相同狀態。

提供在沒有使用者介面的情況下安裝的選項。

系統管理員通常會偏好在公司內部署應用程式,而不需要用戶互動。 最好讓應用程式提供 [無] 使用者介面層級安裝的選項。

  • 使用 公用屬性 來取得組態資訊。 系統管理員可以在命令行上提供這項資訊。
  • 不需要安裝取決於從使用者與對話框互動中收集的資訊。 這項信息無法在無訊息安裝期間使用。
  • 請勿在無訊息安裝期間自動重新啟動用戶的電腦。
  • 系統管理員可以使用命令行選項 「/q」 來安裝時,設定使用者介面層級。 您也可以使用對 MsiSetInternalUI呼叫,以程式設計方式設定使用者介面層級。

避免使用AlwaysInstallElevated原則。

如果未設定 AlwaysInstallElevated 原則,則系統管理員未散發的應用程式會使用使用者的許可權來安裝,而且只有受管理的應用程式獲得更高的許可權。 設定此原則會指示 Windows Installer 在系統上安裝應用程式時使用系統許可權。 這個方法可以將計算機開啟為安全性風險,因為設定此原則時,非系統管理員使用者可以使用提高的許可權執行安裝,並存取計算機上的安全位置。 針對非系統管理員修補個別使用者受控應用程式,安裝具有提高許可權的套件時,最好使用 AlwaysInstallElevated 原則以外的另一種方法。

啟用 DisableMedia 原則以限制未經授權的安裝。

DisableMedia 原則可防止未經授權的應用程式安裝。 啟用此原則時,使用者和系統管理員無法針對其他可安裝產品的來源使用 [流覽] 對話框來瀏覽媒體來源,例如 CD-ROM。 無論安裝是否以更高的許可權完成,都無法流覽其他產品。 如果使用者有正確標籤的媒體來源,使用者仍然可以從媒體重新安裝產品。

保護原始套件來源檔案的安全,並可供使用者使用。

在某些情況下,可能需要 Windows Installer 套件的原始來源,才能隨選安裝、修復或更新應用程式。 如果安裝程式找不到可用的來源,系統會要求使用者提供媒體,或移至包含所需來源的網路位置。 請務必確保安裝程式具有所需的來源,而不需要提示使用者。

  • 使用 數位簽名和外部封包檔案 ,以確保安裝程式所使用的組織來源是安全的。 儲存在公用位置的未壓縮來源映像不安全。
  • 在 SOURCELIST 屬性中包含應用程式安裝套件的完整網路或 URL 來源路徑清單。
  • 使用分散式文件系統 (DFS) 共用作為來源路徑。
  • 使用 Windows Installer API 來擷取和修改 Windows Installer 應用程式和修補程式的來源清單資訊。 如需詳細資訊,請參閱 管理安裝來源
  • 使用 Installer 對象產品物件Patch 物件的方法和屬性,擷取和修改 Windows Installer 應用程式和修補程式的來源清單資訊。
  • 遵循防止修補程式需要存取原始安裝來源點中所列的點,以將修補程式需要存取原始來源的可能性降到最低。
  • 將套件來源檔案儲存在不是系統暫存資料夾的位置。 儲存在暫存資料夾中的 Windows Installer 原始程式檔案可能會變成使用者無法使用。

針對部署進行疑難解答時,在使用者的計算機上啟用詳細信息記錄。

Windows Installer 記錄 包含可在使用者電腦上啟用的詳細資訊記錄選項。 嘗試針對 Windows Installer 套件部署進行疑難解答時,詳細資訊記錄檔中的資訊會很有説明。

  • 您可以使用命令行選項、MsiLogging 屬性、記錄原則、MsiEnableLogEnableLog 方法,在使用者的電腦上啟用詳細信息記錄。
  • 用來解譯 Windows Installer 記錄檔的實用資源Wilogutl.exe。 此工具可協助分析記錄檔,並顯示記錄檔中找到之錯誤的建議解決方案。
  • 詳細資訊記錄選項只應該用於疑難解答目的,而且不應該留在上,因為它可能會對系統效能和磁碟空間產生負面影響。 每次您在 控制台 中使用 [新增/移除程式] 工具時,都會建立新的檔案。

卸載會讓使用者的計算機處於乾淨狀態。

應用程式移除與安裝一樣重要。 卸載 Windows Installer 套件時,它應該不會在用戶的電腦上留下任何無用的部分。

  • 如果在執行卸載之後,應該從使用者的計算機移除的檔案仍會繼續安裝,安裝程式可能無法移除包含檔案的元件,原因 如下:移除擱置的檔案
  • 如果必須註冊應用程式,請撰寫套件,以在卸載應用程式時移除登錄資訊。 如需詳細資訊,請參閱 在安裝或移除元件時新增或移除登錄機碼。 如果未註冊應用程式,應用程式就不會列在 控制台 的 [新增或移除程式] 功能中,而且無法使用 Windows Installer 來管理。
  • 若要從 控制台 中的 [新增或移除程式] 功能隱藏應用程式,但仍能夠使用 Windows Installer 來管理應用程式,請遵循在登錄中新增和移除應用程式及保留無追蹤中所述的指導方針。
  • 在卸載時,自定義動作應設定為執行或不需要執行。 不同的自定義動作可能需要在安裝和卸載時執行。
  • 使用者特定的自定義資訊可以儲存在電腦上的文字檔中。 這的優點是,即使目前尚未登入此自定義的使用者,也能在卸載應用程式時移除檔案。

測試個別使用者和每部計算機安裝部署的套件。

最好讓客戶決定是否要在每部計算機或每個使用者 安裝內容中部署安裝套件。

  • 請考慮應用程式是否應該只在開發過程中提供給特定使用者或電腦的所有使用者使用。
  • 測試套件在每一使用者安裝和每部機器安裝內容上都能正確運作。
  • 讓套件易於自定義,讓客戶決定是否要部署每個使用者或每部計算機。

在運送應用程式之前規劃及測試服務策略。

您應該先決定要如何服務應用程式,然後再第一次部署應用程式。

  • 請考慮您未來預期用來為應用程式提供服務的更新類型。 Windows Installer 提供三種類型的更新:小型更新次要升級和主要升級。 修補和升級主題會說明這些之間的差異。
  • 在寄送應用程式之前,請先測試它在每個更新類型服務之後如預期般運作。

減少原始來源的更新相依性。

如果需要原始原始程式檔來更新您的應用程式,這可能會讓應用程式更難維護。 下列方法有助於減少原始來源的更新相依性。

請勿散發無法服務合併模組。

如果合併模組的擁有者和應用程式的擁有者不同,則應用程式不應該相依於 元件的安裝合併模組 。 這會使應用程式難以服務,因為兩個擁有者都需要協調以更新應用程式或模組。 若不知道已使用合併模組的所有應用程式,應用程式擁有者就無法更新合併模組,而不會冒著更新可能與另一個應用程式不相容的風險。 合併模組的擁有者沒有直接方法來更新已安裝合併模組的 Windows Installer 套件。

  • 請考慮將所需的元件提供給用戶作為另一個 Windows Installer 安裝。

避免修補系統管理安裝。

在網路上 提供應用程式原始 Windows Installer 套件的系統管理安裝 ,讓工作組的成員能夠安裝應用程式。 然後,此系統管理映像的用戶應該將更新套用至位於其電腦上的應用程式本機實例。 這可讓使用者與系統管理映像保持同步。 基於下列原因,不建議將更新套用至系統管理安裝。

  • 相較於下載修補程式,使用者取得更新所需的下載大小和延遲會增加。 整個更新的 Windows Installer 套件和來源檔案必須下載、重新快取和重新安裝。
  • 使用者無法 視需要 安裝應用程式,並從更新的系統管理安裝修復應用程式,直到他們重新復原並重新安裝應用程式為止。
  • 將修補程式套用至系統管理安裝,會從套件中移除數字簽名。 系統管理員必須辭職套件。 如需使用數位簽名的詳細資訊,請參閱 數位簽名和 Windows Installer
  • 許多二進位修補程式是以應用程式的 RTM 映像為目標,而且需要舊版檔案。 從更新的系統管理安裝安裝所安裝之應用程式的本機實例可能無法與其他更新搭配使用。 許多二進位修補程式應用程式可能會失敗。
  • 將修補程式套用至系統管理安裝會更新來源檔案和.msi檔案,但不會使用更新的相關信息來戳記網路映像。 使用者無法判斷他們從系統管理安裝收到的更新。 如此一來,就不可能將套用在用戶端的更新順序,以及已在系統管理映像端套用的更新。
  • 套用至系統管理安裝的修補程式無法卸載。 這可以防止用戶計算機上快取的套件程式代碼與系統管理安裝上的套件程式代碼不同。 如果使用者電腦上快取的套件程式代碼與系統管理安裝上的套件程式代碼不同,請從系統管理安裝重新安裝應用程式,然後修補客戶端電腦。
  • 如果您決定藉由修補系統管理映像來套用小型更新,請遵循主題中所述的指導方針: 藉由修補系統管理映像來套用小型更新。

註冊更新以提升的許可權執行。

從 Windows Installer 3.0 開始,在修補程式註冊為具有更高許可權之後,可以將修補程式套用至已安裝在每個使用者管理內容中的應用程式。 您無法使用早於 3.0 版的 Windows Installer 版本,將修補程式套用至安裝在個別使用者受控內容中的應用程式。

  • 使用 SourceListAddSource 方法或 MsiSourceListAddSourceEx 函式,將修補程式套件註冊為具有更高許可權。 請遵循修補個別使用者受控應用程式提供的指導方針和範例。
  • 在 Windows Vista 上執行 Windows Installer 4.0 版時,您也可以使用 使用者帳戶控制 (UAC) 修補 ,讓 Windows Installer 安裝的作者識別未來可由非系統管理員使用者套用的數位簽署修補程式。 這僅適用於在每部計算機 安裝內容 中安裝套件 (ALLUSERS=1)。
  • 設定 MSIDISABLELUAPATCHING 屬性或 DisableLUAPatching 原則,確定尚未停用最低許可權修補。

使用 MsiPatchSequence 數據表來排序修補程式。

在您的 套件中包含 MsiPatchSequence 數據表 ,並新增修補程式排序資訊。 從 Windows Installer 3.0 版開始,安裝程式可以在安裝多個修補程式使用 MsiPatchSequence 數據表,以判斷最佳的修補程式應用程式順序。 使用 Windows Installer 3.0 版修補程式排序白皮書中所述的指導方針來定義修補程式系列。

  • 如果可行,請將所有修補程式指定為屬於單一修補程式系列。 在許多情況下,單一修補程式系列提供足夠的彈性來排序修補程式。 使用多個修補程式系列時,撰寫的複雜度會增加。 將有意義的名稱指派給修補程式系列,並指派該修補程式系列中隨著時間增加的時序值。 請遵循多個修補範例,以發出修補程式的順序套用修補程式。
  • 使用 Patchwiz.dll 中的 PatchSequence 數據表,在 MsiPatchSequence 數據表產生資訊。 使用 Windows Installer 3.0 發行的PATCHWIZ.DLL版本可以自動產生修補程式排序資訊。 如需如何新增修補程式的詳細資訊,請參閱 產生修補程序順序資訊。 如需修補程式排序案例的詳細資訊,請參閱白皮書: Windows Installer 3.0 版中的修補程式排序。

徹底測試安裝套件。

測試正確安裝、修復及移除 Windows Installer 套件。 您可以將測試程式分成下列部分。

  • 安裝測試 - 使用所有可能的應用程式功能組合來測試安裝。 測試所有類型的安裝,包括系統管理安裝復原安裝及隨選安裝。 嘗試安裝的所有可能方法,包括按兩下.msi檔案、 命令行選項,以及從控制面板安裝。 測試用戶可在所有可能的許可權內容中安裝套件。 嘗試在所有可能的方法部署套件之後安裝套件。 針對每個測試啟用 Windows Installer 記錄 ,並解決安裝程式記錄檔和事件記錄檔中找到的所有錯誤。
  • 使用者介面測試 - 使用所有可能 的使用者介面層級安裝時測試套件。 測試未安裝任何使用者介面的套件,以及透過使用者介面提供的所有資訊。 請確定使用者介面的輔助功能,以及使用者介面對於不同螢幕解析度和字型大小的預期運作。
  • 服務與修復測試 - 測試套件可以處理小型更新次要升級和主要升級所提供的修補和升級。 在部署套件之前,請撰寫每種類型的試用版更新,並嘗試將它套用至原始套件。
  • 卸載測試 - 確認移除套件時,它不會在用戶的計算機上留下任何無用的部分,而且只有屬於套件的信息已移除。 卸載套件之後重新啟動測試計算機,並確認通用系統工具和其他標準應用程式的完整性。 測試用戶可在所有可能的許可權內容中移除套件。 測試所有方法以移除套件、按兩下.msi檔案、嘗試 命令行選項,然後嘗試從控制面板移除套件。 針對每個測試啟用 Windows Installer 記錄 ,並解決安裝程式記錄檔和事件記錄檔中找到的所有錯誤。
  • 產品功能測試 - 確定應用程式在安裝、修復或移除套件之後如預期般運作。

在部署新的或修訂的安裝套件之前,請先修正所有驗證錯誤。

在第一次嘗試安裝套件之前,先對新的或已修訂的 Windows Installer 套件執行 套件驗證 。 驗證會檢查 Windows Installer 資料庫是否有撰寫錯誤。 嘗試安裝未通過驗證的套件可能會損害用戶的系統。

撰寫安全安裝。

在開發套件以協助維護安裝期間的安全環境時,請遵循這些指導方針。

使用 PMSIHANDLE 而非 HANDLE

PMSIHANDLE 類型變數定義於 msi.h 中。 建議您的應用程式使用 PMSIHANDLE 類型,因為安裝程式會在超出範圍時關閉 PMSIHANDLE 物件,而您的應用程式必須藉由呼叫 MsiCloseHandle 來關閉 MSIHANDLE 物件。 PMSIHandle 提供轉換運算子給 MSIHANDLE ,以取得 API 簽章相容性。

例如,如果您使用類似下列的程式代碼:

MSIHANDLE hRec = MsiCreateRecord(3);

請將其變更為:

PMSIHANDLE hRec = MsiCreateRecord(3);