如何更好地利用MSI文件

问题描述 投票:11回答:3

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

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

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

installation wix windows-installer installer msitransform
3个回答
14
投票

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

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

在回答有关msiexec命令行选项的原始问题时,只需运行MSIEXEC /?在命令行上设置属性,就可以使用像

MSIEXEC /I test.msi SOMEPROPERTY="Some value" PROP2="something else"

11
投票

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


Configuring MSI Installations

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

如果MSI文件设计良好,您将能够从msiexec.exe命令行或使用转换文件来修改原始MSI,从而设置PUBLIC PROPERTIES(它们始终为大写)。这些操作如下所述。公共属性最容易在MSI文件的“Property table”中找到。 Use the MSI tool of your choice to open the *.msi file并导航到Property表。还有一些免费的MSI工具可用于生成变换和查看(和编辑)MSI文件:How can I compare the content of two (or more) MSI files?(链接到底部)。

精心设计的MSI设置可通过这些公共属性完全配置。设计糟糕的MSI文件不是。设计糟糕的MSI文件最好使用转换文件进行调整(这可以对整个MSI文件进行实质性更改,以便在安装时应用)。设置公共属性只能更改公共属性可配置的任何内容 - 由安装程序创建者设计。转换几乎可以改变整个MSI文件中的任何内容。

通常,所有公司的静默部署都是使用转换来“将MSI文件打成形状”来实现企业标准。它是企业部署的一种非常有效的工具,并得到广泛使用。


一些安全保护链接:


MSI "Features"

MSI通常是违反直觉的,并且在引擎盖下有些复杂。但是,过度简化MSI文件包含一个或多个“功能” - 这些功能共同构成了“应用程序的位”。反过来,功能包括“组件” - 这是整个软件安装的原子单元 - 但这是一个非常技术性的细节 - 这个答案是关于用户暴露的MSI位 - 功能。

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

典型的功能包括:核心或程序,字典,示例,插件,拼写检查,SDK和开发人员工具(用于开发工具)等...某些功能是必需的(必须安装) - 上面的示例将是核心和程序,其他是可选的,应用程序不需要启动(如上面的开发工具功能)。可以使应用程序安装功能“按需” - 例如当用户启动拼写检查时拼写检查。

根据我的经验,大多数用户都希望安装整个应用程如果Windows Installer意外弹出并开始安装拼写检查程序组件,许多用户都非常恼火。坦率地说非常容易理解。但是,很少使用的模块化组件只对少数用户有用,可以制成可选组件 - 特别是如果系统管理员可能不希望网络上有该功能。对于开发人员工具来说肯定是这种情况 - 普通用户不应该使用这些工具。它们往往是人们需要在脚下射击的所有绳索。


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


1: msiexec.exe command line:

控制安装期间安装的功能的最简单和轻量级方法是使用msiexec.exe命令行指定功能选择。有一整套属性用于功能配置。但是,在大多数情况下,指定ADDLOCAL就足够了:

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

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

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

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

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

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


2: Transforms:

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

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

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

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

可以使用许多工具来创建转换,这里是在比较MSI文件的更多技术上下文中对此类工具的描述。只需直接跳到底部的免费工具列表:How can I compare the content of two (or more) MSI files?


Anti-Patterns Vs The Corporate Benefits of Windows Installer:

Windows Installer有许多设计怪癖,对于开发人员来说可能特别烦人。不可否认,有些问题与反模式有关。

潜在的反模式

  • 困难的多实例安装 相对常见的要求,特别是对于服务安装
  • 反直觉的file overwrite rulessymantec) 奇怪的规则,特别是对于非版本化文件 一个疯狂的功能强制覆盖所有文件(REINSTALLMODE = amus) 可以在系统范围内降级共享文件 因为可以在较新的软件包之后安装旧软件包并仅降级某些共享文件,因此会导致版本不一致 可以降级或清除非版本化文件(和注册表设置)中的设置 由于试图不必要地替换相同版本的正在使用的文件,可能导致请求的重新启动次数显着增加。 还有一些非常具体的问题。有一天,我会把它们都写完
  • 升级后意外重置注册表中的用户数据 这是非常有问题的。如果你遇到这个不是你,那就是技术 经常看到服务凭证登录和序列密钥 一些技术可以避免这个问题 避免从您的设置中编写任何HKCU注册表项,而是从您的应用程序中编写它们。您的设置现在永远不会干扰它们 - 它根本不了解这些值。 将注册表数据放在自己的功能中(应防止自我修复问题) 通过具有空组件GUID的组件安装注册表数据(在修复或自我修复期间不会被重写) 如果key-path存在,则将组件标志设置为永不覆盖。 使用自定义操作将HKLM数据(例如许可证密钥)写入注册表(这有其他问题,但可以让您完全控制何时写入数据 - 在什么安装模式下) 确保您保持稳定的注册表键路径。设置标志值KeyPath = 1并且永远不会更改它 - 并且至关重要 - 不要更改组件GUID 永远不要将REINSTALLMODE设置为“amus” - 当然不是属性表中值的硬编码。 还有进一步的技巧和经验法则,如果我能把它们全部记在脑海里:-)。
  • 复杂的升级机制 次要升级有很多限制和限制 主要升级还有其他挑战(重置注册表数据,安装后丢失文件,安装后COM文件自行修复等等)
  • 缺乏GUI功能 不是火箭科学,而是有些复杂 缺乏实现适当流畅的GUI的事件和功能
  • 令人震惊的复杂补丁 极难有效使用 不建议使用,除非作为“修补程序” - 即在已安装的安装程序的卸载顺序中更新几个文件或修复特定的MSI文件错误。 一些补丁评论: Windows Installer "Error 1308. Source file not found" when uninstalling patch in sequence scenario MSP vs. MSI packaging. Which to use for patches?
  • 自定义操作的极其复杂的实现 复杂的测序 复杂的调理 具有提升权利的复杂模仿/部分运行 整体极易出错。
  • 每用户设置的低迷实施 概念上可疑(文件夹重定向,不可预测性,在现实世界中进行设置的不可能性支持每用户和每机器安装) 复杂的升级,卸载和补丁。允许为不同用户和每台计算机多次安装产品 我不得不承认 - 从主观上讲 - 我认为当前实现的每用户设置是一个完整的部署反模式。我从不使用它,并坚持不要除非被迫。
  • 意外的自我修复 1)Self-repair - explained。 2)Self-repair - finding real-world solutions。 3)Self-repair - how to avoid it in your own package
  • 缺少写入XML文件的内置功能
  • IIS安装功能不佳 部分问题是文件覆盖未版本控制文件的规则(可能的不可预测的结果)。 IIS可能需要一种全新的部署技术才能说实话 - 一种以完全可预测的方式定义非版本文件处理的方法 - 具有合理的实际选项。也许是对强制替换的非版本化文件进行自动备份,强制执行一致的文本文件(“程序集”),这些文件必须是正确的版本,等等...... 还有IIS和虚拟文件夹和站点的复杂配置的其他几个问题
  • 在自定义操作上草率启用“检查退出代码”会导致无法升级或卸载的软件包(无需严重调整) 主要升级可能会失败,并触发回滚无关紧要的事情 次要升级可用于修复卸载顺序或错误的调节
  • 还有一些...... 事实上,我写了一篇关于常见的反模式的总结,这些模式经常出现在现实世界的MSI包中(错误地使用了该技术):How do I avoid common design flaws in my WiX / MSI deployment solution? 我可以支持所有内容,但格式不是很好 - 这是一个混乱的大脑转储,但有时这似乎是完成任务的唯一方法。把它当成它。 过度使用自定义操作是另一个MSI问题。这背后有一个复杂的核心,但总体而言,问题是人们不会在MSI中使用功能完备的预先存在的解决方案,也不会通过WiX(或Installshield或Advanced Installer等商业工具)之类的扩展来使用。以下是摘要:Why is it a good idea to limit the use of custom actions in my WiX / MSI setups?

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

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

Windows Installer的企业优势(非常重要)

它需要特定的思维方式来接近Windows Installer。但是,它提供了许多重要的企业利益,这些优势在以前的安装技术中几乎完全缺乏。推荐阅读The corporate benefits of using MSI files。特别是对于那些认为Windows Installer比它值得更麻烦的人。

简要总结一下链接的文章,MSI对以前的部署技术的核心企业好处(在我看来)是:

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

这只是为了挑选最重要的(经过多年的企业部署)。老实说,这些功能在世界上有所不同(对于企业部署),并且尽管存在各种缺陷,但真正使MSI很好用。

Windows安装程序的暮光之城

随着Windows Installer迎来暮年,我们只能希望未来的部署技术能够保留这些优秀的企业部署优势,并以一种让每个人,特别是开发人员受益的方式处理上述反模式。

部署是发展的关键部分。未能为潜在的最终用户成功安装好的软件可能是整个软件开发中最昂贵的错误。如果用户从未看到您的软件功能齐全,您怎么能成功?

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

一个相当不错的:summary of Windows Installer

云平台

这一切都说明了;随着计算通常转向云平台,部署世界可能会以不可预测的方式发生巨大变化。然而,正如一句名言所说:事情变化越多,他们就越保持不变。部署需要处理将在未来几十年内在公司中使用的所有传统技术。以下是关于为什么部署似乎变得更复杂而且不那么复杂的部分 - 尽管所有的营销:What is the benefit and real purpose of program installation?

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



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 toolset。所有设置信息都通过XML文件完成,然后将其转换为MSI安装程序。 WiX稳定(虽然仍标记为beta),可用于生产。实际上它将集成在即将推出的Visual Studio 2010版本中。

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

© www.soinside.com 2019 - 2024. All rights reserved.