Windows Installer

义项:Windows安装程序
Windows Installer

Windows Installer是微软随Windows操作系统提供的软件安装与配置服务,以安装包(通常为.msi文件)中的数据库记录安装指令,并由系统服务按事务方式执行,失败时可将计算机回滚到安装前状态[1][2]。它把关注点从「如何安装」转向「安装什么」,为组件管理提供了统一格式,因而成为桌面软件分发与企业部署的通用基础[3]。

目录
  1. 定义
  2. 原理
  3. 发展历程
  4. 应用
  5. 局限
  6. 参见

定义

Windows Installer是Windows自带的安装与配置服务,同时提供一套应用程序编程接口(API),用于软件产品的安装、修改、修复与卸载[1]。它的运行形态是一个系统服务(可执行文件为msiexec.exe),安装数据则以安装包的形式存放在扩展名为.msi的文件中,该文件本质上是一个关系型数据库[4]。

在Windows Installer体系中,一个安装包描述一个或多个产品,产品由全局唯一标识符(GUID)确认身份,内部再按功能(feature)与组件(component)分层组织;组件是安装程序处理的最小单位,不可只装其中一部分[5]。除.msi之外,还有存放变换脚本的.mst文件、合并模块.msm文件与补丁属性.pcp文件,补丁安装包通常以.msp为扩展名[5][2]。

原理

Windows Installer采用数据驱动模型。传统脚本化安装程序把「怎样一步步装」写成指令序列,而Windows Installer把「要装什么东西」连同相关数据一起写入单个安装包,由服务在运行时解释执行[3]。安装包内的多张相互关联的表记录文件、注册表项、快捷方式、界面流程与执行序列等信息,安装包还可以内嵌压缩的cab文件[4]。

一次安装可分为获取与执行两个阶段:获取阶段中,安装程序遍历安装数据库里的序列表,查询数据并生成一份逐步执行的脚本;执行阶段中,这份脚本被交给具有提升权限的进程运行[6]。处理安装脚本的同时,安装程序会同步生成回滚脚本,并把安装过程中被覆盖或删除的文件备份到隐藏系统目录,安装成功后这些备份才被清除。

上述机制构成了事务式安装:$安装 = 获取(数据库) → 生成脚本 → 执行 → 提交 \ 或 \ 回滚$。若安装中途失败或用户取消,安装程序执行回滚脚本并还原备份文件,使系统回到未变更状态;回滚是默认行为,可通过DISABLEROLLBACK属性等设置关闭。由于每台计算机都保留已装应用的文件、注册表项与组件信息,卸载时会先检查是否有其他应用依赖同一文件或注册表项,以避免破坏其他软件[3]。

组件通常指定一个关键路径(最常见的是关键文件)。应用启动时会检查关键路径是否与安装包记录一致,若文件缺失则重新安装相关功能,这一过程称为自我修复或自愈[5]。安装程序还支持「通告」机制,即先把功能登记给用户或计算机而不立即复制文件,等用户首次打开相关文档时按需安装[7][1]。

发展历程

Windows Installer在Windows 2000时期被提出,作为微软操作系统中安装程序开发标准的系统服务,并开始取代此前的安装框架[2]。1.0版随Office 2000提供,1.1版进入Windows 2000,1.2版随Windows Me发布;2.0版包含在Windows XP与Windows Server 2003中,也作为独立安装包供Windows 2000升级使用[2][8]。

3.0版随Windows XP Service Pack 2发布,其关键变化是能用单个事务安装多个补丁,把安装进度、回滚与重启整合在一起,并可按指定顺序应用补丁、查询产品与补丁清单;3.1版的系统要求为Windows Server 2003、Windows XP或安装了Service Pack 3的Windows 2000[8]。4.0版随Windows Vista与Windows Server 2008发布,未单独提供可再发行组件[8]。

4.5版随Windows Vista Service Pack 2与Windows Server 2008 Service Pack 2发布,并可作为可再发行组件用于Windows XP Service Pack 2及以上等系统。该版本引入多包事务:事务中的多个安装包要么全部安装成功,要么全部回滚[9]。5.0版随Windows 7与Windows Server 2008 R2提供,此后不再单独发行可再发行组件,其新增能力包括为账户、服务、文件、文件夹与注册表项设置安全描述符,枚举已安装组件以获取关键路径,以及用单一安装包同时支持按机器与按用户两种安装上下文[8]。

应用

Windows Installer面向桌面风格应用的开发,软件厂商用.msi包交付产品即可接入系统的安装服务,从而与其他安装程序保持一致[1]。在企业环境中,管理员常用.msi包进行批量部署与统一管理,并通过命令行调用msiexec执行静默或被动安装、应用补丁、修复与卸载[10]。命令行还可指定日志记录,便于排查安装失败的原因[10]。

管理工具方面,InstallShield、Advanced Installer等商业工具以及开源工具集WiX都可以创建、验证与编辑.msi包,Visual Studio的部署项目同样建立在Windows Installer的基础之上[2][3]。在Windows RT平台上,只有经微软签名的安装包、补丁或变换才能安装,模板摘要属性须标明对Windows RT的支持[8]。

局限

事务与回滚的覆盖面受到包内逻辑的制约。若安装包使用自定义操作(custom action)执行自行编写的代码,要使这部分同样可回滚,就必须在包中额外编写相应逻辑。自定义操作本身属于「黑盒」,除编译后的自定义操作之外,安装包的行为大体都能从数据库推断出来[11]。微软工程师在技术博客中指出,用脚本语言编写自定义操作在健壮性、调试与杀毒软件兼容性方面存在风险,部分杀毒软件的脚本拦截功能会导致安装失败并触发回滚[12]。

多包事务并非在所有环境可用:Windows Installer 4.0及更早版本不支持把多个包的安装作为单一事务回滚;在启用远程桌面服务角色的Windows Server 2008 R2上,使用MsiEmbeddedChainer表的多包安装会失败[9]。此外,同一时间只允许运行一个MSI事务,把内嵌安装程序放进自定义操作的做法最终会出问题[11]。

从维护角度看,对管理安装点(administrative installation)直接打补丁并不被推荐:补丁会去掉安装包的数字签名,需管理员重新签名,且部分二进制补丁针对RTM映像,可能与本地已安装的版本不匹配[13]。安装程序的演进也受到兼容性牵制:修正安装程序自身的缺陷,可能使一些编写不当、已投放市场的自定义操作随之失败[14]。

参见

  • MSI —— 以.msi为扩展名的安装包文件,是Windows Installer的数据载体

  • msiexec —— 调用Windows Installer服务的命令行程序

  • WiX —— 用XML文档构建Windows Installer安装包的开源工具集

  • InstallShield —— 可创建与编辑安装包的商业打包工具

  • 回滚 —— 安装失败时把系统恢复到变更前状态的处理方式

参考资料

  1. windows-installer-portal [引用日期2026-10-29]
  2. Windows Installer [引用日期2026-10-29]
  3. h2zwd6bw(v=vs [引用日期2026-10-29]
  4. Understanding Windows Installer [引用日期2026-10-29]
  5. Windows_Installer [引用日期2026-10-29]
  6. installation-mechanism [引用日期2026-10-29]
  7. Local Group Policy Object [引用日期2026-10-29]
  8. windows-installer-portal [引用日期2026-10-29]
  9. multiple-package-installations [引用日期2026-10-29]
  10. Installation_enUS_en-US(PDF) [引用日期2026-10-29]
  11. view-source [引用日期2026-10-29]
  12. vbscript-and-jscript-msi-customactions-suck [引用日期2026-10-29]
  13. windows-installer-best-practices [引用日期2026-10-29]
  14. wix-users Mailing List for WiX toolset [引用日期2026-10-29]
词条评价
词条统计

浏览次数:0 次

阅读量:0 次 · 阅读完成量:0 次

最近更新:2026-10-28T18:49:40Z

历史版本

本条目引用的词条
InstallShield MSI msiexec WiX 回滚