使用MSI文件的企业利益


57

与常规setup.exe文件相比,使用.msi文件有什么优点?

我的印象是,在用户权限很少但不确定细节的机器上,部署更容易。

与使用setup.exe方案相比,msiexec.exe具有哪些功能使部署更容易?

部署.msi应用程序时有任何提示或技巧吗?

Answers:


42

仅有的一些好处:

  • 可以做广告(这样可以按需安装)。
  • 像广告一样,只要用户尝试使用功能,就可以安装它们。
  • 状态管理得到维护,因此Windows Installer提供了一种让管理员查看是否在计算机上安装了应用程序的方法。
  • 如果安装失败,则可以回滚。

我想当我在企业环境中部署软件时:通过MSI部署软件几乎很有趣。相比之下,当它在另一个容器中时,我几乎总是发现自己讨厌部署软件。

有关操作MSI安装的其他信息,请msiexec在“运行”对话框中键入。


3
+1-我在09年没有看到这个版本(我当时认为该网站可能仍处于Beta版),但我喜欢 “ ...我几乎总是觉得自己很害怕...”位。我完全有这种感觉(不过,公平地说,一些“ MSI”使我也有同样的感觉……Java……谷歌浏览器……)。
埃文·安德森

74

更新,2018年7月:以下有关堆栈溢出的信息的压缩非常摘要:MSI的主要优点"executive summary"-种类)。


我曾在开发部门担任过发行经理构建工程师设置开发人员以及大型公司的应用程序打包程序部署工程师

这是对MSI 最佳(和最差)概念实际功能的评论。MSI文件中发现的最常见的设计问题下面作为单独的答案给出。不假装不完整-实际上只是一个凌乱的“脑垃圾场”-旨在作为“书中找不到的东西”(可能是有充分的理由)。

我也想建议这篇MSDN文章作为一本好书:Windows Installer:系统管理员的好处和实现


标准化:

简而言之,MSI与标准化有关,与处理传统安装程序技术的“ 部署气味 ”有关。一整套不良的安装体系结构设计,这些问题导致重复的部署问题。

总体而言,MSI为安装程序提供了一个全面,标准化的框架并且至关重要的是框架还包括卸载和内置功能以及用于通过标准GUI进行静默运行的选项,这些GUI可以远程触发

仅这些功能就构成了对以前的安装技术的重大改进这些安装技术可以随意处理卸载和静默运行-可能是企业部署中最重要的功能,以及通过 Active Directory或专用远程管理工具(例如 Microsoft SCCM(以前称为SMS))进行可靠的远程软件包管理 IBM Tivoli CA Unicenter和类似的产品。

有人重复了此答案的先前版本。也许更快阅读?


旧版安装程序“部署有气味”

MSI 通过设计积极地阻止了传统部署的气味。这些主题将在下面的后续部分中进行讨论,但以快速列表的形式列出了传统安装程序和较旧的部署技术中最可识别的问题:

  • 1)他们有时会降级和覆盖共享和版本的文件与小的关注DLL地狱是导致
  • 2)安装程序通常没有提供正确的卸载例程,或者没有正确可靠地完成安装-尤其是在无提示的情况下。对于企业国有企业管理而言,这是一个非常大的问题
  • 3) 很少正确支持静默安装。可靠性很差,经常需要用对话框选择记录安装的运行,而这种处理不能很好地处理未在原始运行中记录的错误条件,例如错误对话框或警告对话框
  • 4)安装程序没有保留已安装内容的记录,因此没有自动方法来验证磁盘上的文件以检查它们是否仍然是安装程序最初安装的版本
  • 5)对于安装可执行文件,它们具有不可预测,不可靠和非标准的命令行参数
  • 6)从非标准命令行和缺乏标准开始,很难以可靠且可预测的方式为安装程序定制具有企业部署所需的特定值的安装程序
  • 7)普通用户无法运行这些安装,并且常常不得不弄乱临时管理员权限(如果足够的话,请使用“运行方式”,或者以管理员身份登录,安装然后注销-此完整的登录名和配置文件生成有时需要安装才能完成)
  • 8)SETUP.EXE安装程序常常不会返回正确的错误代码或成功的代码,有时它会立即退出,而另一进程的一脚,将完成安装因此很难确定是否安装完成-尤其是通过批处理文件
  • 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 Installer命令行msiexec.exe具有对执行安装顺序的非常精细的控制,并且所有选项均可与所有符合标准的MSI文件一起使用(设置日志级别,以静默方式/交互方式/半静默方式运行) ,设置安装参数,应用转换等...)。
  • 12) 合并模块是用于传递具有多个MSI包的共享文件的MSI机制。它是可消耗模块或安装逻辑束,可在编译时与任何MSI软件包合并。Wix通过使用Wix包含文件在此概念上进行了扩展和改进-我认为该概念优于合并模块-特别是对于您自己的文件(即不是OS文件)
  • 13) Windows Installer引擎本身具有防止在安装时覆盖版本或修改文件的机制。这由相当复杂的文件替换逻辑控制。尽管高效且良好,但逻辑本身最终会成为问题,因为许多开发人员都面临升级时无法覆盖修改后的配置文件的问题。解决这些问题的方法通常是在应用程序设计中进行较小的更改,以避免使用通用的部署反模式 -尽管这本身就是一个很大的讨论。

现实世界中,我发现不太成功的方面包括打补丁(非常复杂),MSI-GUI(简单功能,非常复杂,缺乏灵活性),弹性(可能会导致难以调试的重复自我修复问题)以及整体复杂性为初学者处理该技术的知识(有时基本操作的复杂性很高,例如升级,GUI和许多交互的细节会导致意外的结果等)。由于MSI开销的增加,安装过程的速度也大大降低了。请参阅一些有关提高MSI安装速度的提示

本文的其余部分将更详细地介绍MSI的某些方面。


透明度(开放安装程序格式)

MSI文件本质上是作为COM结构存储文件存储的精简SQL Server数据库 -本质上是文件或数据流集合中的文件系统。这是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"

快速参数说明:

/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 Installer会维护一个完整的数据库,其中包含产品已在注册表中安装的所有项目(HKEY_CLASSES_ROOT \ Installer-切勿直接在此处进行任何更改!这对于专家也是如此)。

您可以可靠地确定是否安装了产品,安装了哪些功能以及安装了什么文件版本。此外,您还可以获得所有已应用于基本产品的补丁程序的列表。您可以使用各种脚本,配置和管理工具(例如Microsoft SCCMIBM TivoliCA Unicenter等)通过支持Win32,COM或.NET的API来访问此数据库

担保(临时提升权利)

MSI还包含“高权限”原则,该原则允许受限制的用户触发需要管理员权限才能安装的产品的安装。这是“ 广告功能 ”的一部分,该功能使管理员可以将安装程序提供给用户,而无需实际在所有工作站上安装它们。必须在多个核心帐户上正确编写安装程序本身,此高权限概念才能正常运行。用户可以自己触发产品的安装,也可以由专用部署系统(例如SCCM,Tivoli,Unicenter(通常是大型公司))控制安装。无需弄乱临时管理员权限即可使工作正常进行 旧版安装程序通常就是这种情况。

全面的安装数据库还可以确保您全面了解已安装的修补程序,因此可以通过自动化和管理工具检测安全漏洞。

验证方式

可以使用验证规则检查MSI文件,以确保它符合许多内部一致性规则(称为ICE))。公司可以创建自己的ICE检查以执行特殊的公司规则和要求。这对质量检查有很大帮助。之所以可以进行验证,是因为关系数据库和关联的数据库模式具有自引用特性。数据库必须在内部保持一致,并在外键,数据类型,字段宽度,模式版本等方面符合其自身的模式。验证也不仅限于此,还能够检测软件包中真正的逻辑缺陷和错误。 ,而不仅仅是格式和类型缺陷。例如,它可以检测正在部署到错误目标位置的文件或文件类型。

弹性(自我修复)

Windows安装程序的管理员安装功能提供了一种从MSI提取源文件的标准方法(这是有关此主题的一些其他信息)。然后可以将这些源文件放在共享上,并可供所有工作站安装。这样可确保完成修复,卸载和修改操作,而无需请求CD或类似介质上的安装介质。对于修补和更新操作(在特殊情况下可能需要访问旧版本的源文件)而言,这尤其重要。

此弹性功能还存在一些常见问题。大多数管理员都有经验丰富的计算机,它们具有周期性的自我修复周期,而且似乎从未停止过。单击链接以获取此问题的长原因列表。同样,这是一个较短的版本,可能更易于阅读。

回滚

MSI文件的安装通常会触发还原点的创建。此外,如果安装无法完成,则所有在安装期间替换或覆盖的文件和注册表项都将被保存和恢复,除非在自定义操作中进行了任何更改。

自定义操作必须实现自己的对Windows徽标合规性的回滚支持。这通常被忽略,但是涉及创建第二个自定义操作以撤消主自定义操作所做的更改。

回滚可确保即使安装失败,工作站也可以保持稳定状态。在实际的回滚脚本保存在一个隐藏文件夹直接在系统驱动器上-一般是C:\ Config.MSI,它包含与扩展.RBS和.RBF文件- 回滚脚本文件。如您所料,设计不当的MSI文件可能会违反此处的Windows内置功能,有关更多详细信息,请参见本主题的其他文章。

有一些方法可以禁用回滚并加快安装速度。一般不建议使用,但是这里是MSIFASTINSTALL属性和DISABLEROLLBACK的详细信息。这是一个复杂的功能,但是这里是快速回滚概述

补丁与更新

尽管非常复杂,但是Windows安装程序中的修补程序已在系统中进行了完全管理和注册,因此可以通过检查已安装的内容来确定系统的安全状态。更新被标准化为一些基本的变体,并且只要您能够处理所涉及的复杂性,就可以以更高的确定性执行更新。部署系统将能够报告哪些更新失败以及原因。

从主观角度来看,修补程序对于2种基本用途非常有效1)所交付产品的小补丁,以及2)修补已安装产品以修复其错误的卸载顺序,从而阻止了产品的干净卸载。

补丁程序只是用于已经生效更新的交付机制。因此,它仅仅是一个容器,它更加复杂,而且容易出错比原来的设置本身。修补程序的首要原则是必须小于原始MSI,否则根本没有明显的理由提供修补程序。如果补丁程序针对多个产品版本,则补丁程序可能会迅速变得庞大。

记录(确实冗长)

Windows Installer提供了标准化的日志记录功能,该功能大大优于以前的版本,尽管过于冗长。可以使用日志分析器解密日志文件,并且可以使用自定义日志级别来消除生成带有不必要信息的太大日志文件。出于调试目的,详细日志记录非常有用。请参阅Rob Mensching的博客,以获取一种手动读取MSI日志文件的好方法(实际上,您在日志文件中搜索“ value 3 ”)。这是执行详细日志记录的示例命令行:

msiexec.exe /I "C:\Installer.msi" /QN /L*V "C:\msilog.log"

从这篇文章罗伯特·麦克唐纳Windows安装团队强烈建议作为MSI日志记录实际的样子:如何解读Windows安装程序日志


结论

并非Windows Installer的所有优点都可以。它的复杂性有时会令人困惑,但是考虑到上述好处,对于大型公司而言,MSI文件比任何其他形式的部署都优越得多。

新安装程序范例(庞大的SQL语句)

要理解新的“ 范式 ”,重要的是要理解MSI旨在作为对目标系统上将要发生的事情的声明性描述,而不是固定的事件序列。我想您可以将其视为一个庞大的SQL语句。例如,您声明要添加或修改到INI文件的项目。在安装过程中,将跟踪更改并提供回滚功能,以便在安装失败时可以还原更改。这确实像“ automagic ” 一样工作,并且在正确完成时是可靠的。

自定义操作(通常的嫌疑人)

这是一个巨大的头疼经历MSI开发商看到人们依靠复杂的,更符合实施了功能不可靠的自定义操作内建MSI功能。所有MSI错误和回滚问题中有很大一部分是由错误的自定义操作引起的,而大多数其他错误是由MSI设计的错误使用引起的(有关常见MSI错误的列表,请参阅单独的答案)。

除了内置的MSI功能,现在还可以通过新框架(例如Wix)来使用越来越多的自定义功能,Wix是一种用于编译MSI文件的XML方式,因此大多数操作对复杂的自定义动作逻辑的需求越来越少。

MSI完全支持处理ini文件设置,字体,环境变量,注册表项,COM信息,快捷方式,文件扩展名,启动条件,GAC安装,ODBC等的合并。

WIX进一步支持非常高级的功能,例如SQL Server扩展,IIS安装和配置,性能计数器,DirectX检查和其他与游戏相关的任务,.NET本机映像生成,COM +,驱动程序,防火墙规则,PowerShell扩展,应用程序关闭,用户,组,共享等的管理。涉及到一些处理,但是比您自己的自定义操作可靠得多。

尽可能避免自定义操作

试着看待这些问题:这些内置的现成的解决方案由可用的最佳部署专家制作的,并且已经过成千上万,甚至数百万个用户的测试(对于MSI中的内置组件)本身)。您是否真的认为可以做一些更好的自定义操作? 使用自定义动作应该很少见,并且绝对有必要实现所安装产品的独特功能。而且,您还必须编写适当的回滚支持,这非常复杂。

编写自定义动作几乎总是一个错误,但是在某些情况下,您确实也需要灵活性。一如既往,重要的是要做好战斗。刚开始时这可能是一个有趣的任务,但是您可能会面临许多意外问题并浪费大量的时间。我的意思是非常认真的。我自己编写了一套供企业使用的C ++定制操作(以消除容易出错的VBScript定制操作)-无需走动,尽管编码可能并不是世界上最困难的,但调试和测试以及连接到实际的MSI文件非常容易。花费一些时间研究可用的现成选项可能会节省您数周的开发工作,并提高部署可靠性。

使用应用程序启动顺序

非常重要的一点是,当您具有可预测的运行时上下文和良好的错误处理时,应在应用程序启动时进行许多应用程序配置,而不能在仅运行一次且具有非常复杂的模拟排序调节运行时功能的设置中进行配置复杂性

您的设置不应配置应用程序,而应在首次启动时准备好要配置的应用程序具体来说,您的设置应写入所有需要提升权限的设置 -写入HKLM,注册服务,安装到每机器路径以及应用程序无法使用常规用户权限自行写入的所有此类内容。

如果您是安装开发人员,则应该提供参与编码应用程序启动顺序的知识,而不是编写安装自定义操作。如果没有别的,为了避免看起来像您在试图“推卸责任”给别人。在此启动序列中,您可以编写更加可靠和可测试的代码,这些代码更容易从质量检查人员那里获得测试的帮助(他们通常不了解部署测试以及应用程序测试)。

设置复杂度

设置复杂性的核心在于以下事实:错误是累积性的(您正在管理交付过程,而不仅仅是快速重新编译),错误很难调试(无法访问发生错误的系统)和目标系统。州在几乎可以想象的各个方面都有不同。请参阅此答案,以更全面地讨论这种复杂性以及目标系统可能如何以令人震惊的多种方式进行警惕:Windows Installer和WiX的创建以及“部署的复杂性”(请参阅底部)。

WiX(出于某些目的的最佳MSI解决方案)

阅读此WiX快速介绍,以描述基于XML的新MSI文件编译方法。基于文本的源文件提供了比以前更好的源代码控制。这是一个强烈推荐的免费开源工具包。

注意:请参见线程中的其他内容,以快速了解MSI文件的常见设计问题 -它非常不完整,但值得一读。我不想在答复中添加该内容,因为它与100%无关,但是对于现实世界而言,这是一个至关重要的话题。


系统管理员的一些核心MSI信息:

(请原谅无耻的“促销”-以便于访问和检索)

以下是一些指向主题的链接,这些链接可能对系统管理员控制网络部署的工作有所帮助:

特别的操作方法主题:

概念主题/最佳实践:


24

这个答案很大程度上是一个正在进行的工作,并且是一个粗略的概述。欢迎添加,问题和更新。此列表绝不是详尽无遗的。添加有关麻烦软件包信息的注释。


MSI软件包中出现的典型问题和设计缺陷

我还必须警告许多MSI文件包含错误,有时甚至是严重的错误,但是受过训练的应用程序打包程序将能够检测到此错误,并且在大多数情况下,可以消除此问题。我将其添加为单独的答案,因为它本质上回答了一个不同的问题,但是我认为它在同一线程中是相关的。

MSI中涉及的技术细节非常复杂。从根本上讲,它是关于将文件和注册表设置分解为组件(原子安装)和功能(用户可选的要安装的应用程序部件,例如词典功能)。有许多用于拆分组件的最佳实践规则,并且此处的MSI文件中的错误很多。这些错误通常通过标准化“重大升级”的使用来处理。

实际安装按许多安装顺序执行,有些安装顺序具有较高的权限。所有这些事情都是在数据库表中定义的,而这正是MSI难以理解和处理的地方。贯穿安装顺序的是标准操作和自定义操作。这些标准动作是Microsoft设计的,需要执行(有时可以更改顺序)。供应商可以使用自定义操作来执行MSI本身未涵盖的自定义逻辑。这些可以是脚本形式也可以是编译形式。自定义操作可以是立即的(立即运行,不应更改系统,但经常会更改)或推迟(写入执行脚本,然后将其作为事务执行,从而支持回滚)。

MSI中的典型错误是(没有特定的顺序,并且实际上是一团糟):

  • 组件创建错误(不遵循最佳实践)。这可能会导致带有神秘症状的修补和升级问题,例如丢失的文件和设置或修补程序,这些修补程序因无意义的错误而爆发。为了简化起见,每个组件应使用一个文件,除非文件数量很大。
  • 与用户数据被覆盖或重置有关的升级问题。请参阅下面的更多详细信息。
  • 的自定义动作不正确的调度安装序列或错误类型的自定义动作的“交易部分的”外部不正确放置。当通过部署系统远程运行时,这通常会导致操作失败(没有提升的权限),并且由于仅回退了已处理的操作,因此回滚实际上受到了破坏。Windows Installer事务(认为​​数据库事务提交)在主安装序列中的标准操作InstallInitializeInstallFinalize之间运行,以提升的权限运行。系统的所有更改都将在此事务中进行-其他任何事情都是错误的(但不幸的是很普遍)。
  • 使用即时模式自定义动作在交易的安装顺序之外对系统进行更改。这会中断回滚支持,并且通常会触发安全性错误,因为即时模式自定义操作不会以提升的用户权限运行,无论它们在安装顺序中的位置如何。
  • 错误的设计会导致重复的自我修复循环,而没有明显的原因。这是来自installsite.org的与此主题有关的另一篇文章
  • 在无人参与的安装模式下不遵守GUI禁止的自定义操作可能会显示模式对话框,导致静默运行时部署完全失败。此问题以及静默模式和交互模式之间的总体差异在此处(详细说明和冗长的内容)中进行了详细描述:从“控制面板”中卸载与从.msi中删除是不同的
  • 错误编写的程序包中的某些自定义操作仅在用户界面序列插入。这将导致它们不能在静默安装模式下运行。这对于公司部署很重要,因为此处几乎完全使用静默安装。此问题也可能影响卸载,这意味着您可能必须交互式运行卸载才能确保所有清理自定义操作都运行。同样,请参见上一个项目符号中的链接,以获取有关用户界面级别的详细说明。
  • 该安装程序包含不打算在其安装位置部署的文件。通常,应在winsxs程序集文件夹中并排安装的系统文件。
  • 安装速度慢是许多MSI报告的另一个“问题”。以下是有关该主题的一些技巧。总体Windows Installer具有相当大的开销,这是由于注册表中要安装的内容的注册要求很高。
  • 覆盖定制信息或共享数据文件。例如,如果通过文件表而不是IniFile表安装了INI文件,则会发生这种情况。在后一种情况下,它被视为“更改事务”,在前一种情况下,它是文件替换操作,除非您的INI文件具有非标准格式或要与文件一起部署的大注释部分,否则通常是错误的。开发者工具)。
  • 文件覆盖复杂规则可能导致文件被无意覆盖,或者根本不被更新-这是一个经典的MSI问题。查看本文,了解如何强制覆盖无法升级的文件。可以通过在msiexec.exe命令行级别设置的REINSTALLMODE属性的自定义设置来稍微调整规则(覆盖较旧的版本,覆盖相同的版本,覆盖任何版本等),并且它们对于数据文件和版本化文件的工作方式也不同。SDK中的详细信息。理解这一点至关重要,即使理解,它也是经常皱眉的设计。
  • 在安装过程中对COM文件进行自注册会触发安全警告或以各种方式引起问题。检查本文:自注册被认为是有害的
  • 主要升级(卸载并重新安装产品)卸载修改的文件并重新安装默认版本时,文件替换问题会有所不同。在这些情况下实际上先卸载然后重新安装的内容看起来已还原或覆盖
  • 使用自定义用户凭据运行的服务在主要升级方案中可能会丢失其凭据,并且设置文件(显示为)将恢复为默认设置(实际上已将其卸载并重新安装)。仅作记录:在我看来,使用用户凭据运行的服务首先是设计缺陷。
  • 公共属性未正确从客户端传递到服务器进程,从而阻止自定义操作按预期完成。这涉及更新SecureCustomActionProperties属性。
  • 除最初安装安装程序的用户外,某些应用程序无法对其他用户正常运行。这是一个严重的设计错误,但是通常可以由经验丰富的应用程序打包程序使用自我修复或ActiveSetup来添加HKCU注册表项和用户配置文件来解决。这是一个非常复杂的主题,可能需要一些妖术才能起作用。作为记录:我认为,真正的解决方案是更改应用程序本身,以能够基于默认设置和从每台计算机复制的模板或基于应用程序内部默认设置(从应用程序内部默认设置)初始化所有按用户设置。源代码)。
  • 一些MSI文件通过在这里,那里和其他地方为非管理员设置完整的读/写权限,从而破坏了已安装文件安全性。其他时候,由于缺少权限,应用程序停止在Windows的较新版本上运行。应用程序打包人员经常会分析应用程序的自定义权限需求。通常,HKLM或%ProgramFiles%中的某处需要一些额外的许可
  • 过去,某些Installshield设置会在安装过程中尝试连接到Internet。对于严格控制部署的公司部署方案,这将是可怕的,并且永远不允许安装程序直接从Internet下载新内容。
  • 另一个网络问题是,当安装程序试图显示一个GUI时,人们可以在安装时输入经过Internet验证的数据,或者仅显示其网站上的实时内容。通常是电子邮件地址,联系信息,许可证密钥等。连接可能由于许多原因而完全失败,通常是由于公司环境中缺少代理配置所致(没有直接连接到Internet,所有Internet通信都通过特定的缓存服务器进行路由,并且每个进程都需要提供凭据才能通过防火墙) 。这是一篇有关通过安装程序验证许可证的危险的文章
  • Installshield用于为其Installscript语言安装运行时。该必备安装程序通常包含在setup.exe中,它是传说中的问题根源。版本很多,不兼容,并且经常发生运行时错误。从版本12(或更高版本)开始,现在已可靠地安装了此运行时,并且该运行时库已以可靠的方式编译到本机或运行沙箱(我不确定哪个或另一个(可能是沙箱))。较旧的Installshield设置可能会显示此部署问题。Installshield有一个旧版支持站点,用于解决以下问题:http : //consumer.installshield.com/common.asp
  • 当在使用英语以外的其他语言设置的计算机上运行时,甚至在英语计算机上运行本地化(翻译)版本的安装程序时,多个安装程序可能会显示不稳定的安装行为或间歇性错误。这可能纯粹是运行时故障,也可能是本地化对话框功能中断文本,格式错误或翻译错误或与语言本地化有关的许多其他类型错误的情况-自己的整个专业领域(翻译图像中的文本,翻译软件本身,翻译市场材料,处理国际支持请求,适应OS中的语言设置等)。某些语言需要更改整个应用程序以考虑其语言特性-典型的问题是字符串宏和代码页设置,后者与Unicode引入无关紧要。请参阅翻译工具中的示例屏幕截图
  • 几乎所有设置都无法通过一些可用于测试MSI软件包质量的内置验证测试。有关验证的实际示例,请参见本文
  • 有时,由于在大型升级扫描期间实际上只检查MSI版本号的3位,因此MSI升级失败。
  • INI文件的安装是Windows Installer的内置功能。可以以任何所需的方式添加,删除,合并或处理条目。但是,将INI文件作为文件而不是分段值安装是很普遍的。这可能会导致INI文件在重新安装期间被覆盖,而不是被更新。一个非常常见的MSI问题。
  • .NET应用程序及其Config.xml文件也存在上述问题。在这种情况下,MSI没有内置的方式来详细更新内容,您要么需要通过自定义操作对更新进行编码,要么在安装时替换整个文件。Wix可能为此具有新功能,但是Windows Installer引擎没有此内置功能。

我会忘记许多更细微的错误和一些较大的典型问题。

请查阅MSDN上Windows Installer最佳实践文章。


5

使用MSI还可以使修补(MSP文件)和升级变得更加容易。MSI使用独特的产品和升级代码的概念,这使整个过程更加容易。

某些部署系统(CA Unicenter Software Delivery是一个示例)也可以以特殊的方式理解MSI,这使它们可以更好地集成到部署系统中。例如,您可以将MSI馈送到部署系统的软件库中,它将自动检测产品中的各种功能,并自动允许进行更精细的自定义操作(本地安装,验证,修复等)并进行日志记录。

自修复/修复也是MSI的一大优势。


2

另外,请查看开放源代码Windows Installer XML,它是“一个从XML源代码构建Windows安装程序包的工具集。该工具集支持命令行环境,开发人员可以将其集成到其构建过程中以构建MSI和MSM安装程序包。” MS使用它来准备其几个​​主要软件包。


0

您可以进行转换-理论上您可以自定义很多内容,如果程序由供应商正确打包,则可以进行全自动部署而无需与最终用户进行任何交互-当您要标准化Windows环境并拥有更多功能时,这将非常有用的计算机。

以了解人们对msis [或无人值守的部署]的处理方式,例如访问站点及其论坛。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.