單一套件撰寫
雙重用途套件是一種 Windows Installer 5.0 套件,其已撰寫為能夠在每個使用者或每部電腦安裝應用程式,安裝內容。 針對其應用程式使用雙重用途套件的安裝程式開發人員可以在安裝時為使用者提供安裝內容選擇,並可從 Windows 7 或 Windows Server 2008 R2 上的每個使用者安裝中移除 UAC 認證提示。 在 Windows 7 和 Windows Server 2008 R2 上安裝的雙重用途 Windows Installer 5.0 套件的開發稱為單一套件撰寫。
您可以使用 Windows Installer 5.0、MSIINSTALLPERUSER 屬性、ALLUSERS 屬性,以及個人用戶可使用的 Windows Shell已知資料夾和註冊,著手開發適用於 Windows 7 和 Windows Server 2008 R2 的雙重用途封裝。 當 Windows Installer 5.0 在 Windows 7 或 Windows Server 2008 R2 的個別使用者的上下文中安裝雙重用途套件時,安裝程式會將檔案和註冊表項目轉向至每個使用者的位置,而不會顯示用戶帳戶控制(UAC)憑證提示。 當 Windows Installer 5.0 在每台電腦範圍內安裝雙重用途套件時,安裝程式會將檔案和登錄項目導向每台電腦專用的位置,並提示輸入 UAC 認證,以確認使用者具備安裝該電腦所有使用者軟體的足夠權限。 Windows Installer 5.0 安裝應用程式之後,它會針對所有後續更新、修復或移除應用程式使用相同的安裝內容。
Windows Installer 4.5 或更早版本:MSIINSTALLPERUSER 屬性及 ProgramFilesFolder、CommonFilesFolder、ProgramFiles64Folder和 CommonFiles64Folder 屬性所參考的每個使用者版本的資料夾均不受支援。 從 Windows 7 和 Windows Server 2008 R2 開始,即可使用 FOLDERID_UserProgramFiles 和 FOLDERID_UserProgramFilesCommon 資料夾。 這表示針對 Windows Installer 4.5 或更早版本開發的安裝會將檔案和登錄專案導向至FOLDERID_ProgramFiles、FOLDERID_ProgramFilesCommon、FOLDERID_ProgramFilesX64和FOLDERID_ProgramFilesCommonX64。 因為這些位置可供計算機的其他使用者存取,Windows Vista 和更新版本系統需要顯示 UAC 提示以取得認證。
當使用者使用 Windows Installer 4.5 或更早版本為 Windows Installer 5.0 安裝雙用途套件時,安裝程式會忽略 MSIINSTALLPERUSER 屬性。 在此情況下,安裝可以將檔案和登錄專案導向其他用戶可存取的位置,並要求系統顯示 UAC 提示輸入認證。 Windows Installer 5.0 可以安裝針對 Windows Installer 4.5 或更早版本開發的套件,不過,安裝會將檔案和登錄專案導向其他使用者可存取的位置,並要求系統顯示認證 UAC 提示。
開發指導方針
請遵循以下單一封裝撰寫指導方針,確保封裝能在每個使用者層級或整個機器層級安裝。 請遵循這些指導方針,以便讓使用者在安裝時選擇每位使用者或每台電腦的安裝,並移除每位使用者安裝的 UAC 提示。
在 Windows 7 或 Windows Server 2008 R2 上,每個使用者安裝需要 Windows Installer 5.0。 您應該告訴使用者,該套件支援在舊版本系統上為每個使用者的電腦安裝應用程式。
在雙用途套件的 屬性數據表 中,初始化 ALLUSERS 和 MSIINSTALLPERUSER 屬性的值。 使用 ALLUSERS 值為 2,並使用 MSIINSTALLPERUSER 值為 1 做為初始值。 這指定將每位用戶安裝設定為雙重用途套件的預設選項。
請考慮為雙用途套件 使用者介面撰寫對話框,讓用戶能夠在安裝時間選擇內容。 撰寫此自定義對話方塊的控件,以設置 ALLUSERS 和 MSIINSTALLPERUSER 屬性的值。 若為 ALLUSERS 值為 2,請將 MSIINSTALLPERUSER 設為 1 的值,以指定每個使用者安裝,並將 MSIINSTALLPERUSER 設為空字串 (“”) 以指定每部電腦安裝。 如果使用者從命令行安裝套件,您也可以在命令行上設定 ALLUSERS 和 MSIINSTALLPERUSER。
使用 內部一致性評估工具 ICEs驗證套件。 套件必須能夠透過 ICE105 傳遞驗證,才能成為有效的雙重用途套件。
使用 註冊表 和 移除註冊表,在針對每位使用者的安裝期間,將註冊表項目重新導向至該使用者的註冊表部分。 在每個使用者安裝中,在 [根] 資料行中具有 -1 的登錄專案會重新導向至 HKEY_CURRENT_USER,然後在每部計算機安裝中,這些登錄專案會導向至 HKEY_LOCAL_MACHINE。 在每個使用者安裝中,根數據行中有 msidbRegistryRootClassesRoot (0)的登錄專案會重新導向至 HKCU\Software\Classes,而在每部電腦安裝時,這些專案會導向至 HKLM\Software\Classes。
使用 Directory 數據表中的 ProgramFilesFolder 屬性,32 位 Windows Installer Packages,指定目錄的位置,其中包含未在應用程式之間共用的 32 位元件。 當使用者使用每部計算機內容安裝雙重用途套件時,這些元件會儲存在 Windows 32 位版本的 Program Files 資料夾中,以及 64 位版本的 Program Files (x86) 資料夾中。 所有使用者都可以存取這些目錄中的元件。 當使用者使用每個用戶內容在 Windows 7 或 Windows Server 2008 R2 上安裝雙重用途套件時,這些元件會儲存在目前使用者的 Programs 資料夾中(例如,%LocalAppData%\Programs),而且只能由該使用者存取。
使用 Directory 表格中的 CommonFilesFolder 屬性,32 位元 Windows Installer Packages,指定包含跨應用程式共用 32 位元件的目錄位置。 當使用者使用每部計算機內容安裝雙重用途套件時,這些元件會儲存在 Common Files 資料夾中,而且所有使用者都可以存取。 當使用者使用每個用戶內容在 Windows 7 或 Windows Server 2008 R2 上安裝雙重用途套件時,這些元件會儲存在目前使用者的 Common 資料夾中(例如,%LocalAppData%\Programs\Common),而且只能由該使用者存取。
使用 ProgramFiles64Folder 屬性,在 Directory 表中的64 位 Windows Installer 套件 來指定目錄的位置,這些目錄包含未在應用程式間共享的 64 位元件。 當使用者使用每部計算機內容安裝雙重用途套件時,這些元件會儲存在 Program Files 資料夾中。 所有使用者都可以存取這些目錄中的元件。 當使用者使用每個用戶內容在 Windows 7 或 Windows Server 2008 R2 上安裝雙重用途套件時,這些元件會儲存在目前使用者的 Programs 資料夾中(例如,%LocalAppData%\Programs),而且只能由該使用者存取。 如需撰寫套件以在 64 位作系統上安裝應用程式的詳細資訊,請參閱 64 位作系統上的 Windows Installer。
使用 Directory 資料表中的 CommonFiles64Folder 屬性,64 位 Windows Installer 套件,指定包含跨應用程式共用 64 位元件的目錄位置。 當使用者使用每部計算機內容安裝雙重用途套件時,這些元件會儲存在 Common Files 資料夾中,而且所有使用者都可以存取。 當使用者使用每個用戶內容在 Windows 7 或 Windows Server 2008 R2 上安裝雙重用途套件時,這些元件會儲存在目前使用者的 Common 資料夾中(例如,%LocalAppData%\Programs\Common),而且只能由該使用者存取。
使用 ProgramFilesFolder 和 CommonFilesFolder 属性,在 Directory 表 中,64 位 Windows Installer Packages 中指定包含 32 位元件的目錄位置。 針對以相同名稱提供之任何元件的32位和64位版本使用不同的名稱,或者,將版本儲存在不同的資料夾中。 例如,將資訊新增至 Directory 數據表,將包含 32 位版本的目錄位置指定為 [ProgramFilesFolder]\ISV Name\Application Name\x86,以及包含 64 位版本的目錄位置為 [Program64FilesFolder]\ISV Name\\x64。 然後,每部計算機安裝會將 32 位版本儲存在 Program Files(x86)\ISV Name\Application Name\x86,並將 64 位版本儲存在 Program Files\ISV Name\Application Name\x64。 每個使用者安裝會將 32 位版本儲存在 %LocalAppData%\Programs\ISV Name\Application Name\x86 中,並在 %LocalAppData%\Programs\ISV Name\\x64 中安裝 64 位版本。
在 \Users\使用者名稱\AppData 下儲存應用程式的每個使用者組態數據。
將應用程式所產生的範本和檔案儲存在 \Users\ 的子資料夾中,使用者名稱。
如果您的應用程式使用殼層擴充功能,則您應該使用從 Windows 7 或 Windows Server 2008 R2 開始可用的個別使用者 殼層擴充性 點。
請勿在套件中使用需要提高許可權才能執行的自定義動作。 CustomAction 數據表不應包含已標示為具有較高許可權執行的自定義動作。 如需提高自訂動作的詳細資訊,請參閱 自定義動作安全性。
請勿在任何全域系統資料夾中寫入。 目錄 資料表不應包含任何下列系統資料夾屬性。
管理工具資料夾
CommonAppDataFolder
FontsFolder
System16Folder
System64Folder
系統資料夾
TempFolder
WindowsFolder
WindowsVolume
- 請勿將通用語言執行平台的組件安裝到全域組件快取(GAC)。如需將組件安裝至全域組件快取的詳細資訊,請參閱 將組件新增至套件 和 通用語言執行平台組件的安裝。
- 請勿安裝任何 ODBC 數據來源。 請勿使用 ODBCDataSource 數據表來安裝數據源。
- 請勿安裝任何服務。 請勿使用 ServiceInstall 數據表來安裝服務。
例
在 Windows SDK 元件中為 Windows Installer 開發人員提供了一個雙重用途套件的範例檔案 PUASample1.msi。 如果您有目前的 SDK,您可以存取重現範例安裝套件所需的所有工具和數據。 如需此範例的詳細資訊,請參閱 單一封裝撰寫範例。