Fro*_*rud 59 deployment windows-installer logging patch msi
与常规 setup.exe 文件相比,使用 .msi 文件有哪些优势?
我的印象是在用户权限很少的机器上部署更容易,但不确定细节。
msiexec.exe 有哪些功能使部署比使用 setup.exe 方案更容易?
部署 .msi 应用程序时有什么提示或技巧吗?
Ste*_*mul 77
更新,2018 年 7 月:stackoverflow 上提供了以下信息的极其压缩的摘要:MSI 的主要优点 ("executive summary"各种)。
我曾在大型公司担任过发布经理、构建工程师、安装开发人员以及应用程序打包员和部署工程师的开发工作。
这是对 MSI的最佳(和最差)概念和现实世界功能的回顾。在 MSI 文件中发现的最常见的设计问题在下面作为单独的答案提供。不假装完整——实际上只是一个凌乱的“脑残粉”——意为“那些在书中找不到的东西”(可能有充分的理由)。
我还想推荐这篇MSDN 文章作为一个很好的阅读:Windows Installer: Benefits and Implementation for System Administrators。
总之,MSI 是关于标准化,是关于处理遗留安装程序技术的“部署气味”。导致重复部署问题的一系列不良安装架构设计。
总体微星提供了一个全面的,标准化的框架,用于安装程序,其中关键的是还包括卸载和内置功能和选项静音运行与标准化GUI可以远程触发。
仅这些功能就构成了对以前处理随意卸载和静默运行的安装技术的巨大改进——这可能是企业部署以及通过Active Directory或专用远程管理工具(如Microsoft SCCM(以前称为 SMS))进行可靠的远程包管理的最重要的功能, IBM Tivoli、 CA Unicenter等。
有人复制了此答案的先前版本。也许更快的阅读?
MSI通过设计积极阻止遗留部署气味。这些主题将在下面的后面部分讨论,但作为快速列表,遗留安装程序和旧部署技术最容易识别的问题是:
列表中还有许多其他重要且公认的部署缺陷。显然,这些问题最常出现在企业部署领域,并导致了“应用程序重新打包”业务,其中使用磁盘和注册表扫描技术捕获旧安装程序以创建符合标准的 MSI 文件用于可靠部署。
应用程序重新打包是一项专业工作,如果由知识渊博的人正确完成,通常会产生高质量的 MSI 文件,但由于复杂的注册逻辑,必须以交互方式运行某些应用程序才能工作,因此不可能重新打包所有应用程序。
在朴实的语言MSI的真正重要的好处是(排名不分先后):
在现实世界中,我发现不太成功的方面包括修补(非常复杂)、MSI-GUI(简单功能、相当复杂、缺乏灵活性)、弹性(可能导致难以调试的重复自我修复问题)以及整体复杂性处理初学者的技术(有时基本操作的高度复杂性 - 例如升级、GUI 和许多交互细节会导致意外结果等......)。由于 MSI 的开销增加,安装过程的速度也显着降低。查看一些提高 MSI 安装速度的技巧。
文本的其余部分更详细地介绍了 MSI 的某些方面。
MSI 文件本质上是一个精简的SQL-Server 数据库,存储为COM 结构的存储文件- 本质上是文件中的文件系统或数据流的集合。这是Microsoft Office 文档中使用的文件类型,它产生了一种可以进行审查和检查的标准格式——这对大公司来说是一个大问题。
除了已编译的自定义操作之外,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"
Run Code Online (Sandbox Code Playgroud)
快速参数说明:
/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.
Run Code Online (Sandbox Code Playgroud)
Windows Installer维护了一个包含产品在注册表中安装的所有项目的综合数据库(HKEY_CLASSES_ROOT\Installer - 切勿直接更改此处的任何内容!专家也一样)。
您可以可靠地确定是否安装了产品、安装了哪些功能以及安装了哪些文件版本。此外,您可以获得已应用于基本产品的任何补丁的列表(如果有)。您可以通过支持 Win32、COM 或 .NET 的 API使用各种脚本、配置和管理工具(例如Microsoft SCCM、IBM Tivoli、CA Unicenter等)访问此数据库...
MSI 还包含“提升权限”原则,允许受限用户触发需要管理员权限才能安装的产品的安装。这是“广告功能”的一部分,它允许管理员向用户提供安装程序,而无需在所有工作站上实际安装它们。安装程序本身必须在多个核心帐户上正确创作,此提升的权限概念才能正常工作。用户可以自己触发产品的安装,或者安装可以由专用部署系统控制,例如 SCCM、Tivoli、Unicenter(通常是较大的公司)。没有必要弄乱临时管理员权限来使事情正常进行 旧版安装程序通常就是这种情况。
全面的安装数据库还可确保您全面了解已安装的补丁,因此可以通过自动化和管理工具检测安全漏洞。
可以使用验证规则检查 MSI 文件,以确保它符合许多内部一致性规则(称为ICE)。公司可以创建自己的 ICE 检查来执行特殊的公司规则和要求。这对 QA 有很大帮助。之所以可能进行验证是由于关系数据库和关联数据库模式的自引用性质。数据库必须在外键、数据类型、字段宽度、模式版本等方面在内部保持一致并符合其自己的模式......验证也超越了这一点,能够检测包中的真正逻辑缺陷和错误,不仅仅是格式和类型缺陷。例如,它可以检测部署到错误目标目的地的文件或文件类型。
Windows 安装程序的管理员安装功能提供了一种从 MSI 中提取源文件的标准方法(这里是有关此主题的一些附加信息)。然后可以将这些源文件放在共享上并可供所有工作站使用以进行安装。这可确保修复、卸载和修改操作完成,而无需请求 CD 或类似物上的安装介质。这对于在特殊情况下可能需要访问旧版本源文件的修补和更新操作尤其重要。
此弹性功能也存在常见问题。大多数管理员都经历过机器具有似乎永远不会停止的周期性自我修复周期。按照链接查看此问题的一长串原因。再说一次,这是一个更短的版本,可能更容易阅读。
MSI 文件的安装通常会触发还原点的创建。此外,如果安装未能完成,所有在安装过程中替换或覆盖的文件和注册表项都将被保存和恢复,除非在自定义操作中进行任何更改。
自定义操作必须为 Windows 徽标合规性实现自己的回滚支持。这通常被忽略,但涉及创建第二个自定义操作以撤消主自定义操作所做的更改。
回滚确保工作站保持稳定状态,即使安装失败。在实际的回滚脚本保存在一个隐藏文件夹,直接在系统驱动器上-一般是C:\ Config.MSI,它包含与扩展.RBS和.RBF文件-回滚脚本文件。正如您可能预期设计不佳的 MSI 文件可能会违反 Windows 的内置功能,请参阅我在此线程中的另一篇文章了解更多详细信息。
有多种方法可以禁用回滚并加快安装速度。通常不推荐使用,但这里有关于 MSIFASTINSTALL 属性和 DISABLEROLLBACK 的详细信息。这是一个复杂的功能,但这里有一个快速回滚概述。
尽管非常复杂,但 Windows 安装程序中的修补程序是在系统上完全管理和注册的,因此可以通过检查已安装的内容来确定系统安全状态。更新被标准化为几个基本变体,这允许以更高的确定性执行更新,前提是您能够处理所涉及的复杂性。部署系统将能够报告哪些更新失败以及原因。
从主观角度来看,修补有两种基本用途:1 ) 交付产品的小修补程序,以及2 ) 修补已安装的产品以修复其错误的卸载顺序,从而阻止产品完全卸载。
补丁只是已经在运行的更新的一种传送机制。因此,它只是一个比原始设置本身更复杂和更容易出错的容器。补丁的首要规则是它必须小于原始 MSI,否则根本没有明显的理由来提供补丁。如果一个补丁针对多个产品版本,它会很快变得庞大。
Windows Installer 提供了一个标准化的日志记录功能,虽然几乎过于冗长,但它比以前的版本大大优越。可以使用日志分析器破译日志文件,并且可以使用自定义日志级别来避免生成包含不必要信息的过大日志文件。出于调试目的,详细日志记录非常有用。有关读取 MSI 日志文件的良好手动方法,请参阅Rob Mensching 的博客(实际上,您在日志文件中搜索“值 3 ”)。这是一个执行详细日志记录的示例命令行:
msiexec.exe /I "C:\Installer.msi" /QN /L*V "C:\msilog.log"
Run Code Online (Sandbox Code Playgroud)
从这篇文章罗伯特·麦克唐纳从Windows安装团队强烈建议作为MSI日志记录实际的样子:如何解读Windows安装程序日志。
Windows Installer 并非一切都好。它的复杂性有时令人费解,但对于大公司而言,当您考虑到上述好处列表时,MSI 文件远远优于任何其他形式的部署。
要理解新的“范式”,重要的是要理解 MSI 旨在作为目标系统上将要发生的事情的声明性描述,而不是固定的事件序列。我想您可以将其视为一个巨大的 SQL 语句。例如,您声明要添加或修改到 INI 文件的项目。在安装运行时跟踪更改并可以回滚,以便在安装失败时可以恢复更改。这真的像“自动魔术”一样工作,并且在正确完成时是可靠的。
对于经验丰富的 MSI 开发人员来说,看到人们依赖复杂的、不可靠的自定义操作来实现功能,而这些功能可以通过内置的 MSI 功能更好地实现,这让他们非常头疼。所有 MSI 错误和回滚问题的很大一部分是由错误的自定义操作引起的,而大多数其他错误是由错误使用 MSI 设计引起的(常见 MSI 错误列表请参见单独的答案)。
除了内置的 MSI 功能外,现在越来越多的自定义功能可以通过Wix等新框架使用- 编译 MSI 文件的 XML 方式,因此大多数操作对复杂的自定义操作逻辑的需求越来越少。
MSI完全支持处理 ini 文件设置、字体、环境变量、注册表项、COM 信息、快捷方式、文件扩展名、启动条件、GAC 安装、ODBC 等的合并...
WIX进一步支持非常高级的功能,例如 SQL 服务器扩展、IIS 安装和配置、性能计数器、DirectX 检查和其他游戏相关任务、.NET 本机图像生成、COM+、驱动程序、防火墙规则、PowerShell 扩展、应用程序关闭、管理用户、组、共享等等。有点需要处理,但比您自己的自定义操作可靠得多。
试着把它放在正确的角度:这些内置和现成的解决方案是由最好的部署专家提供的,并且经过数千、数万甚至数百万用户的测试(对于 MSI 中的内置内容)本身)。你真的认为你可以更好地制作自己的自定义动作吗? 使用自定义操作应该是一个罕见的事件,并且绝对有必要为您安装的产品实现一些独特的东西。并且您还必须编写适当的回滚支持,这非常复杂。
编写自定义操作几乎总是一个错误,但也有真正需要灵活性的真实情况。与往常一样,选择好你的战斗很重要。起初这可能是一项有趣的任务,但您可能会面临许多意想不到的问题并浪费大量宝贵的时间。我的意思很严重。我自己编写了一套 C++ 自定义操作供企业使用(以消除容易出错的 VBScript 自定义操作)——这不是在公园里散步,虽然编码可能不是世界上最困难的,但调试和测试和连接到实际的 MSI 文件非常复杂。花些时间研究可用的现成选项可能会为您节省数周的开发工作,并产生更高的部署可靠性。
非常重要的一点是,当您拥有可预测的运行时上下文和良好的错误处理时,应在应用程序启动时进行大量应用程序配置,而不是在只运行一次且具有非常复杂的模拟、排序、调节和运行时的设置中进行。复杂性。
您的设置不应该配置应用程序,它应该在首次启动时准备应用程序进行配置。具体来说,您的设置应该编写所有需要提升权限的设置- 写入 HKLM、注册服务、安装到每台机器路径以及应用程序无法使用常规用户权限自行编写的任何此类内容。
如果您是设置开发人员,您应该主动参与编写应用程序启动序列的编码,而不是编写设置自定义操作。如果不出意外,为了避免看起来像是在试图“推卸责任”给其他人。在这个启动序列中,您可以编写更可靠和可测试的代码,更容易从 QA 人员那里获得帮助进行测试(他们通常不了解部署测试以及应用程序测试)。
设置复杂性的核心围绕以下事实:错误是累积性的(您正在管理交付过程,而不仅仅是快速重新编译),错误很难调试(无法访问发生错误的系统),以及目标系统州在几乎所有可以想象的方面都不同。请参阅此答案以更深入地讨论这种复杂性以及目标系统如何以多种方式保持警惕:Windows 安装程序和 WiX 的创建,以及部署的复杂性(见底部)。
阅读此WiX 快速介绍,了解基于 XML 的新方法来编译 MSI 文件。基于文本的源文件提供了比以前更好的源代码控制。这是一个免费的开源工具包,强烈推荐。
注意:有关MSI 文件常见设计问题的快速概述,请参阅线程中的其他地方- 它非常不完整,但应该值得一读。我不想将其添加到此回复中,因为它不是 100% 相关的,但对于现实世界的使用,它是一个关键主题。
(原谅无耻的“宣传”——为了方便访问和检索)
以下是一些可能有助于系统管理员控制网络部署的主题的链接:
特殊的操作方法主题:
概念主题/最佳实践:
Mat*_*son 43
只是一些好处:
我认为当我在企业环境中部署软件时:通过 MSI 部署软件几乎是令人愉快的。相比之下,我几乎总是发现自己害怕在另一个容器中部署软件。
有关操作 MSI 安装的一些其他信息,请msiexec在“运行”对话框中键入。
Ste*_*mul 26
这个答案在很大程度上是一项正在进行的工作和一个粗略的大纲。欢迎补充、提问和更新。这份清单绝不是详尽无遗的。添加带有麻烦包信息的注释。
我还必须警告说,许多 MSI 文件包含错误,有时是严重的错误,但经过培训的应用程序打包人员将能够检测到这一点,并在大多数情况下消除问题。我将此添加为单独的答案,因为它本质上回答了一个不同的问题,但我觉得它在同一线程中是相关的。
MSI涉及的技术细节非常复杂。在基本层面,它是关于将您的文件和注册表设置分解为组件(原子安装)和功能(用户可选择安装的应用程序部分,例如字典功能)。拆分组件有许多最佳实践规则,此处 MSI 文件中的错误很多。这些错误通常通过标准化使用“主要升级”来处理。
实际安装按多个安装顺序执行,其中一些具有提升的权限。所有这些都在数据库表中定义,这就是 MSI 非常难以理解和处理的地方。贯穿整个安装序列的是标准操作和自定义操作。标准操作是 Microsoft 设计的并且需要执行(有时可以修改顺序)。供应商可以使用自定义操作来执行 MSI 本身未涵盖的自定义逻辑。这些可以是脚本或编译形式。自定义操作可以是立即的(立即运行,不应更改系统但经常会更改)或延迟的(写入执行脚本,然后作为事务执行并因此支持回滚)。
MSI 中的典型错误是(没有特定的顺序 - 实际上呈现为一团糟):
我会忘记一些更细微的错误和几个更大的典型问题。
查看来自MSDN的Windows Installer 最佳实践文章。
使用 MSI 还使修补(MSP 文件)和升级更容易。MSI 使用独特的产品和升级代码的概念,这使得整个过程更容易。
一些部署系统(CA Unicenter Software Delivery 就是一个例子)也可以以一种特殊的方式理解 MSI,这使得它们能够更好地集成到部署系统中。例如,您可以将 MSI 输入到部署系统的软件库中,它会自动检测产品中的各种功能,并自动允许更精细的自定义操作(本地安装、验证、修复等)和日志记录。
自我修复/修复也是 MSI 的一大优势。
| 归档时间: |
|
| 查看次数: |
15840 次 |
| 最近记录: |