單一套件撰寫

雙重用途套件是 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 的每個使用者內容中安裝雙重用途套件時,安裝程式會將檔案和登錄專案導向至每個使用者位置,而不會顯示認證提示。 當 Windows Installer 5.0 在每部電腦內容中安裝雙重用途套件時,安裝程式會將檔案和登錄專案導向至每部電腦位置,並提示 UAC 認證確認使用者有足夠的許可權可安裝電腦所有使用者的軟體。 一旦 Windows Installer 5.0 安裝應用程式,它會針對所有後續更新、修復或移除應用程式使用相同的安裝內容。

Windows Installer 4.5 或更早版本不支援ProgramFilesFolder、CommonFilesFolderProgramFiles64FolderCommonFiles64Folder屬性所參考之資料夾的MSIINSTALLPERUSER屬性和每個使用者版本。 從 Windows 7 和 Windows Server 2008 R2 開始,即可使用 FOLDERID_UserProgramFilesFOLDERID_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 提示。

  • 每個使用者安裝都需要 Windows 7 或 Windows Server 2008 R2 上的 Windows Installer 5.0。 您應該通知使用者套件支援舊版系統上應用程式的每部電腦安裝。

  • 在雙用途封裝的[屬性資料表] 中,初始化ALLUSERSMSIINSTALLPERUSER屬性的值。 使用 ALLUSERS 值為 2 和 MSIINSTALLPERUSER 值 1 作為初始值。 這會指定個別使用者安裝做為雙重用途套件的預設值。

  • 請考慮為雙重用途套件 的使用者介面 撰寫對話方塊,讓使用者在安裝時選擇內容。 撰寫這個自訂對話方塊上的控制項,以設定 ALLUSERSMSIINSTALLPERUSER 屬性的值。 針對 ALLUSERS 值為 2,請將 MSIINSTALLPERUSER 設定為 1 的值,以指定每個使用者安裝,並將 MSIINSTALLPERUSER 設定為空字串 (「) 指定每部電腦安裝。 如果使用者從命令列安裝套件,您也可以在命令列上設定 ALLUSERSMSIINSTALLPERUSER

  • 使用 內部一致性評估工具驗證套件 - ICE。 套件必須能夠通過 ICE105 的驗證,才能成為有效的雙重用途套件。

  • 使用 登錄表RemoveRegistry 資料表 ,在個別使用者安裝期間,將登錄專案重新導向至登錄的個別使用者部分。 在每個使用者安裝中,根資料行中具有 -1 的登錄專案會重新導向至 HKEY_CURRENT_USER,並在每部電腦安裝中將這些專案導向 至 HKEY_LOCAL_MACHINE。 在每個使用者安裝中,具有 msidbRegistryRootClassesRoot (0) 的登錄專案會重新導向至HKCU\軟體類別,並在每部電腦安裝中,這些專案會導向至HKLM\軟體\\類別

  • 使用32 位 Windows Installer 套件Directory 資料表中的ProgramFilesFolder屬性,指定包含未跨應用程式共用 32 位元件的目錄位置。 當使用者使用每部電腦內容安裝雙重用途套件時,這些元件會儲存在 32 位版本的 Windows 上的 Program Files 資料夾中,以及 64 位版本的 Program Files (x86) 資料夾中。 所有使用者都可以存取這些目錄中的元件。 當使用者使用每個使用者內容在 Windows 7 或 Windows Server 2008 R2 上安裝雙重用途套件時,這些元件會儲存在目前使用者的 [程式] 資料夾中 (,例如,%LocalAppData%\Programs) ,而且只能由該使用者存取。

  • 使用32 位 Windows Installer 套件Directory 資料表中的CommonFilesFolder屬性,指定包含跨應用程式共用 32 位元件的目錄位置。 當使用者使用每部電腦內容安裝雙重用途套件時,這些元件會儲存在 Common Files 資料夾中,而且所有使用者都可以存取。 當使用者使用每個使用者內容在 Windows 7 或 Windows Server 2008 R2 上安裝雙重用途套件時,這些元件會儲存在目前使用者的 Common 資料夾中 (,例如,%LocalAppData%\Programs\Common) ,而且只能由該使用者存取。

  • 使用64 位 Windows Installer 套件Directory 資料表中的ProgramFiles64Folder屬性,指定包含未跨應用程式共用 64 位元件的目錄位置。 當使用者使用每部電腦內容安裝雙重用途套件時,這些元件會儲存在 Program Files 資料夾中。 所有使用者都可以存取這些目錄中的元件。 當使用者使用每個使用者內容在 Windows 7 或 Windows Server 2008 R2 上安裝雙重用途套件時,這些元件會儲存在目前使用者的 [程式] 資料夾中 (,例如,%LocalAppData%\Programs) ,而且只能由該使用者存取。 如需撰寫套件以在 64 位作業系統上安裝應用程式的詳細資訊,請參閱 64 位作業系統上的 Windows Installer

  • 使用64 位 Windows Installer 套件Directory 資料表中的CommonFiles64Folder屬性,指定包含跨應用程式共用 64 位元件的目錄位置。 當使用者使用每部電腦內容安裝雙重用途套件時,這些元件會儲存在 Common Files 資料夾中,而且所有使用者都可以存取。 當使用者使用每個使用者內容在 Windows 7 或 Windows Server 2008 R2 上安裝雙重用途套件時,這些元件會儲存在目前使用者的 Common 資料夾中 (,例如,%LocalAppData%\Programs\Common) ,而且只能由該使用者存取。

  • 使用64 位 Windows Installer 套件Directory 資料表中的ProgramFilesFolderCommonFilesFolder屬性來指定包含 32 位元件的目錄位置。 針對以相同名稱提供之任何元件的 32 位和 64 位版本使用不同的名稱,或者,將版本儲存在不同的資料夾中。 例如,將資訊新增至 Directory 資料表,以指定包含 32 位版本的目錄位置為 [ProgramFilesFolder]\ISV Name\Application Name\x86,以及包含 64 位版本的目錄位置為 [Program64FilesFolder]\ISV NameApplication Name\ \x64。 然後,每部電腦安裝會將 32 位版本儲存在 Program Files (x86) \ISV NameApplication Name\ \x86 中,並將 64 位版本儲存在 Program Files\ISV Name\應用程式名稱\x64 中。 每個使用者安裝會以 %LocalAppData%\Programs\ISV Name\應用程式名稱\x86 儲存 32 位版本,並在 %LocalAppData%\Programs\ISV Name\應用程式名稱\x64 中安裝 64 位版本。

  • 將應用程式的個別使用者組態資料儲存在 \Users\username\AppData 下。

  • 將應用程式所產生的範本和檔案儲存在 \Users\username下的子資料夾中。

  • 如果您的應用程式使用殼層延伸模組,您應該使用 Windows 7 或 Windows Server 2008 R2 中可用的每位使用者可擴充 點。

  • 請勿在套件中使用需要提高許可權才能執行的自訂動作。 CustomAction資料表應該不包含任何已標示為以提高許可權執行的自訂動作。 如需提高許可權的自訂動作的詳細資訊,請參閱 自訂動作安全性

  • 請勿在任何全域系統資料夾中寫入。 Directory資料表不應包含下列任何系統資料夾屬性的參考。

AdminToolsFolder
CommonAppDataFolder
FontsFolder
System16Folder
System64Folder
SystemFolder
TempFolder
WindowsFolder
WindowsVolume

  • 請勿將 Common Language Runtime 元件安裝到全域組件快取中, (GAC.) 如需將元件安裝至全域組件快取的詳細資訊,請參閱 將元件新增至Common Language Runtime 元件的套件和安裝。
  • 請勿安裝任何 ODBC 資料來源。 請勿使用 ODBCDataSource 資料表來安裝資料來源。
  • 請勿安裝任何服務。 請勿使用 ServiceInstall 資料表來安裝服務。

範例

Windows Installer 開發人員的 Windows SDK 元件 中提供雙重用途套件的範例,作為檔案PUASample1.msi。 如果您有目前的 SDK,您可以存取重現範例安裝套件所需的所有工具和資料。 如需此範例的詳細資訊,請參閱 單一套件撰寫範例