15

您可能知道,msiexec是一个命令行应用程序,可用于安装 MSI 文件。您可能知道,您可以在静默或不可见模式下运行它。

如果安装程序要求用户回答有关要安装哪些部件的特定问题,是否可以通过某种方式在 msiexec 命令行中添加一系列选项来执行此操作?

我认为必须有某种方式来设置 MSI 文件的默认设置才能实现这一点。MSI 文件是如何制作的?它们是通过 Microsoft 的工具开发的吗?它们可以打开和编辑吗?

4

3 回答 3

16

MSI 文件专门设计用于支持静默安装作为内置功能 - 您始终可以跳过 GUI。但是,一些 MSI 文件存在设计缺陷,导致在静默模式下安装不完整——这是一个严重的设计错误。此处描述了此问题:


简短版本如何从电子生成器参数化 msi 文件 - 使用公共属性和转换来自定义 MSI 包的安装。



配置 MSI 安装

在静默安装 MSI 时,您需要做的是从 msiexec.exe 命令行或通过对原始 MSI 文件应用所谓的转换来配置设置。这两个选项都在下面的单独部分中进行了描述。

如果 MSI 文件设计良好,您将能够从 msiexec.exe 命令行使用转换文件修改原始 MSI 设置公共属性(它们总是大写)。这些操作如下所述。公共属性最容易在 MSI 文件的“属性表”中找到。使用您选择的 MSI 工具打开 *.msi 文件并导航到属性表。还有一些免费的 MSI 工具可用于生成转换和查看(和编辑)MSI 文件:如何比较两个(或更多)MSI 文件的内容?(指向底部的链接)。

精心设计的 MSI 设置可通过这些公共属性进行完全配置。设计不良的 MSI 文件不是。设计不佳的 MSI 文件最好使用转换文件进行调整(这可以对整个 MSI 文件进行重大更改以在安装时应用)。设置公共属性只能更改公共属性可配置的任何内容 - 正如设置创建者所设计的那样。转换几乎可以改变整个 MSI 文件中的任何内容

通常,所有公司的静默部署都是使用转换来完成的,以“将 MSI 文件打造成符合公司标准的形状”。它是一种非常有效的企业部署工具,被广泛使用。


几个安全保存的链接:


微星“特色”

MSI 通常是违反直觉的,并且在引擎盖下有些复杂。但是,过度简化的 MSI 文件包含一个或多个“功能”——正如您所说,这些功能共同构成了“应用程序的部分”。反过来,功能由“组件”组成——它们是整个软件的基本安装单元——但这是一个非常技术性的细节——这个答案是关于 MSI 的用户公开位——功能。

屏幕截图真正的 MSI 包中的功能是什么样的(屏幕截图)

您通常可以通过交互式运行安装程序找到这些功能的列表,然后导航到自定义安装对话框(并非总是存在)。此处显示的功能是应用程序的“用户可配置”部分,可以选择排除或包含(有些是强制性的)。您还可以通过使用上述功能强大的工具打开 MSI 来找到这些功能(您还可以在下面的第 2 节中查看链接)。

典型功能有:Core or ProgramDictionariesSamplesPlug-InsSpell CheckerSDK & Developer Tools(用于开发工具)等...有些功能是强制性的(必须安装)——上面的例子是CoreProgram,其他是可选的,应用程序启动不需要(如上面的开发工具功能)。可以使应用程序“按需”安装功能 - 例如,当用户启动拼写检查时,拼写检查器。

根据我的经验,大多数用户都希望安装整个应用程序。如果 Windows Installer 意外弹出并开始安装拼写检查器组件,许多用户会非常恼火。坦白说非常好理解。然而,只有少数用户感兴趣的很少使用的模块化组件可以制成可选组件——特别是如果系统管理员可能不希望在他们的网络上使用该功能。开发人员工具当然就是这种情况——普通用户应该使用这些工具。他们往往是人们需要在脚上射击自己的所有绳索。


如上所述,自定义 MSI 安装通常有两种方法:(1)使用 msiexec.exe 自定义命令行,或使用 (2)转换文件


1:msiexec.exe 命令行

控制安装过程中安装哪些功能的最简单、轻量级的方法是使用msiexec.exe命令行指定您的功能选择。有一整套用于功能配置的属性。但是,在大多数情况下,指定以下内容就足够了ADDLOCAL

msiexec.exe /i myinstaller.msi ADDLOCAL="Program,Dictionaries" /qn

上面的命令行指定应该在本地安装功能“程序”和“字典”(功能名称区分大小写!)。这通常就足够了,但您也可以使用 REMOVE 属性以类似的方式指定要删除的任何功能。一个特殊的开关ADDLOCAL=ALL将在本地磁盘上安装 MSI 中的所有功能(前提是 MSI 中没有额外的逻辑来覆盖它)。MSDN 上的 ADDLOCAL 属性

由公共属性定义的一个非常常见的事情是应用程序的许可证密钥。以下命令行指定安装功能“程序”和“字典”并应用序列号“1234-1234”:

msiexec.exe /i myinstaller.msi ADDLOCAL="Program,Dictionaries" SERIALKEY="1234-1234" /qn

正如上面的描述所暗示的,每个设置的可定制属性列表总是不同的。您可以找到 MSI 文件的属性表中列出的大多数属性,但也有可能设置了一些属性表中未定义的属性。在大多数情况下,这与仅从设置 GUI 设置的属性有关(在大多数情况下表示设置设计错误)。所有属性都应在正确编写的包的属性表中定义。

在供应商的下载页面上查找文档,并向他们寻求与静默安装或大规模部署相关的任何文档的支持。做起来很快,如果有标准答案模板,答案也会很快。控制其部署的公司将始终能够提供此服务。在我看来,理想的方式是描述不同部署设置的单页 PDF。坦率地说,如果他们不能提供这些,就给他们一些热量;-)。


2:变换

MSI 文件本质上是包装在 COM 结构化存储文件(文件中的文件系统)中的 SQL 数据库。转换文件是通过Orca(SDK 链接)、Installshield 或明智的、高级安装程序等...(链接到不同工具的描述)。这些转换可以自定义或覆盖 MSI 中的几乎所有设置或数据库字段 - 包括安装了哪些“应用程序部分”(功能)。创建转换后,您可以在 msiexec.exe 命令行中将其应用程序指定给 MSI:

msiexec.exe /i myinstaller.msi TRANSFORMS="mytransform.mst" /qn

然后,Windows Installer 将在安装开始前合并 MSI 和转换。这是希望完全控制如何安装 MSI的大型组织所使用的方法。MSDN 上的 TRANSFORMS 属性

如上所述,这是允许修改 MSI 中的所有设置的选项。可以对设计不良的 MSI 文件进行大量修复,以实现可靠的部署。这是由“应用程序打包者”完成的。他们的工作是调整所有设置以符合公司标准。他们可能是最有知识的 MSI 专家之一——他们在 MSI 文件中看到了很多奇怪的东西。

许多工具可用于创建转换,以下是在比较 MSI 文件的技术背景下对此类工具的描述。直接跳到底部的免费工具列表:如何比较两个(或多个)MSI 文件的内容?


反模式与 Windows Installer 的企业优势:

Windows Installer 有许多设计怪癖,可能对开发人员来说特别烦人。诚然,有些问题接近于反模式

潜在的反模式

  • 困难的多实例安装
    • 相对常见的要求,特别是对于服务安装
  • 违反直觉的文件覆盖规则赛门铁克
    • 奇怪的规则,尤其是对于非版本控制的文件
    • 强制覆盖所有文件的疯狂功能(REINSTALLMODE = amus)
      • 可以在系统范围内降级共享文件
      • 可能会导致版本不一致,因为可以在新软件包之后安装旧软件包并且仅降级某些共享文件
      • 可以降级或清除非版本文件(和注册表设置)中的设置
      • 由于尝试不必要地替换相同版本的正在使用的文件,可能会导致请求的重新启动次数显着增加。
      • 还有几个非常具体的问题。总有一天我会把它们都写出来
  • 升级后意外重置注册表中的 用户数据
    • 这是非常有问题的。如果你体验到这不是你,那是技术
    • 经常出现在服务凭证登录和序列号中
    • 避免这个问题的一些技巧
      • 避免从您的设置中写入任何 HKCU 注册表项,而是从您的应用程序中写入它们。您的设置现在将永远不会干扰它们 - 它根本不知道这些值。
      • 将注册表数据放在自己的功能中(应防止出现自我修复问题)
      • 通过具有空组件 GUID 的组件安装注册表数据(在修复或自我修复期间将永远不会被重写)
      • 如果 key-path 存在,则将组件标志设置为从不覆盖。
      • 改为使用自定义操作将 HKLM 数据(例如许可证密钥)写入注册表(这有其他问题,但可以让您完全控制何时写入数据 - 在什么安装模式下)
      • 确保您保持稳定的注册表项路径。设置一个标志值 KeyPath = 1 并且永远不要更改它 - 至关重要的是 - 也不要更改组件 GUID
      • 永远不要将 REINSTALLMODE 设置为“amus”——当然不会在属性表中对该值进行硬编码。
      • 还有更多的技巧和经验法则,如果我能从脑海中记住它们就好了:-)。
  • 复杂的升级机制
    • 小升级有很多限制和限制
    • 重大升级还有其他挑战(重置注册表数据、安装后丢失文件、安装后对 COM 文件进行自我修复等......)
  • 乏善可陈的 GUI 功能
    • 不是火箭科学,但有些复杂
    • 缺乏事件和功能来实现适当平滑的 GUI
  • 令人震惊的复杂修补
  • 自定义操作的极其复杂的实现
    • 复杂测序
    • 复杂的条件反射
    • 复杂的模拟/部分运行并提升权限
    • 整体极易出错
  • 每个用户设置的实施乏善可陈
    • 概念上可疑(文件夹重定向、不可预测性、无法在现实世界中进行设置同时支持每用户和每机器安装)
    • 升级、卸载和打补丁很复杂。允许为不同的用户和每台机器多次安装产品
    • 我不得不承认——在主观上——我认为当前每用户设置的实现是一个完整的部署反模式。我从不使用它并且坚持不使用,除非被迫使用
  • 意外的自我修复
  • 缺少写入 XML 文件的内置功能
  • IIS 安装的不良功能
    • 部分问题是未版本化文件的文件覆盖规则(可能出现不可预测的结果)。
    • 老实说,IIS 可能需要一种全新的部署技术——一种以完全可预测的方式定义对非版本化文件的处理的方法——具有明智的、真实的选项。也许自动备份强制替换的非版本控制文件,强制执行必须是正确版本的一致文本文件组(“程序集”)等等......
    • 还有其他几个与 IIS 和虚拟文件夹和站点的复杂配置有关的问题
  • 对自定义操作草率启用“检查退出代码”可能会导致无法升级或卸载的软件包(无需认真调整)
    • 重大升级可能会失败并触发一些无关紧要的回滚
    • 小升级可用于修复卸载顺序或故障调节
  • 还有几个……

实现自定义操作(自定义安装逻辑)的高复杂性问题可能被认为是不可避免的,并且编写自定义操作的行为一旦需要就应该是强大且有能力的 - 因此很复杂。如果技术本身提供了通常用于部署的内容,则很少需要自定义操作。换句话说,您应该使用内置的 MSI 功能而不是自定义操作(如果可用),或者 WiX 或第三方部署软件扩展(如果可用)。

WiX 框架(开源)和类似的商业工具(Installshield、Advanced Installer 等)已经实现了扩展 Windows Installer 的功能,以处理缺少的功能,例如缺少 XML 文件的升级机制、共享创建和管理、创建用户和组、高级 IIS 配置、COM+ 安装、更改 ACL 权限、设置防火墙规则、持久化安装属性等......应该越来越少需要实现自己的自定义操作。如果可以的话,总是使用已经被成千上万的其他用户测试过的功能(甚至数百万的用户——这些扩展是由最好的部署专家编写的——你认为你自己可以做得更好吗?)。

Windows Installer 的企业利益(非常重要)

使用 Windows Installer 需要特定的心态。然而,它提供了许多以前的安装技术几乎完全缺乏的关键企业利益。推荐阅读使用 MSI 文件的企业利益。特别是对于那些认为 Windows Installer 麻烦多于其价值的人。

简单总结一下链接的文章,MSI 相对于以前的部署技术的核心企业优势是(在我看来):

  • 可靠的静音运行(带有标准化、完全可抑制的 GUI)
  • 隐式可用的卸载(旧部署技术的噩梦)
  • 详细的日志记录(可能会有所帮助,尽管确实很冗长)
  • 可靠的远程管理(实际上是整体收益 - 所有其他列出的收益的综合效果)
  • 提升的安装权限(没有混乱的临时管理员权限)
  • 标准化的命令行(一个非常有益的功能 - 不再追逐隐藏的命令行选项)
  • 安装程序的半透明性质(开放格式,编译后的 CA 除外,它是黑盒)
  • 回滚支持(计算机状态管理、防止部分部署、失败和回滚更改)
  • 管理员安装(企业重新打包必不可少,以标准方式提取所有文件)
  • 标准包定制方法(转换)(基本上允许对企业部署进行完全定制)

这只是为了挑选最重要的那些(经过多年的企业部署)。老实说,这些功能在世界上产生了巨大的影响(对于企业部署),并且确实使 MSI 尽管存在所有缺陷,但仍然非常好用

Windows 安装程序的暮年

随着 Windows Installer 进入暮年,我们只能希望未来的部署技术能够保留这些巨大的企业部署优势,并以有利于所有人,尤其是开发人员的方式处理上述反模式。

部署是开发的关键部分未能为潜在最终用户成功安装出色的软件可能是整个软件开发中最昂贵的错误。如果用户从来没有看到你的软件完全正常运行,你怎么能成功?

必须更好地处理(降低)Windows Installer 的复杂性,并且必须在接下来的任何范例中正确保留其关键优势。

相当不错:Windows Installer 的总结

云平台

说了这么多;随着计算普遍转向云平台,部署世界可能会以不可预测的方式发生相当大的变化。然而,正如那句名言所说:事物变化越多,它们就越保持不变。部署需要处理未来几十年将在公司中使用的所有遗留技术。这里有一篇关于为什么部署似乎变得更复杂而不是更复杂的文章——尽管有所有的营销:程序安装的好处和真正目的是什么?.

看看部署的未来会是什么——在未来的几年里,这将是一件很有趣的事情。或许我们会看到家用电脑的简化部署,而企业部署会变得比以往更加复杂?在未来,大多数部署可能是数据库部署任务,而不是文件和文件夹部署任务。到目前为止,服务器部署可能非常复杂,包括数据库脚本、用户和组创建、共享设置和 ACL 权限、性能计数器、防火墙规则更新、AD 查询和更新、COM+ 和消息队列配置、服务安装等...... -整个九码。


于 2009-06-28T21:50:17.070 回答
15

将带有 MSI 的用户界面视为可选。这意味着不需要任何答案因为开发人员有合理的默认设置,这样事情就不会中断。

我们以 MSI 格式向企业客户分发我们的软件,我还向他们提供有关 Orca 基础知识的文档(orca.msiWindows Installer SDK一起分发)以及如何自定义我们在Property表中列出的某些字段以进行安装。例如序列号、注册详细信息和其他一些设置。

为了回答关于msiexec 命令行选项的原始问题,只需运行MSIEXEC /?以在命令行上设置属性,您将使用类似

MSIEXEC /I test.msi SOMEPROPERTY="Some value" PROP2="something else"
于 2009-01-20T00:23:52.067 回答
2

如何配置静默 MSI 设置

可以通过设置安装程序使用的属性在命令行上配置 MSI 安装。有预定义的 Windows Installer 属性,例如 ALLUSERS 属性。此属性定义安装是在当前用户的上下文中还是在机器的上下文中完成。

例如,可以从安装日志中获取有关可用属性的信息,该安装日志可以使用 msiexec 的 /l 选项创建

msiexec /I mysetup.msi /l*vx log.txt

如何创建 MSI 文件

有很多方法可以创建 MSI 文件。MSI 文件基本上是一个由各种表组成的数据库,其中包含所有必要的设置信息和安装对话框。

Microsoft 提供了一个名为Orca的简单工具,它使您能够编辑现有的 MSI 文件,并允许您找出可以设置哪些属性来配置安装。从理论上讲,也可以使用此工具创建新的 MSI 文件,但这是一种非常麻烦的方法。

如果您正在寻找免费的开源解决方案,我建议您查看SourceForge 或 Nullsoft 上提供的WiX 工具集。所有设置信息都通过 XML 文件完成,然后将其转换为 MSI 安装程序。WiX 是稳定的(尽管仍被标记为 beta)并且可以在生产中使用。实际上它将集成到即将发布的 Visual Studio 2010 版本中。

当然,也有可用的商业解决方案,InstallShield 是市场领导者(也是价格领导者),而 Visual Studio 可能是最广泛使用的工具。

于 2009-01-19T21:39:15.533 回答