单个包创作

双重用途包是一个 Windows Installer 5.0 包,它已被创作为能够在每用户或每计算机安装上下文中安装应用程序。 如果安装程序开发人员为其应用程序使用双重用途包,则可以为用户提供安装时可选择的安装上下文,并且可以从 Windows 7 或 Windows Server 2008 R2 上的每用户安装中移除 UAC 凭据提示。 开发用于在 Windows 7 和 Windows Server 2008 R2 上安装的双重用途 Windows Installer 5.0 包称为单包创作。

要开始为 Windows 7 和 Windows Server 2008 R2 开发双重用途包,可以使用 Windows Installer 5.0、MSIINSTALLPERUSER 属性、ALLUSERS 属性以及 Windows Shell 的每用户已知文件夹和注册。 当 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 属性以及 ProgramFilesFolderCommonFilesFolderProgramFiles64FolderCommonFiles64Folder 属性引用的文件夹的每用户版本。 从 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。 应告知用户,包在早期版本的系统上支持按计算机安装应用程序。

  • 初始化双重用途包的 Property 表中 ALLUSERSMSIINSTALLPERUSER 属性的值。 使用 ALLUSERS 值 2 和 MSIINSTALLPERUSER 值 1 作为初始值。 这会将每用户安装指定为双用途包的默认安装方式。

  • 请考虑为双重用途包的用户界面创作一个对话框,使用户可以在安装时选择上下文。 在此自定义对话框中创作控件以设置 ALLUSERSMSIINSTALLPERUSER 属性的值。 如果 ALLUSERS 值为 2,请将 MSIINSTALLPERUSER 的值设置为 1 以指定每用户安装,并将 MSIINSTALLPERUSER 设置为空字符串 ("") 以指定每计算机安装。 如果用户从命令行安装包,还可以在命令行上设置 ALLUSERS 和 MSIINSTALLPERUSER。

  • 使用内部一致性计算器(简称 ICE)验证包。 包必须能够通过 ICE105 的验证才能成为有效的双重用途包。

  • 在每用户安装期间,使用 Registry 表RemoveRegistry 表将注册表项重定向到注册表的每用户部分。 在每用户安装中,Root 列中具有 -1 的注册表项将被重定向到 HKEY_CURRENT_USER,而在每计算机安装中,这些注册表项将被定向到 HKEY_LOCAL_MACHINE。 在每用户安装中,在 Root 列中具有 msidbRegistryRootClassesRoot (0) 的注册表项将重定向到 HKCU\Software\Classes,而在每计算机安装中,这些注册表项将被定向到 HKLM\Software\Classes。

  • 使用 32 位 Windows Installer 包Directory 表中的 ProgramFilesFolder 属性,可以指定包含 32 位组件且不在应用程序之间共享的目录的位置。 当用户使用每计算机上下文安装双重用途包时,在 32 位版本的 Windows 上,这些组件将保存在 Program Files 文件夹中,在 64 位系统上,则保存在 Program Files (x86) 文件夹中。 所有用户都可以访问这些目录中的组件。 当用户使用每用户上下文在 Windows 7 或 Windows Server 2008 R2 上安装双重用途包时,这些组件将保存在当前用户的 Programs 文件夹中(例如 %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 上安装双重用途包时,这些组件将保存在当前用户的 Programs 文件夹中(例如 %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 名称\应用程序名称\x86,将包含 64 位版本的目录的位置指定为 [Program64FilesFolder]\ISV 名称\应用程序名称\x64。 然后,每计算机安装会将 32 位版本保存在 Program Files (x86) \ISV 名称\应用程序名称\x86 中,并将 64 位版本保存在 Program Files\ISV 名称\应用程序名称\x64 中。 每用户安装会将 32 位版本保存在 %LocalAppData%\Programs\ISV 名称\应用程序名称\x86 中,并在 %LocalAppData%\Programs\ISV 名称\应用程序名称\x64 中安装 64 位版本。

  • 在 \Users\username\AppData 下存储应用程序的每个用户配置数据。

  • 将应用程序生成的模板和文件存储在 \Users\username 下的子文件夹中。

  • 如果应用程序使用 shell 扩展,则应使用支持基于用户能力的 shell 扩展点(从 Windows 7 或 Windows Server 2008 R2 开始提供)。

  • 请勿在包中使用需要提升的权限才能运行的自定义操作。 CustomAction 表不得包含任何标记为使用提升的权限运行的自定义操作。 若要详细了解提升的自定义操作,请参阅自定义操作安全性

  • 请勿在任何全局系统文件夹中写入。 Directory 表不得包含对以下任何系统文件夹属性的引用。

AdminToolsFolder
CommonAppDataFolder
FontsFolder
System16Folder
System64Folder
SystemFolder
TempFolder
WindowsFolder
WindowsVolume

示例

适用于 Windows Installer 开发人员的 Windows SDK 组件中提供了一个双重用途包的示例,即 PUASample1.msi 文件。 如果拥有最新版 SDK,则可以访问重现示例安装包所需的所有工具和数据。 有关此示例的详细信息,请参阅单包创作示例