与常规 setup.exe 文件相比,使用 .msi 文件有哪些优势?
我的印象是,在用户拥有较少权限的机器上部署更容易,但不确定细节。
msiexec.exe 具有哪些功能使得部署比使用 setup.exe 方案更容易?
部署 .msi 应用程序时有什么技巧或窍门吗?
答案1
以下列出一些好处:
- 可以进行宣传(以便可以进行按需安装)。
- 与广告一样,功能可以在用户尝试使用时立即安装。
- 状态管理得到维护,因此 Windows Installer 提供了一种方法让管理员查看某个应用程序是否安装在计算机上。
- 如果安装失败可以回滚。
当我在企业环境中部署软件时,我会想:通过 MSI 部署软件几乎是一件令人愉快的事情。相比之下,当软件位于另一个容器中时,我几乎总是害怕部署它。
有关操作 MSI 安装的其他信息,请msiexec
在运行对话框中输入。
答案2
更新,2018 年 7 月:在 stackoverflow 上可以找到以下信息的极其压缩的摘要:MSI 的主要优势 ("executive summary"
- 各种各样的)。
我曾从事开发工作发布经理,建造工程师,安装开发人员并作为应用程序打包器和部署工程师在大公司中。
这是对最好(和最差)的评论概念性的和现实世界的特征MSI 的常见的设计问题在 MSI 文件中找到下面是一个单独的答案。并不假装完整 — — 实际上只是一团乱麻的“大脑垃圾” — — 意在“那些在书本上找不到的东西”(可能有充分的理由)。
我也想建议这个MSDN 文章值得一读:Windows 安装程序:系统管理员的优势和实施。
标准化:
简而言之,MSI 就是为了标准化,为了处理“部署异味“遗留的安装程序技术。一系列糟糕的安装架构设计导致了重复的部署问题。
总体而言,MSI 提供了全面、标准化的框架对于安装程序,其中至关重要的还包括卸载以及内置功能和选项静音运行和标准化图形用户界面可以远程触发。
仅这些功能就构成了巨大的改进以前的安装技术随意处理卸载和静默运行 - 这可能是企业部署最重要的特性以及可靠性远程包管理通过活动目录或专用的远程管理工具,例如微软 SCCM(原 SMS),IBM Tivoli,加州联合中心和类似的。
有人复制了这个答案的先前版本。也许读得更快一些?
旧版安装程序的“部署异味”
MSI 积极阻止遗留部署问题设计上。这些主题将在后面的部分中讨论,但作为快速列表,旧安装程序和旧部署技术最明显的问题是:
- 1)他们有时候会降级并覆盖共享和版本控制文件几乎不关心dll地狱导致
- 2)经常有卸载程序不正确安装程序没有提供,或者没有正确可靠地完成 - 特别是如果静默运行。这对企业 SOE 管理来说是一个非常大的问题
- 3) 静默安装很少得到适当的支持。可靠性很差,而且经常需要记录带有对话框选择的安装运行,这无法很好地处理意外情况,例如原始运行中未记录的错误对话框或警告对话框
- 4)安装程序不保留已安装内容的记录,因此没有自动验证磁盘上的文件以检查它们是否仍然是安装程序最初安装的版本
- 5)它们的特点是不可预测、不可靠和非标准命令行参数安装可执行文件
- 6)由于非标准命令行和缺乏标准,很难以可靠且可预测的方式定制企业部署所需的特定值的安装程序
- 7)普通用户无法运行这些安装,而且经常需要处理临时管理员权限(如果足够的话,使用“以...身份运行”,或者以管理员身份登录,安装然后注销 - 有时需要完整的登录和配置文件生成才能完成安装)
- 8)这安装程序安装程序经常没有返回正确的错误代码或成功代码,有时它会立即退出并启动另一个完成安装的过程,这使得很难确定安装是否完成 - 尤其是通过批处理文件
- 9)大多数 setup.exe 文件允许提取文件,但提取方式并不可靠、不可预测 - 您通常需要花费大量时间找到正确的开关才能完成提取
- 10) 日志记录在某些工具中,调试结果通常很差,而且相当杂乱。使用日志文件进行调试很少能带来清晰的结果,但确实有点帮助
- 11)有没有透明度安装程序正在做什么,没有回滚或回滚不可靠安装失败后撤消更改
- 12)有没有行业标准的方式的部署共享运行时组件无论它们是操作系统组件、第三方组件还是您自己的组件
这份名单还有很多其他重要且公认的部署缺陷显然,这些问题在企业部署领域出现得最为频繁,并导致了“应用程序重新打包“其中旧版安装程序被捕获磁盘和注册表扫描技术以便创建符合标准的 MSI 文件,实现可靠的部署。
应用程序重新打包是专家工作如果由知识渊博的人员正确操作,通常会产生质量优秀的 MSI 文件,但由于复杂的注册逻辑必须以交互方式运行才能使某些应用程序正常工作,因此不可能重新打包所有应用程序。
MSI 优势 - 简要概述
在平白的语言MSI 真正重要的好处是(无特定顺序):
- 1) 卸载除非主动禁用,否则每个包始终可用
- 2)这对于日志记录,虽然冗长,但非常棒且标准化(可以使用 WiLogUtl.exe 等工具来分析日志文件)
- 3)MSI 文件所做的大部分工作是(半)透明或“可检查”的。自定义操作除外 -(请参阅透明度部分以下)
- 4)设置自定义以标准化方式完成(变换)
- 5)没有必要临时管理权限因为安装通过 Active Directory 广告、组策略或远程管理以提升方式运行。此处有一些限定条件。另请参阅此屏幕截图来自组策略对象编辑器。
- 6)通过管理工具或使用 msiexec.exe 进行静默安装/卸载效果很好
- 7)有满回滚支持安装失败。如果你在盒子上手动安装,则需要满足一些条件你需要了解。
- 8)MSI 文件符合数据库架构(查看验证示例)
- 9)更新是标准化类型,但对于缺乏经验的打包人员来说很复杂,而且容易出错
- 10)这提取文件来自 msi 是一项内置功能(查看链接文章以获得快速概览)
- 11)Windows 安装程序命令行,执行程序,对安装顺序的执行方式进行非常细粒度的控制,并且所有选项均适用于所有符合标准的 MSI 文件(设置日志级别、静默/交互/半静默运行、设置安装参数、应用转换等...)。
- 12) 合并模块是使用多个 MSI 包交付共享文件的 MSI 机制。它是一个可消耗的模块或安装逻辑包,可在编译时与任何 MSI 包合并。Wix 通过使用 Wix 包含文件扩展并改进了这一概念 - 我认为这个概念优于合并模块 - 尤其是对于您自己的文件(即非 OS 文件)
- 13)Windows 安装程序引擎本身具有一种机制,防止覆盖版本化或修改过的文件在安装时。这是由一个相当复杂的文件替换逻辑。虽然这种逻辑很高效,但最终可能会成为问题,因为许多开发人员在升级时面临无法覆盖已修改的配置文件的问题。解决这些问题的方法通常是对应用程序设计进行微小的更改,以避免常见的部署反模式- 尽管这本身就是一个大话题。
在里面真实世界我已经发现不太成功的方面包括修补(非常复杂),MSI图形用户界面(功能简单,相当复杂,缺乏灵活性),弹性(可能会导致难以调试重复的自我修复问题), 和总体复杂度初学者处理技术问题(有时基本操作非常复杂 - 例如升级、GUI 和许多交互细节会导致意外结果等...)。由于 MSI 开销增加,安装过程的速度也显著减慢。查看一些提高 MSI 安装速度的技巧。
本文的其余部分更详细地讨论了 MSI 的一些方面。
透明度(打开安装程序格式)
MSI 文件本质上是一个精简版SQL-Server 数据库存储为COM结构存储文件- 本质上是文件或数据流集合中的文件系统。这是Microsoft Office 文档,并产生一个标准格式可以已审核和检查- A大问题对于大型企业来说。
除了编译的自定义操作之外,MSI 文件是白盒如果设置更改了一些疯狂的东西,比如系统范围的网络设置,你实际上可以使用适当的工具. 值得注意的例外是编译的自定义操作- 哪个是黑盒子。Windows 徽标要求需要对自定义操作进行注释以解释其作用,但设置开发人员经常会忽略这一点。希望 Wix 的出现能够改善这种情况。
为了确定这些编译的自定义操作在技术意义上实际上做了什么,设置捕获是必要的。根据我的经验,这种情况很少发生。如果软件需要批准企业部署,则更常见的是联系供应商获取信息,然后可能是应用程序本身阻止了它的使用,而不仅仅是设置。
可定制性(转变)
MSI 可以通过转换进行定制,以适应组织的需求和标准,同时仍允许与供应商的安装程序更新进行互操作。您无需更改安装程序本身,只需在名为转换(.mst 文件)(如果您愿意,可以将其称为数据库片段或更改事务)。您可以自由地禁用自定义操作,并且通常更改、覆盖或禁用安装程序中的任何内容,甚至可以添加新内容,包括文件。转换文件有时也用于将 MSI 文件本地化为不同的语言。可以将多个转换应用于单个 MSI,下面是样本和截断路径:
msiexec.exe /I "My.msi" /QN /L*V "C:\My.log" TRANSFORMS="C:\1031.mst;C:\My.mst"
快速参数解释:
/QN = run completely silently
/L*V "C:\My.log"= verbose logging
TRANSFORMS="C:\1031.mst;C:\My.mst" = Apply transforms 1031.mst and My.mst.
管理和报告
Windows 安装程序保持综合数据库产品已在注册表中安装的所有项目(HKEY_CLASSES_ROOT\安装程序- 切勿直接更改此处的任何内容!专家亦是如此。
您可以可靠地确定产品是否已安装、安装了哪些功能以及安装了哪些文件版本。此外,您还可以获取已应用于基础产品的任何补丁的列表(如果有)。您可以通过支持 Win32、COM 或 .NET 的 API 访问该数据库使用各种脚本、配置和管理工具,例如微软 SCCM,IBM Tivoli,加州联合中心ETC...
安全(临时提升权限)
MSI 还包括“提升权利”原则允许受限用户触发需要管理员权限才能安装的产品的安装。这是“广告功能“它允许管理员向用户提供安装程序,而无需在所有工作站上实际安装它们。安装程序本身必须在几个核心帐户上正确编写,才能使此提升权限概念正常工作。用户可以自己触发产品的安装,或者安装可能由专用部署系统控制,例如 SCCM、Tivoli、Unicenter(通常是较大的公司)。没有必要临时管理权限让事情正常运转传统安装程序经常出现这种情况。
全面的安装数据库还确保您全面了解已安装的补丁,从而可以通过自动化和管理工具检测安全漏洞。
验证
可以使用验证规则检查 MSI 文件,以确保其符合多项要求内部一致性规则(称为是冰)。企业可以创建自己的 ICE 检查来执行特殊的企业规则和要求。这对 QA 有很大帮助。验证之所以可行,是因为关系数据库和相关数据库模式具有自引用特性。数据库必须在外键、数据类型、字段宽度、模式版本等方面具有内部一致性并符合其自己的模式。验证还超越了这一点,能够检测包中的真正逻辑缺陷和错误,而不仅仅是格式和类型缺陷。例如,它可以检测部署到错误目标目的地的文件或文件类型。
弹性(自我修复)
这管理员安装Windows 安装程序的功能提供了一种从 MSI 中提取源文件的标准方法(以下是有关此主题的一些附加信息)。然后可以将这些源文件放在共享中,并可供所有工作站安装。这确保修复、卸载和修改操作完成,而无需请求 CD 或类似介质上的安装介质。这对于修补和更新操作尤其重要,因为在特殊情况下可能需要访问旧版本的源文件。
此弹性功能也存在一些常见问题。大多数管理员都遇到过以下情况:周期性自我修复周期这种情况似乎永远不会停止。点击链接可以查看导致此问题的一长串原因。再次,这是一个较短的版本这可能更容易阅读。
回滚
MSI 文件的安装通常会触发创建还原点。此外,如果安装未能完成,则安装过程中替换或覆盖的所有文件和注册表项都将被保存和恢复,除非在自定义操作中进行了任何更改。
自定义操作必须实现自己的回滚支持,以符合 Windows 徽标要求。这通常会被忽略,但需要创建第二个自定义操作来撤消主自定义操作所做的更改。
回滚可确保即使安装失败,工作站仍处于稳定状态。实际回滚脚本存储在隐藏文件夹直接在系统驱动器上 - 通常配置.MSI,它包含扩展名为 .RBS 和 .RBF 的文件 -回滚脚本文件。正如您可能预料的那样,设计不良的 MSI 文件可能会违反 Windows 的内置功能,请参阅此主题中的我的另一篇文章以了解更多详细信息。
有方法可以禁用回滚并加快安装速度。一般不推荐,但是以下是有关 MSIFASTINSTALL 属性和 DISABLEROLLBACK 的详细信息。这是一个复杂的功能,但是以下是快速回滚概述。
修补和更新
尽管非常复杂,但 Windows 安装程序中的修补程序在系统上是完全可管理的和注册的,因此可以通过检查已安装的内容来确定系统的安全状态。更新已标准化为几个基本变体,如果您能够处理所涉及的复杂性,则可以更高程度地确定执行更新。部署系统将能够报告哪些更新失败以及失败的原因。
从主观角度来看,修补对于2 个基本用途:1) 针对已交付产品的小修复,以及2) 修补已安装的产品以修复其错误的卸载顺序,从而阻止产品完全卸载。
补丁只是一种传递机制为已经生效的更新. 因此,它只是一个容器,复杂的和容易出错比原始设置本身更重要。补丁的首要规则是它必须比原始 MSI 小,否则根本没有明显的理由提供补丁。如果补丁针对多个产品版本,则补丁很快就会变得非常大。
日志记录(确实很冗长)
Windows 安装程序提供了标准化日志记录功能它比以前的版本好很多,尽管有点过于冗长。日志文件可以使用以下方式解密:日志分析器, 和自定义日志级别可以避免生成包含不必要信息的过大日志文件。对于调试目的,详细日志记录非常有用。请参阅Rob Mensching 的博客寻找一个好的手动方法来读取 MSI 日志文件(基本上你搜索“值 3“在日志文件中)。下面是执行详细日志记录的示例命令行:
msiexec.exe /I "C:\Installer.msi" /QN /L*V "C:\msilog.log"
本文来自罗伯特·麦克唐纳来自Windows 安装程序团队强烈建议从实践角度看一下 MSI 日志:如何解读 Windows 安装程序日志。
结论
Windows Installer 并非一无是处。 它是复杂性可能令人困惑有时,但对于大公司来说,当你考虑到上述好处时,MSI 文件比任何其他形式的部署都要好得多。
新的安装程序范例(巨大的 SQL 语句)
了解新的“范例“重要的是要理解 MSI 的目的是陈述性描述目标系统上将会发生什么,而不是固定的事件序列。我想你可以把它看作是一个巨大的 SQL 语句。例如,您声明要添加或修改 INI 文件的项目。在安装过程中,会跟踪更改并可回滚,以便在安装失败时恢复更改。这实际上就像“自动魔法“,如果操作正确,则是可靠的。
自定义操作(常见的)
它是一个巨大的头痛为了经验丰富的 MSI 开发人员看到人们依赖复杂、不可靠的自定义操作来实现功能,而这些功能最好通过内置 MSI 功能来实现。大部分 MSI 错误和回滚问题都是由错误的自定义操作引起的,而大多数其他错误都是由错误使用 MSI 设计引起的(请参阅单独的答案以了解常见 MSI 错误列表)。
除了内置的 MSI 功能外,现在可以通过新框架提供越来越多的自定义功能,例如维克斯- 使用 XML 方式编译 MSI 文件,因此对于大多数操作来说,复杂的自定义操作逻辑的需求越来越少。
微星完全支持处理 ini 文件设置、字体、环境变量、注册表项、COM 信息、快捷方式、文件扩展名、启动条件、GAC 安装、ODBC 等的合并...
维克斯进一步支持非常先进的功能例如 SQL 服务器扩展、IIS 安装和配置、性能计数器、DirectX 检查和其他游戏相关任务、.NET 本机映像生成、COM+、驱动程序、防火墙规则、PowerShell 扩展、应用程序关闭、用户、组、共享管理等等。处理起来有些复杂,但比您自己的自定义操作可靠得多。
尽可能避免自定义操作
试着客观地看待这个问题:这些内置和现成的解决方案是由最优秀的部署专家打造,而且它们是经过数千、数万甚至数百万用户的测试(适用于 MSI 本身的内置内容)。您真的认为您可以更好地制定自己的自定义操作吗? 使用自定义操作应该是一种罕见的事件,并且对于您安装的产品实现一些独特的功能是绝对必要的。而且您还必须编写适当的回滚支持,这是相当复杂的。
编写自定义操作几乎总是一个错误,但确实也存在需要灵活性的情况。一如既往,选择好战斗非常重要。一开始这可能是一个有趣的任务,但您可能会面临许多意想不到的问题并浪费大量宝贵的时间。我是认真的。我自己编写了一套 C++ 自定义操作供企业使用(以消除容易出错的 VBScript 自定义操作) - 这不是一件容易的事,虽然编码可能不是世界上最困难的,但调试、测试和连接到实际的 MSI 文件无非是极其复杂的。花一些时间研究有哪些现成的选项可能会为您节省数周的开发工作,并提高部署可靠性。
使用应用程序启动序列
一个非常重要的一点是,当你有一个可预测的运行时上下文和良好的错误处理时,很多应用程序配置应该在应用程序启动时进行,而不是在只运行一次且功能非常复杂的设置中进行。冒充,测序,调理和运行时复杂度。
您的设置不应该配置应用程序,而应该在首次启动时准备应用程序进行配置。具体来说,你的设置应该写入所有需要提升权限的设置- 写入 HKLM、注册服务、安装到每台机器的路径以及任何应用程序无法使用常规用户权限自行写入的内容。
如果你是安装开发人员,你应该主动参与编写应用程序启动序列,而不是编写安装自定义操作。至少,为了避免看起来像是在试图“推卸责任”给别人。在这个启动顺序中,您可以编写更可靠、更易于测试的代码,这些代码更容易得到 QA 人员的帮助来测试(他们通常不了解部署测试以及应用程序测试)。
设置复杂性
设置复杂性的核心在于错误是累积的(您正在管理交付过程,而不仅仅是快速重新编译),错误很难调试(无法访问发生错误的系统)目标系统状态几乎在所有可以想象到的方面都不同请参阅此答案以更深入地讨论这种复杂性以及目标系统如何以令人震惊的方式保持警惕:Windows Installer 和 WiX 的创建以及部署的复杂性(参见底部)。
WiX(对于某些用途而言是最佳的 MSI 解决方案)
读这个WiX 快速介绍有关基于 XML 的新 MSI 文件编译方法的描述。基于文本的源文件提供了比以前更好的源代码控制。这是一个免费的开源工具包,强烈推荐。
注意::请参阅本帖其他地方以快速了解常见的设计问题使用 MSI 文件 - 它非常不完整,但值得一读。我不想将它添加到此回复中,因为它不是 100% 相关的,但对于实际使用来说,这是一个至关重要的主题。
系统管理员的一些核心 MSI 信息:
(请原谅我无耻的“促销”——这是为了方便访问和检索)
以下列出一些主题链接,可能对系统管理员控制其网络部署有所帮助:
- 我该如何消除 C:\Windows\Installer 中巨大的缓存 MSI 文件?(MSI 磁盘占用率高)
- 如何加速 MSI 安装(仅几个选项)
- 如何从 setup.exe 中提取文件(值得任何管理员阅读,可能是旧闻)
- 卸载 MSI 的不同方法(卸载参考,受欢迎的- 浏览次数高)
- 处理 MSI 包时如何绕过 msiexec.exe(MSI 自动化和脚本)
- 为什么 MSI 需要原始 .msi 文件才能继续卸载?(常见问题)
- 为什么安装时进程列表中有多个 msiexec.exe 进程?它们都在做什么?
特殊操作方法主题:
- 强制升级在初始安装期间修改的文件(常见问题)
- 有没有办法让 msiexec 回显到 stdout 而不是记录到文件中(高级主题,使用 MSI 的外部 GUI,更多开发人员内容)
- 我想安装两次 MSI(实例转换或虚拟化-认真:-))。
- 如何使用 ActiveSetup 更新每个用户配置文件(有点危险,但有用)
- MSI 包中的常见错误(更多适用于开发人员,也适用于系统管理员)
- 如何调试周期性自我修复(重要议题)
概念主题/最佳实践:
- 安装程序的好处和真正目的是什么?(部署基础)
- 管理安装的目的(系统管理员的核心 MSI 操作)
- 为什么不应该使用 MSI 进行注册表调整(推荐阅读)
- 使用什么安装产品?(不同工具的优点和缺点)
- 为什么 MSI 认为自我注册有害
答案3
这个答案在很大程度上是一个正在进行的工作和粗略的概述。欢迎添加、提问和更新。此列表绝不是详尽无遗的。添加一条包含有关麻烦软件包的信息的评论。
MSI 封装中常见的问题和设计缺陷
我还必须警告,许多 MSI 文件包含错误,有时是严重的错误,但经过培训的应用程序打包人员将能够检测到这一点,并在大多数情况下消除问题。我将其作为单独的答案添加,因为它本质上回答了另一个问题,但我觉得它与同一主题相关。
MSI涉及的技术细节非常复杂。从根本上讲,它是将文件和注册表设置分解为组件(原子安装)和功能(用户可选择要安装的应用程序部分,例如词典功能)。拆分组件有许多最佳实践规则,并且 MSI 文件中的错误很多。这些错误通常通过标准化“主要升级”的使用来处理。
实际安装按照多个安装顺序进行,其中一些需要提升权限. 所有这些内容都是在数据库表中定义的,而这正是 MSI 难以理解和处理的地方。标准操作和自定义操作遍布整个安装序列。标准操作是 Microsoft 设计的,需要执行(有时可以修改顺序)。供应商可以使用自定义操作来执行 MSI 本身未涵盖的自定义逻辑。这些可以是脚本或编译形式。自定义操作可以是即时的(立即运行,不应更改系统但通常会更改)或延迟的(写入执行脚本,然后作为事务执行,从而支持回滚)。
典型错误MSI 中的内容如下(没有特定的顺序 - 而且实际上呈现得非常混乱):
- 组件创建错误(不遵循最佳实践)。这会导致修补和升级出现问题,并出现神秘症状,例如缺少文件和设置,或者修补程序因无意义的错误而失败。为了简化起见,除非文件数量巨大,否则应该每个组件使用一个文件。
- 升级问题与用户数据被覆盖或重置有关。请参阅下文了解更多详细信息。
- 自定义操作安排不正确安装序列的“事务部分”之外或错误类型的自定义操作放置不正确。这通常会导致操作在通过部署系统远程运行时失败(没有提升权限),并且回滚实际上会失效,因为只有事务操作才会回滚。Windows 安装程序事务(想想数据库事务提交)在标准操作之间运行安装初始化和安装完成在主安装顺序中以提升的权限运行。系统的所有更改都将在此事务中进行 - 任何其他更改都是错误的(但不幸的是相当常见)。
- 使用即时模式自定义操作在事务安装序列之外对系统进行更改。这会破坏回滚支持,并且通常会触发安全错误,因为无论即时模式自定义操作位于安装序列的何处,它们都不会以提升的用户权限运行。
- 导致的错误设计重复自我修复无明显原因地发生。这是有关该主题的另一篇文章,来自 installsite.org
- 自定义操作在无人值守安装模式下不遵守 GUI 抑制的程序可能会显示模态对话框,导致静默运行时部署完全失败。此问题以及静默模式和交互模式之间的整体差异在此处有更详细的描述(有些冗长和冗长):从控制面板卸载与从 .msi 中删除不同
- 一些自定义操作在错误编写的软件包中仅插入用户界面序列。这导致它们无法在静默安装模式下运行。这对于企业部署来说非常严重,因为这里几乎只使用静默安装。此问题还会影响卸载,这意味着您可能必须以交互方式运行卸载以确保所有清理自定义操作都运行。再次,请参阅上一个要点中的链接以获取有关用户界面级别的更详细描述。
- 安装程序包含不打算部署到其安装位置的文件。通常,这些文件应并排安装在 winsxs 程序集文件夹中。
- 安装速度慢这是许多人报告的 MSI 的另一个“问题”。以下是关于此主题的一些提示. 总体来说,由于安装程序在注册表中有大量注册要求,因此 Windows Installer 的开销相当大。
- 覆盖定制信息或共享数据文件。例如,如果 INI 文件是通过 File 表而不是 IniFile 表安装的,则可能会发生这种情况。在后一种情况下,它被视为“更改事务”,在前一种情况下,它是文件替换操作,这通常是错误的,除非您的 INI 文件具有非标准格式或您希望与文件一起部署的大型注释部分(某些开发人员工具很常见)。
- 这文件覆盖的复杂规则可能会导致文件被意外覆盖,或者根本不会更新 - 这是一个典型的 MSI 问题。请参阅本文以了解如何强制覆盖不会升级的文件。可以通过自定义设置稍微调整规则REINSTALLMODE 属性在 msiexec.exe 命令行级别设置(覆盖旧版本、覆盖相同版本、覆盖任何版本等...),它们对数据文件和版本化文件的工作方式不同。SDK 中的详细信息理解这一点至关重要,即使理解了,这种设计也常常会被人皱眉。
- COM 文件的自注册安装过程中可能会触发安全警告或以各种方式导致问题。请查看此文章:自行注册被认为有害。
- 文件替换问题的一个变体是重大升级(卸载并重新安装产品)卸载已修改的文件,并重新安装默认版本。在这些情况下内容看起来被恢复或覆盖了但实际上它先被卸载,然后又被重新安装。
- 使用自定义用户凭据运行的服务在重大升级情况下,用户可能会丢失其凭据,并且设置文件(似乎)恢复为默认值(实际上已被卸载并重新安装)。仅供参考:在我看来,使用用户凭据运行的服务首先是一个设计缺陷。
- 公共属性未正确从客户端传递到服务器进程,导致自定义操作无法按预期完成。这涉及更新 SecureCustomActionProperties 属性。
- 某些应用程序无法为最初安装安装程序的用户以外的其他用户正常运行。这是一个严重的设计错误,但通常可以由经验丰富的应用程序打包人员使用以下方法修复自我修复或 ActiveSetup加上HKCU 注册表项和用户配置文件。这是一个相当复杂的主题,可能需要一点黑魔法才能开始工作。记录:在我看来,真正的解决方案是更改应用程序本身,以便能够根据默认设置和从每台机器位置复制的模板或根据应用程序内部默认值(来自源代码)初始化所有每个用户的设置。
- 一些 MSI 文件弄乱了已安装文件的安全性通过为非管理员设置完全的读/写权限。有时,应用程序会因为缺少权限而停止在较新版本的 Windows 上运行。应用程序打包者经常会面临应用程序自定义权限需求的分析。通常,HKLM 或 %ProgramFiles% 中的某个位置需要一些额外的权限
- 一些安装盾以前的安装程序会在安装过程中尝试连接到互联网。这对于企业部署场景来说是非常糟糕的,因为部署受到严格控制,安装程序永远不会被允许直接从互联网下载新内容。
- 另一个网络问题是,安装程序试图显示 GUI,人们可以在其中输入在安装时通过互联网验证的数据,或者只是显示来自其网站的实时内容。这通常是电子邮件地址、联系信息、许可证密钥等。连接可能会因多种原因而完全失败,通常是由于缺少代理配置在公司环境中(没有直接连接到互联网,所有互联网流量都通过特定的缓存服务器路由,并且每个进程都需要提供凭据才能通过防火墙)。这是一篇关于通过设置验证许可证的风险的文章。
- 安装盾用于安装其运行时安装脚本语言。这先决条件设置通常包含在setup.exe中,它是一个传说中的问题根源有许多版本,存在一些不兼容性,并且有很多运行时错误过去经常发生。从版本 12(或大约这个版本)开始,此运行时现在可以可靠地安装,并且它要么编译为本机,要么以可靠的方式运行沙盒(我不确定是哪一个,一个还是另一个 - 可能是沙盒)。但是,较旧的 Installshield 设置可能会显示此部署问题。Installshield 有一个旧版支持站点,用于解决以下问题:http://consumer.installshield.com/common.asp
- 在使用非英语语言的机器上运行时,甚至在运行设置的本地化(翻译)版本在英语机器上。这可能纯粹是运行时故障,或者本地化对话框出现文本截断、格式错误、翻译错误或许多其他类型的错误,这些错误与语言本地化- 一个独立的专业领域(翻译图像中的文本、翻译软件本身、翻译营销材料、处理国际支持请求、适应操作系统中的语言设置等)。有些语言需要更改整个应用程序以适应其语言特性 - 典型的问题是字符串宏和代码页设置,后者在引入 Unicode 后不再是问题。查看翻译工具的示例截图。
- 几乎所有设置都失败了几个内置验证测试可用于测试 MSI 软件包的质量。请参阅本文作为验证的实际例子。
- 有时 MSI 升级失败是因为实际上只检查 MSI 版本号的 3 位数字在重大升级扫描期间。
- INI 文件的安装是 Windows Installer 的内置功能。可以以任何需要的方式添加、删除、合并或处理条目。但是,INI 文件作为文件而不是分段值安装的情况很常见。这可能导致 INI 文件在重新安装期间被覆盖,而不是被更新。这是一个非常常见的 MSI 问题。
- 上述问题也适用于 .NET 应用程序及其 Config.xml 文件。在这种情况下,MSI 没有内置方法来详细更新内容,您需要通过自定义操作编写更新代码或在安装时替换整个文件。Wix 可能有针对此的新功能,但 Windows Installer 引擎没有内置此功能。
还有很多更细微的错误和一些更大、更典型的问题我已经忘记了。
查看Windows 安装程序最佳实践文章来自微软。
答案4
另外,查看开源Windows 安装程序 XML,“从 XML 源代码构建 Windows 安装包的工具集。该工具集支持命令行环境,开发人员可以将其集成到构建过程中以构建 MSI 和 MSM 安装包。” MS 使用它来准备其几个主要软件包。