Windows Installer
定义
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 —— 可创建与编辑安装包的商业打包工具
-
回滚 —— 安装失败时把系统恢复到变更前状态的处理方式
参考资料
- windows-installer-portal [引用日期2026-10-29]
- Windows Installer [引用日期2026-10-29]
- h2zwd6bw(v=vs [引用日期2026-10-29]
- Understanding Windows Installer [引用日期2026-10-29]
- Windows_Installer [引用日期2026-10-29]
- installation-mechanism [引用日期2026-10-29]
- Local Group Policy Object [引用日期2026-10-29]
- windows-installer-portal [引用日期2026-10-29]
- multiple-package-installations [引用日期2026-10-29]
- Installation_enUS_en-US(PDF) [引用日期2026-10-29]
- view-source [引用日期2026-10-29]
- vbscript-and-jscript-msi-customactions-suck [引用日期2026-10-29]
- windows-installer-best-practices [引用日期2026-10-29]
- wix-users Mailing List for WiX toolset [引用日期2026-10-29]