Windows Installer (MSI)知识汇编
1 Windows Installer 概述
Windows Installer 是 Windows 操作系统的组件,它可以简化应用程序的安装过程。
通过应用安装过程期间集中定义的一组安装规则,Windows Installer 可以管理应用程序的安装和删除。还可以使用此项服务修改、修复或删除现有的应用程序。Windows Installer 技术由用于 Windows 操作系统的 Windows Installer 服务以及包含有关应用程序设置和安装信息的程序包 (.msi) 文件格式组成。
Windows Installer 也是可扩展的软件管理系统。Windows Installer 管理软件组件的安装、添加和删除,监视文件复原,以及通过回滚方式维护基本的故障恢复。Windows Installer 支持从多种来源安装和运行软件,并且开发人员可以自定义 Windows Installer 以安装自定义应用程序。
2 Windows Installer 的功能
使用 Windows Installer 和 .msi 程序包文件格式,软件安装与删除将更加可靠和具有弹性。Windows Installer 还提供更多安装选项。Windows Installer 执行以下任务:
2.1 安装失败后恢复原始计算机状态
Windows Installer 跟踪在应用程序安装过程中对系统所做的所有更改。如果安装失败,Windows Installer 能重新恢复系统,或者使系统返回到初始状态。
2.2 帮助阻止应用程序间冲突
Windows Installer 加强了安装规则,这有助于阻止现有应用程序在共享资源时产生冲突。当安装操作更新现有应用程序共享的动态链接库 (.dll) 时,或某个操作删除其他应用程序共享的动态链接库时,会导致这样的冲突。
2.3 安全地删除现有程序
Windows Installer 可以安全地卸载以前安装的任何程序。除被其他已安装软件共享使用的内容之外,它将删除所有关联的注册表项和应用程序文件。成功地安装应用程序之后,可在任何时候卸载。(删除不能和“返回”功能混淆,后者是在安装失败时将计算机恢复到初始状态)。
2.4 诊断和修复损坏的应用程序
应用程序可以查询 Windows Installer,以确定安装的应用程序是否具有丢失或损坏的文件。如果检测到任何丢失或损坏的文件,Windows Installer 通过重新复制那些丢失或损坏的文件修复该应用程序。
2.5 支持按照需要安装应用程序的功能
Windows Installer 可配置为最初只安装应用程序的最小子集。以后,当用户第一次访问需要其他组件的功能时,将自动安装其他组件。这称作“公布”。例如,Windows Installer 可以安装功能最少的 Microsoft Word。当用户第一次访问邮件合并功能时(在原始安装中未包括此功能),Windows Installer 将自动安装邮件合并组件。同样,Windows Installer 还可以清除应用程序中不使用的组件。例如,可以将 Windows Installer 配置为,如果邮件合并组件 60 天不用,则删除该组件。
2.6 支持无人参与的应用程序安装
安装程序包可配置成安装过程中无需与用户进行交互。在安装过程中,Windows Installer 可以向计算机查询桌面属性,包括确定应用程序是否以前都被 Windows Installer 安装过。
2.7 支持 32 位和 64 位的应用程序
32 位应用程序可以安装在 64 位的计算机上。
2.8 支持 Microsoft .NET Framework
Microsoft .NET Framework 是新的、可生成集成的、面向服务的应用程序的平台,这些应用程序从多种类型源中获得信息并与源交互,而不管正在使用的平台或者语言。.NET Framework 和公共语言运行库可提供一次编写、一次编译、任意位置运行的应用程序开发。具体地讲, .NET Framework 可以提供代码重新使用、代码规范化、资源管理、多语言开发、安全、部署和管理。
2.9 与并排组件集成
此功能通过允许将基于组件版本设计和测试的应用程序绑定到该版本组件,从而消除了 .dll 版本冲突,而不管使用该应用程序的计算机如何。并排组件支持同时执行每个组件的多个版本。
2.10与软件限制策略集成
此功能提供了防病毒支持,包括防止通过电子邮件和 Web 传播特洛伊木马病毒和蠕虫病毒。软件限制策略使执行简单点击、上下文活动频繁的用户感到安全。组策略使该策略作为受信的应用程序列表的一部分来执行,Windows Installer 使用这些软件限制策略允许的应用程序进行操作。
3 Windows Installer 技术
Windows Installer 技术分为两部分(这两部分联合工作):客户端安装程序服务 (Msiexec.exe) 和软件包文件 (.msi file)。Windows Installer 使用包含在软件包文件中的信息来安装应用程序。以下讲述 Windows Installer 技术:
3.1 安装程序服务
Windows Installer 是一种允许操作系统管理安装过程的操作系统服务。
•
3.2 安装程序
Msiexec.exe 程序是 Windows Installer 的一个组件。该程序使用动态链接库 Msi.dll 读取程序包文件 (.msi)、应用转换 (.mst) 以及合并命令行选项。该安装程序执行所有与安装相关的任务:将文件复制到硬盘、修改注册表、创建桌面快捷方式以及必要时显示查询用户安装首选项的对话框。
在计算机上安装 Windows Installer 时,将修改操作系统的文件关联功能以便识别 .msi 文件类型。当用户双击带 .msi 扩展名的文件时,操作系统将 .msi 文件与 Windows Installer 关联并运行 Msiexec.exe 应用程序。
•
3.3 安装程序包文件
每个程序包 (.msi) 文件都包含关系型数据库,存储着通过多种安装方案安装(和卸载)程序所需的全部指令和数据。例如,程序包文件可以包含在已经安装应用程序的以前版本的情况下安装此应用程序的指令。程序包文件还可以包含在从未装过该应用程序的计算机上安装此应用程序的指令。
•
3.4 转换
可以通过将转换 (.mst) 应用到安装数据库来操纵安装过程。转换过程将更改数据库元素。例如,Windows Installer 可以使用转换文件更改应用程序的用户界面语言。Windows Installer 转换文件将修改安装时的安装程序包文件,因此能动态影响安装操作。
如果您在使用“组策略软件安装”,您应当注意除了在安装时,在分配和发布时,也将应用转换。在实际术语中,这表示在您单击“确定”之前需要确保程序包属性对话框的“修改”选项卡是按照所需方式设置的。如果您忽略了这一步操作并部署了转换错误的程序包,则需要删除软件并重新部署,或者用正确转换的版本升级该软件。
自定义转换,很像修补程序,始终保留在计算机的缓存中。只要 Windows Installer需要对安装程序包执行配置更改,这些转换就会应用到基本程序包文件。转换只能在初始安装时应用,而不能对已安装的应用程序应用。
4 使用Windows Installer
4.1 在所管理的环境中的 Windows Installer
Windows Installer 是 IntelliMirror 的主干,也是基于组策略的更改和配置管理技术的核心组件。通过使用 IntelliMirror 技术、组策略以及更改和配置管理,管理员可批准特定应用程序,指定在这些应用程序上的所有配置操作(安装、删除和修复)都在本地系统帐户下运行。管理员控制并管理文件系统和注册表,而 Windows Installer 执行用户启动的软件安装。只有管理员批准的应用程序才能以更高特权运行。有关 Windows Installer 的详细信息,请参阅使用 Windows Installer。
管理员使用 Active Directory、IntelliMirror 和组策略向企业内部的用户组或计算机组指派和发布应用程序。Active Directory 是一种安全的、分布式的、分区的、复制的目录服务,用来提供管理服务。这些服务包括企业内部资源定位以及将组策略用于 Active Directory 所管理对象的标准方法。有关 Active Directory 的详细信息,请参阅 Active Directory。
4.2 Msiexec(命令行选项)
4.2.1 安装或配置产品
语法
msiexec /i {Package | ProductCode}
参数
/i
安装或配置产品。
Package
指定 Windows 安装程序包文件的名称。
ProductCode
指定 Windows 安装程序包的全局唯一标识符 (GUID)。
备注
Windows Installer 命令行选项不区分大小写。
有关 Windows 安装程序命令行选项的详细信息,请参阅“相关主题”。
示例
要从 A:\Example.msi 安装某一产品,请键入:
msiexec /I A:\Example.msi
4.2.2 使用管理安装选项
语法
msiexec /a Package
参数
/a
应用管理安装选项。
Package
Windows 安装程序包文件的名称。
备注
Windows Installer 命令行选项不区分大小写。
•
有关 Windows 安装程序命令行选项的详细信息,请参阅“相关主题”。
4.2.3 修复产品
语法
msiexec /f [p][o][e][d][c][a][u][m][s][v]{Package | ProductCode}
参数
/f
启用下表中的一个或多个命令行选项。
|
|
命令
|
描述
|
p
|
只有文件丢失时才重新安装。
|
o
|
如果文件丢失或安装了旧版本,则重新安装。
|
e
|
如果文件丢失或安装了相同或更旧的版本,则重新安装。
|
d
|
如果文件丢失或安装了不同的版本,则重新安装。
|
c
|
如果文件丢失或存储的校验和不符合计算值,则重新安装。
|
a
|
强制重新安装所有文件。
|
u
|
重新写入全部所需的用户特定的注册表项。
|
m
|
重新写入全部所需的计算机特定的注册表项。
|
s
|
覆盖所有现有的快捷方式。
|
v
|
从资源运行或重新缓存本地程序包。
|
Package
Windows 安装程序包文件的名称。
ProductCode
Windows 安装程序包的全局唯一标识符 (GUID)。
备注
该选项将忽略从命令行键入的任何属性值。
该命令行选项的默认参数是 /fpecms。
Windows Installer 命令行选项不区分大小写。
有关 Windows 安装程序命令行选项的详细信息,请参阅“相关主题”。
示例
要修复安装程序包,请键入:
msiexec /fpecms example.msi
4.2.4 卸载产品
语法
msiexec /x {Package | ProductCode}
参数
/x
卸载产品。
Package
Windows 安装程序包文件的名称。
ProductCode
Windows 安装程序包的全局唯一标识符 (GUID)。
备注
Windows Installer 命令行选项不区分大小写。
有关 Windows 安装程序命令行选项的详细信息,请参阅“相关主题”。
示例
要删除或卸载程序包,请键入:
msiexec /x Example.msi
4.2.5 公布产品
语法
msiexec /j [{u | m}] Package
msiexec {u | m} Package /t TransformList
msiexec {u | m} Package /g LanguageID
参数
/j
公布产品。
u
向当前用户公布。
m
向计算机的所有用户公布。
Package
指定 Windows 安装程序包文件。
/g LanguageID
标识语言。
/t TransformList
将变换应用到已公布的程序包。
备注
该选项将忽略从命令行键入的任何属性值。
如果要用高级特权安装应用程序,请使用 /jm。
Windows Installer 命令行选项不区分大小写。
有关 Windows 安装程序命令行选项的详细信息,请参阅“相关主题”。
范例
要将程序包公布给计算机的所有用户,请键入:
msiexec /jm Example.msi
4.2.6 设置登录级别
语法
msiexec /L [i][w][e][a][r][u][c][m][p][v][+][!]LogFile.txt
参数
/L
指定日志文件的路径。
i
记录状态消息。
w
记录非严重警告。
e
记录所有错误消息。
a
记录启动操作。
r
记录操作特定的记录。
u
记录用户请求。
c
记录初始用户界面参数。
m
记录内存不足。
p
记录终端属性。
v
记录详细输出。要使用 v 选项,请指定 /L*v。
+
添加到现有文件。
!
刷新日志的每一行。
*
记录除 v 选项外的所有信息。这是通配符。
LogFile .txt
文本日志文件的名称和路径。
备注
Windows Installer 命令行选项不区分大小写。
要在使用通配符标志的日志文件中包括 v 选项,请在命令提示符后键入 /L*v。
Windows 安装程序日志文件选项也可以与卸载和修复过程一起使用。
有关 Windows 安装程序命令行选项的详细信息,请参阅“相关主题”。
示例
要安装程序包并创建包含状态、内存不足和错误消息等相关信息的日志文件,请使用下面的命令:
msiexec /i Example.msi /Lime logfile.txt
4.2.7 应用更新
语法
msiexec/pUpdatePackage
参数
/p
应用一项更新。
UpdatePackage
特定的更新。
备注
要将更新应用到管理安装程序包,请使用下面的语法:
msiexec/pUpdatePackage/aExample.msi
Windows Installer 命令行选项不区分大小写。
有关 Windows 安装程序命令行选项的详细信息,请参阅“相关主题”。
4.2.8 使用命令行安装转换
语法
msiexec /iPackageTRANSFORMS=TransformList
参数
/i
安装或配置产品。
Package
指定 Windows 安装程序包文件。
TRANSFORMS=
用于指定哪些转换 (.mst) 文件应该应用到程序包的属性。
TransformList
由分号分隔的路径列表。
备注
Windows Installer 命令行选项不区分大小写。
有关 Windows 安装程序命令行选项的详细信息,请参阅“相关主题”。
4.2.9 使用命令行通过转换安装并公布产品
语法
msiexec /iPackage/j[u][m] /tTransformList
参数
/i
安装或配置产品。
Package
Windows 安装程序包文件的名称。
/j
公布产品。该选项忽略所有在命令行输入的属性值。
u
向当前用户公布。
m
向计算机的所有用户公布。
/t
将变换应用到已公布的程序包。
TransformList
由分号分隔的路径列表。
备注
Windows Installer 命令行选项不区分大小写。
有关 Windows 安装程序命令行选项的详细信息,请参阅“相关主题”。
4.2.10 设置用户界面级别
语法
msiexec /q{n|b|r|f|n+|b+|b-}
参数
/qn
不显示用户界面。
/qb
显示基本用户界面。
/qr
在安装结束时显示带模式对话框的简化用户界面。
/qf
结束时显示带模式对话框的完整用户界面。
/qn+
除了结束时显示模式对话框之外不显示用户界面。
/qb+
结束时显示带模式对话框的基本用户界面。
/qb-
显示不带模式对话框的基本用户界面。
备注
/qb+- 不是受支持的用户界面级别。如果用户取消安装,则不显示模式对话框。
Windows Installer 命令行选项不区分大小写。
有关 Windows 安装程序命令行选项的详细信息,请参阅“相关主题”。
示例
要在安装程序包 Example.msi 期间显示基本用户界面选项,请键入:
msiexec /qb Example.msi
4.2.11 显示 Windows 安装程序的版权信息
语法
msiexec {/?| /h}
参数
{ /?|/h]
显示 Windows 安装程序版本和版权信息。
备注
Windows Installer 命令行选项不区分大小写。
有关 Windows 安装程序命令行选项的详细信息,请参阅“相关主题”。
4.2.12 调用系统 API DllRegisterServer 自注册在命令行跳过的模块
语法
msiexec /y Module
参数
/y
调用系统 API DllRegisterServer 自注册在命令行跳过的模块。
Module
指定模块的文件名。
警告
编辑注册表不当可能会严重损坏您的系统。在更改注册表之前,应备份计算机上任何有价值的数据。
备注
该选项只用于不能使用 .msi 文件注册表添加的注册信息。
•
Windows Installer 命令行选项不区分大小写。
•
有关 Windows 安装程序命令行选项的详细信息,请参阅“相关主题”。
范例
下例说明了如何使用 msiexec /y 命令:
msiexec /y my_file.dll
4.2.13 调用系统 API DllUnRegisterServer 取消注册在命令行跳过的模块
语法
msiexec/zModule
参数
/z
调用系统 API DllUnRegisterServer 取消注册在命令行跳过的模块。
Module
模块文件名。
备注
该选项只用于不能使用 .msi 文件注册表添加的注册信息。
•
Windows Installer 命令行选项不区分大小写。
•
有关 Windows 安装程序命令行选项的详细信息,请参阅“相关主题”。
范例
下例说明了如何使用 msiexec /z 命令:
msiexec /z my_file.dll
5 安装故障分析和解决方法
5.1 安装程序包不能正确安装。
原因:安装程序包已损坏。
解决方案:使用 Windows Installer 的修复选项修复安装程序包。
另请参阅:使用命令行修复程序包
5.2 完成安装之前安装过程终止。
原因:Windows Installer 不能读取安装程序包,或者计算机上的条件阻止了程序包的成功安装。
解决方案:Windows Installer 在 Windows 事件日志中创建项目。要查看该日志,请执行以下操作:
² 打开事件查看器。
² 查看 Windows Installer项中的应用程序日志。
5.3 升级安装时提示“安装程序无法安装XX,因为已经安装了该产品的其他版本。”
原因:安装包的内容已经发生了变化,但其Version 属性和UpgradeCode属性没有更改。
解决方案:制作新的安装包时,请更改安装包的Version和UpgradeCode,在使用vs.net 2003打包时,更改version的同时,UpgradeCode会自动更改。
5.4 升级安装时部分程序组件没有更新
原因:可能有2种
1 新的安装包将组件安装到不同的目录了
2 Windows Installer认为本地文件与安装包中的文件一致,无须更新。
解决方案:对于第一种原因,应该尽量避免,一旦发生,应该在新目录和旧目录同时放置新的组件,以确保组件被覆盖。对于第二种原因,发布新版本的软件时,对于更改过的组件,应该更改其版本(version属性)。