使用MSI文件的公司好处

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

我有这样的印象,即在用户拥有较less权限的机器上部署更容易,但不清楚细节。

msiexec.exe具有哪些function,比使用setup.exe场景更容易部署?

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

    只有几个好处:

    • 可以广告(以便按需安装可以发生)。
    • 像广告一样,只要用户尝试使用它们,就可以安装function。
    • 状态pipe理被维护,因此Windows安装程序提供了一种让pipe理员查看应用程序是否安装在机器上的方法。
    • 如果安装失败,可以回滚。

    我认为当我在企业环境中部署软件时,通过MSI部署软件几乎是件愉快的事情。 相比之下,我几乎总是发现自己害怕在另一个容器中部署软件。

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

    作为发行经理build筑工程师设置开发人员以及大型公司的应用程序打包人员部署工程师 ,我一直从事开发工作。

    这是对MSI最好的(也是最糟糕的) 概念现实世界的回顾。 在MSI文件中发现的最常见的devise问题下面作为单独的答案呈现。

    我也想build议这个MSDN文章作为一个很好的阅读: Windows Installer:系统pipe理员的好处和实现


    标准化:

    总之,微星是关于标准化的,关于处理传统安装技术的“ 部署气味 ”。 一整套糟糕的安装架构devise导致重复部署问题。

    总体而言,MSI为安装程序提供了一个全面的标准化框架其中最关键的还包括可以通过远程触发的 标准化GUI进行静默运行 的卸载和内置function和选项。

    这些function本身就是对以前的安装技术的巨大改进这些技术可以随意处理卸载和静默运行 – 这可能是企业部署最重要的function,同时还可以通过Active DirectoryMicrosoft SCCM (以前称为SMS)等专用远程pipe理工具进行可靠的远程pipe理IBM TivoliCA Unicenter等。

    随着时间的推移,这篇文章的其余部分已经有了相当大的增长,我不确定它比以前好多了。 有人从这里复制的内容,并在一些点stackoverflow.com 。 这个较旧和较短的版本可能是一个更快的阅读。 如果人们觉得这个版本更好,会很有趣。


    传统安装程序“部署气味”

    MSI通过devise积极劝阻传统的部署气味 。 这些主题将在后面的章节中讨论,但是作为一个快速列表,传统安装程序和旧版本部署技术最常见的问题是:

    • 1)他们有时会降级并覆盖共享和版本化的文件 ,而不考虑导致的死机
    • 2) 安装程序常常没有提供正确的卸载例程 ,或者没有正确可靠地完成卸载例程 – 特别是在无提示运行的情况下。 这是企业国有企业pipe理的一个非常大的问题
    • 3) 无声安装很less被正确支持。 可靠性很差,而且经常需要用对话select来logging安装的运行情况,并且这不能很好地处理意外的情况,例如在原始运行中没有logging的错误对话框或警告对话框
    • 4)安装程序没有logging安装的内容,因此没有自动的方式来validation磁盘上的文件,以检查它们是否仍然是安装程序最初安装的版本
    • 5)它们为安装可执行文件提供了不可预知的,不可靠的和非标准的命令行参数
    • 6)遵循非标准命令行和缺乏标准,难以以可靠和可预测的方式自定义具有企业部署所需特定值的安装程序
    • 7)正常用户无法运行这些安装,而且经常需要临时pipe理权限 (如果足够了,使用“run as”运行,或者以pipe理员身份login,安装然后注销 – 完整的login和configuration文件生成有时需要安装才能完成)
    • 8) setup.exe安装程序通常不会返回正确的错误代码或成功代码,有时它会立即退出,并启动另一个将完成安装的进程,从而难以确定安装是否已完成 – 尤其是通过batch file
    • 9)大多数setup.exe文件允许文件被提取,但不是以可靠的,可预测的方式 – 你通常不得不花费大量的时间find合适的开关来完成
    • 10) 伐木一般很差,而且在某些工具上是相当随意的。 使用日志文件进行debugging很less产生清晰度,但确实有所帮助
    • 11)安装程序在做什么没有透明度没有或不可靠的回滚在安装失败后撤消更改
    • 12) 没有行业标准部署共享运行时组件的 方式 ,无论它们是操作系统组件,第三方组件还是您自己的

    这个名单还有许多其他重要和公认的部署缺陷 。 很显然,在企业部署的世界里,这些问题最常出现,并导致“ 应用程序重新打包 ”业务,其中使用磁盘和registry扫描技术捕获旧版安装程序 ,以创build符合标准的MSI文件进行可靠的部署。

    应用程序重新打包是一项专业的工作 ,如果知识丰富的人员正确地完成MSI文件,通常会产生优质的MSI文件,但由于复杂的注册逻辑必须交互式运行以便某些应用程序正常工作,所以不可能重新打包所有应用程序。


    微星的好处 – 简短的总结

    通俗易懂的话来说,微星的真正重要的好处是(没有特定的顺序):

    • 1) 卸载总是可用于每个包,除非它被主动禁用
    • 2)这是相同的日志logging ,这是伟大的,标准化,虽然详细(工具,如WiLogUtl.exe可以用来分析日志文件)
    • 3) MSI文件大部分是(半)透明或“可检查”的。 例外是自定义操作 – (请参阅下面的透明度部分
    • 4)设置自定义是以标准化的方式完成( 转换
    • 5)由于安装通过Active Directory广告,组策略或远程pipe理进行升级,因此不需要混淆临时pipe理权限 。 这里有一些资格。 另请参阅组策略对象编辑器中的此屏幕截图 。
    • 6)无声安装/卸载通过pipe理工具或使用msiexec.exe运作良好
    • 7)有完整的回滚支持失败的安装。 如果您手动安装在盒子上,则需要了解一些资格 。
    • 8) MSI文件适用于一致性和逻辑有效性的检查和validation,因为它们符合数据库模式( 参见validation示例 )
    • 9)更新是标准化的types,虽然对于缺乏经验的打包商来说很复杂而且往往容易出错
    • 10)从msi中提取文件是一个内置function(查看链接的文章以便快速浏览)
    • 11) Windows安装程序命令行msiexec.exe对安装顺序的执行方式进行了非常细致的控制, 所有选项都可以与所有符合标准的MSI文件一起工作 (设置日志级别,以静默方式/交互式/半静默方式运行,设置安装参数,应用转换等)。
    • 12) 合并模块是MSI提供具有多个MSI包的共享文件的机制。 这是一个可编译的模块或安装逻辑包,可以在编译时与任何MSI包合并。 Wix已经扩展和改进了这个概念,使用了Wix包含文件 – 在我看来,这个概念优于合并模块 – 特别是对于你自己的文件(即不是OS文件)
    • 13) Windows安装程序引擎本身具有防止在安装时覆盖版本化或修改的文件的机制。 这由一个相当复杂的文件replace逻辑来控制 。 尽pipe高效和好,但是由于许多开发者在升级时面临不能覆盖其修改的configuration文件的问题,所以逻辑最终可能成为一个问题。 解决这些问题的方法通常是在应用程序devise上进行微小的改变,以避免常见的部署反模式 – 虽然这是一个很大的讨论。

    现实世界中,我发现不太成功的方面包括修补 (非常复杂), MSI-GUI (普通function,相当复杂,缺乏灵活性), 弹性 (可能会导致难以debugging重复的自我修复问题 )以及整体复杂性处理初学者的技术(有时基本操作的高度复杂性 – 例如升级,GUI和许多相互作用的细节导致意想不到的结果等等)。 由于MSI的开销增加,安装过程的速度也大大减慢。 查看一些提高MSI安装速度的提示

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


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

    MSI文件本质上是一个精简的SQL Server数据库,存储为COM结构的存储文件 – 本质上是文件系统或数据stream集合。 这是Microsoft Office文档中使用的文件types,它产生了一个可以检查检查标准格式 – 对于大型公司来说是一个巨大的问题

    除了已编译的自定义操作外,MSI文件是白色的 。 如果安装程序改变了一些疯狂的东西,比如系统的networking设置,你可以使用适当的工具来看到它。 值得注意的例外是编译自定义操作 – 这是黑匣子Windows徽标要求要求自定义操作被注释以解释他们在做什么,但安装程序开发人员经常忽略这一点。 希望Wix的到来将会改善这一点。

    为了确定这种编译的自定义动作实际上在技术意义上做了什么, 设置捕捉是必要的。 这在我的经验中几乎没有做过。 如果软件需要获得企业部署的批准,那么与供应商联系以获取信息更为常见,然后可能是阻止其使用的应用程序本身,而不仅仅是设置。

    可定制性 (转换)

    MSI可以通过转换来定制,以适应组织的需求和标准,同时仍然允许与供应商的安装程序更新的互操作性。 您不会更改安装程序本身,您可以在名为transform (.mst文件)的单独组织特定文件(数据库片段或更改事务)中创build自定义。 您可以自由地禁用自定义操作,并在一般情况下更改,覆盖或禁用安装程序中的任何内容,甚至可以添加新的东西,包括文件。 转换文件有时也用于将MSI文件本地化为不同的语言。 几个转换可以应用于单个MSI,下面是截断path示例

     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. 

    pipe理和报告

    Windows安装程序维护一个产品已经安装在registry中的所有项目的综合数据库HKEY_CLASSES_ROOT \ Installer – 不要直接改变任何东西!这也适用于专家)。

    您可以可靠地确定是否安装了产品,安装了哪些function以及安装了哪些文件版本。 此外,您可以获得已应用于基本产品的所有修补程序的列表(如果有的话)。 您可以通过API的支持Win32,COM或.NET使用各种脚本,configuration和pipe理工具,如Microsoft SCCM , IBM Tivoli , CA Unicenter等等来访问这个数据库

    安全 (临时提高的权利)

    MSI还包含“提升权利”原则 ,允许受限用户触发安装需要pipe理权限的产品。 这是“ 广告function ”的一部分,它允许pipe理员将安装程序提供给用户,而无需在所有工作站上实际安装。 安装程序本身必须在多个核心帐户上正确创作,以便使这种提升的权利概念正确工作。 用户可以自己触发产品的安装,也可以通过专用的部署系统(如SCCM,Tivoli,Unicenter(通常是大型公司))来控制安装。 没有必要混淆临时pipe理权限来使事情工作 ,而传统的安装程序往往是这样。

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

    validation

    可以使用validation规则来检查MSI文件,以确保其符合许多内部一致性规则 (称为ICE )。 公司可以创build自己的ICE检查来执行特殊的公司规则和要求。 这对QA有很大的帮助。 validation的可能原因是由于关系数据库的自引用性质和相关的数据库模式。 数据库必须内部一致,并且与外键,数据types,字段宽度,模式版本等有关的自身模式兼容。validation也超越了这一点,并且能够检测到包中的真正逻辑缺陷和错误,而不仅仅是格式和types的缺陷。 例如,它可以检测正在部署到错误目标目标的文件或文件types。

    弹性 (自我修复)

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

    这种弹性function也有一些常见的问题。 大多数pipe理员都有经验丰富的机器,具有永不停息的周期性自我修复周期 。 按照链接了解这个问题的一长串原因。 再次, 这是一个较短的版本 ,可能会更容易阅读。

    回滚

    MSI文件的安装通常会触发创build还原点 。 此外,在安装过程中replace或覆盖的所有文件和registry项将在保存并恢复(如果安装无法完成),禁止在自定义操作中完成任何更改。

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

    回滚确保即使安装失败,工作站也保持稳定状态。 实际的回滚脚本直接存储在系统驱动器上的隐藏文件夹中 – 通常为C:\ Config.MSI ,并且包含具有扩展名.RBS和.RBF – 回滚脚本文件的文件 。 正如你可能期望devise不佳的MSI文件可能会违反Windows的内置function,请参阅我的其他post以获取更多详细信息。

    有办法禁用回滚和加快安装。 通常不推荐,但这里是关于MSIFASTINSTALL属性和DISABLEROLLBACK的详细信息 。 这是一个复杂的function,但这里是一个快速回滚概述

    修补和更新

    尽pipe非常复杂,但Windows安装程序中的修补程序已完全pipe理并在系统上注册,因此可以通过检查已安装的内容来确定系统安全状态。 更新被标准化为几个基本变体,并且这允许更高程度的确定性执行更新,只要您能够处理复杂性。 部署系统将能够报告哪些更新失败以及为什么。

    在一个主观的视图中,修补对于2个基本用途来说效果很好: 1 )交付产品的小修补程序; 2 )修补已安装的产品以修复其错误的卸载序列,从而防止产品干净卸载。

    补丁只是一个 已经在使用的更新 的传递机制 。 因此,它只是一个比原来的设置本身更复杂 ,更容易出错的容器。 补丁的第一条规则是它必须比原来的MSI小,否则根本没有明显的理由提供补丁。 如果补丁针对多个产品版本,补丁可能会变得很快。

    logging (确实详细)

    Windows安装程序提供了一个标准化的日志loggingfunction ,这是比以前的化身,虽然几乎过于详细,大大优于。 可以使用日志分析器将日志文件解密,并且可以使用自定义日志级别来消除用不必要的信息生成太大的日志文件。 为了debugging目的,详细logging是非常有用的。 请参阅Rob Mensching的博客 ,阅读MSI日志文件(本质上是在日志文件中search“ value 3 ”)。 以下是执行详细日志logging的示例命令行:

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

    强烈build议您从Windows安装程序团队的 Robert Macdonald这篇文章作为MSI日志logging的实际看法: 如何解释Windows安装程序日志


    结论

    并非所有关于Windows Installer的都是好的 。 它的复杂性有时可能会让人困惑 ,但是对于大公司来说,当考虑到上述好处时,MSI文件远远优于其他任何forms的部署。

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

    为了理解新的“ 范式 ”,理解MSI意在作为对目标系统将要发生的事情的陈述性描述 ,而不是一系列固定的事件是很重要的。 我想你可以把它看作一个巨大的SQL语句 。 例如,将要添加或修改的项目声明为INI文件。 在安装运行时,跟踪更改并回滚可用,以便在安装失败时可以恢复更改。 这真的像“ automagic ”一样工作,而且正确的话可靠。

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

    对于有经验的MSI开发人员来说 ,看到人们依靠复杂的,不可靠的自定义操作来更好地实现内置MSIfunction,这是一个非常头痛的问题 。 所有MSI错误和回滚问题中的重要部分是由错误的自定义操作引起的,而其他大多数错误则是由错误使用MSIdevise引起的(请参阅单独的答案以查看常见MSI错误列表)。

    除了内置的MSIfunction之外,现在越来越多的定制function可以通过新的框架(如Wix–用于编译MSI文件的XML方法)提供,所以对于大多数操作来说,复杂的自定义操作逻辑的需求越来越less。

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

    WIX进一步支持SQL Server扩展,IIS安装和configuration,性能计数器,DirectX检查和其他游戏相关任务,.NET本地图像生成,COM +,驱动程序,防火墙规则,PowerShell扩展,应用程序closures,用户,团体,股份等等的pipe理。 有些涉及到处理,但比自己的自定义操作更可靠。

    Wix(新的和最好的MSI解决scheme)

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

    注意 :在线程中的其他地方可以快速查看MSI文件的常见devise问题 – 这是非常不完整的,但值得一读。 我不想在这个答复中加上这个答案,因为它不是100%相关的,但是对于现实世界的使用来说,这是一个至关重要的话题。


    有关系统pipe理员的核心MSI信息的其他答案:

    (赦免无耻的“促销” – 这是为了方便访问和检索)

    这里只是几个主题的链接,这些链接可能有助于系统pipe理员努力控制其networking上的部署:

    推荐的:

    • 如何消除C:\ Windows \ Installer中巨大的cachingMSI文件? (MSI使用高磁盘)
    • 如何加快MSI安装 (只是几个选项)
    • 如何从setup.exe中提取文件 (值得一读任何pipe理员,可能是旧的消息)
    • 不同的方法来卸载一个微星 (卸载参考, stream行 – 大量的意见)
    • 处理MSI包时如何绕过msiexec.exe (MSI自动化和脚本)
    • 为什么MSI要求原始的.msi文件继续进行卸载? (常见问题)
    • 为什么在安装过程中在进程列表中有多个msiexec.exe进程? 他们都在做什么?

    特别的操作方法:

    • 强制升级在初始安装期间修改的文件 (常见问题)
    • 有没有反正得到msiexec回声标准输出,而不是logging到一个文件 (高级主题,使用MSI的外部GUI,更多的开发人员的内容)
    • 我想安装一个MSI两次 (实例转换,或虚拟化 – 严重:-))。
    • 如何使用ActiveSetup更新每个用户configuration文件 (有点危险,但有用)

    debugging:

    • MSI软件包中的常见错误 (更多用于开发人员,也用于系统pipe理员)
    • 如何debugging周期性自我修复 (重要主题)

    概念主题/最佳实践:

    • 程序安装的好处和真正目的是什么? (部署的基础)
    • Wix背后的故事 – 新的MSI生成工具包 (有助于理解)
    • pipe理安装的目的 (系统pipe理员的核心MSI操作)
    • 为什么你不应该使用微星registry的调整 (推荐阅读)
    • 什么安装产品使用? (不同工具的优点和缺点)
    • 为什么在MSI中自注册被认为是有害的

    这个答案是一个正在进行的工作和一个粗略的概述。 增加,问题和更新欢迎。 这份清单绝非详尽无遗。 添加一个有关麻烦包的信息的评论。


    MSI软件包中的典型问题和devise缺陷

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

    MSI涉及的技术细节非常复杂 。 在基本级别上,它将文件和registry设置分解为组件(primefaces安装)和function(用户可选的应用程序部件以进行安装,例如字典function)。 有许多最佳实践规则来拆分组件,而且MSI文件中的错误是非常多的。 这些错误通常是通过标准化使用“主要升级”来处理的。

    实际的安装是在许多安装顺序中进行的,其中一些安装顺序较高 。 所有这些都是在数据库表中定义的,这就是MSI理解和处理非常复杂的地方。 传播整个安装序列是标准和自定义操作。 标准的行动是微软devise和需要发生(序列有时可以修改)。 自定义操作可供供应商执行自身不涵盖的自定义逻辑。 这些可以是脚本或编译forms。 自定义操作可以立即执行(一次运行,不应该改变系统,但通常是这样做)或延迟(写入执行脚本,然后作为事务执行,因此支持回滚)。

    在一个MSI中的典型错误是(没有特定的顺序 – 真正的混乱):

    • 组件创build错误 (不遵循最佳实践)。 这可能会导致修补和升级带有神秘症状的问题,比如缺less文件和设置或者出现无意义错误的补丁。 简单化一个应该使用每个组件一个文件,除非文件数量巨大。
    • 升级与覆盖或重置用户数据有关的问题 。 在下面看到更多细节。
    • 在安装顺序的“事务部分”之外的自定义操作或错误types的自定义操作的不正确的计划安排不正确。 这通常会导致通过部署系统远程运行时操作失败(没有提升的权限),并且由于只有事务操作被回滚,回滚才被有效地处理。 Windows安装程序事务 (思考数据库事务提交)在主安装顺序中的标准操作InstallInitializeInstallFinalize之间运行,以提升的权限运行 。 系统的所有变化都将发生在这个交易中 – 其他的都是错误的(但不幸的是很常见)。
    • 使用即时模式自定义操作来更改事务安装序列之外的系统 。 这打破了回滚支持,并且通常会触发安全错误,因为立即模式自定义操作不会以提升的用户权限运行,无论它们被放置在安装序列中的什么位置。
    • 错误的devise会导致重复性的自我修复循环的发生。 这里是关于这个主题的另一篇文章,来自installsite.org
    • 在无人参与安装模式下不遵守GUI的自定义操作可能会显示模式对话框,导致部署在静默运行时完全失败。 这个问题与静默模式和交互模式之间的整体差异在这里有更详细的描述(有些冗长和冗长): 从控制面板卸载不同于从.msi中删除
    • 一些错误编写的包中的自定义操作 只能插入到用户界面序列中 。 这会导致它们不能以静默安装模式运行。 这对企业部署来说是严重的,因为几乎完全使用无提示安装。 此问题也会影响卸载,这意味着您可能必须以交互方式运行卸载进行卸载,以确保运行所有清理自定义操作。 同样,请参阅前一小节中的链接以获取更长的用户界面级别的说明。
    • 该安装程序包含的文件不打算部署在他们正在安装的位置。 通常应该在winsxs汇编文件夹中并行安装的系统文件。
    • 安装速度慢是MSI多报的另一个“问题”。 这里有一些关于这个问题的提示 。 整体Windows安装程序有相当多的开销,由于在registry中安装的内容很重要的注册要求。
    • 自定义信息或共享数据文件的 覆盖 。 如果INI文件是通过File表而不是IniFile表安装的,则会发生这种情况。 在后一种情况下,它被视为“更改事务”,在前一种情况下,它是一个文件replace操作,除非您的INI文件具有非标准格式或者想要与您的文件一起部署的大型注释部分,否则通常是错误的开发者工具)。
    • 文件覆盖复杂规则可能会导致文件无意中被覆盖,或者根本不会被更新 – 这是一个经典的MSI问题。 请查阅这篇文章,了解如何强制覆盖不会升级的文件 。 这些规则可以通过在msiexec.exe命令行级设置的REINSTALLMODE属性 (覆盖旧版本,覆盖相同版本,覆盖任何版本等等)的自定义设置稍微调整,并且它们对于数据文件和版本化文件的工作方式不同。 SDK中的详细信息 。 了解这一点至关重要,而且即使在了解的情况下,这种devise也经常被忽视。
    • 在安装过程中自行注册COM文件会触发安全警告或以各种方式导致问题。 检查这篇文章: 自我注册被认为是有害的
    • 主要升级 (卸载并重新安装产品)卸载修改后的文件并重新安装默认版本时,文件replace问题的变化就是这种情况。 在这些情况下,内容看起来会被还原或覆盖 ,实际上它先被卸载然后重新安装。
    • 使用自定义用户凭据运行的服务可能会在主要升级scheme期间丢失凭据,并且会将设置文件(似乎)还原为默认值(它们确实被卸载并重新安装)。 只是为了logging:在我看来,使用用户凭据运行的服务首先是一个devise缺陷。
    • 公共属性不能正确地从客户端传递到服务器进程,从而阻止自定义操作按预期完成。 这涉及到更新SecureCustomActionProperties属性。
    • 某些应用程序无法正常运行,而不是最初安装设置的应用程序。 这是一个严重的devise错误,但通常可以由有经验的应用程序打包者使用自我修复或ActiveSetup添加HKCUregistry项和用户configuration文件来解决 。 这是一个相当复杂的主题,可能需要一些黑色艺术才能奏效。 为了logging:在我看来,真正的解决scheme是更改应用程序本身,以便能够基于从每个机器位置复制的默认设置和模板或基于应用程序内部默认值(来自源代码)。
    • 一些MSI文件通过设置非pipe理员在这里,所有地方和所有地方的完整读/写权限来扰乱已安装文件安全性 。 有时由于缺乏权限,应用程序停止在较新版本的Windows上工作。 应用程序打包者经常需要分析应用程序的自定义许可需求。 通常在HKLM或%ProgramFiles%的某处需要额外的权限
    • 当天安装的一些Installshield设置会在安装过程中尝试连接到Internet。 对于严格控制部署的企业部署scheme而言,这是非常可怕的,安装程序永远不会被允许直接从Internet下载新的内容。
    • 另一个networking问题是,当设置尝试显示一个GUI,在这个GUI中,用户input数据,在互联网上进行validation,或者只是从他们的网站上显示实时内容。 这通常是电子邮件地址,联系信息,许可证密钥等等。 连接可能由于许多原因而完全失败,通常是由于在公司环境中缺less代理configuration (没有直接连接到Internet,所有Internetstream量都通过特定的caching服务器进行路由,每个stream程需要提供通过防火墙的凭据) 。 以下是关于通过设置validation许可证的风险的文章 。
    • Installshield用于为其Installscript语言安装运行时。 这个先决条件安装程序通常包含在setup.exe中,这是一个传奇性的问题来源 。 有很多版本,有几个不兼容的地方,还有一些运行时错误 。 Since version 12 (or thereabouts) this runtime is now installed reliably, and it is either compiling to native or running sandboxed (I am not sure which, one or the other – probably sandboxed) in a reliable fashion. Older Installshield setups may display this deployment problem though. There is a legacy support site from Installshield for issues such as these: http://consumer.installshield.com/common.asp
    • Several setups can display erratic installation behavior or intermittent bugs when run on machines set up for different languages than English, or even when you run localized (translated) versions of setups on English machines. This can be purely runtime failure, or cases when the localized dialog boxes feature cut off text or erroneous formatting or faulty translation or many other types of errors relating to language localization – a whole area of expertise on its own (translate text in images, translate the software itself, translate marketing material, deal with international support requests, adaptation to the language settings in the OS, etc…). Some languages need the whole application changed to account for their language peculiarities – typical problems are string macros and code page settings, the latter being less of an issue with the introduction of Unicode. See a sample screenshot from a translation tool .
    • Almost all setups fail several of the built-in validation tests that are available to test the quality of MSI packages. See this article for a practical example of validation.
    • Sometimes upgrades fail for an MSI due to the fact that only 3 digits of the MSI's version number are actually checked during major upgrade scans.
    • The installation of INI files is a built-in feature of Windows Installer. Entries can be added, removed, merged or dealt with in any required fashion. However, it is quite common for INI files to be installed as a file instead of as segmented values. This can cause the INI file to be overwritten during reinstall, instead of being updated. A very common MSI problem.
    • The above issue is also the case for .NET application's and their Config.xml files. In this case MSI does NOT have a built-in way to update the content in a detailed way, and you either need to code the update via a custom action or replace the whole file on install. Wix may have new features for this, but the Windows Installer engine does not have this built-in.

    There are a number of more subtle errors and several larger, typical problems that I will have forgotten.

    Check out the Windows Installer Best Practice article from MSDN .

    Using MSI's also makes patching (MSP files) and upgrades easier. MSI's use the concept of unique Product and Upgrade codes which makes the whole process easier.

    Some deployment systems (CA Unicenter Software Delivery is one example) can also understand MSI's in a special way, which allows them to integrate much better into the deployment system. For example you can feed an MSI into the software library of the deployment system and it will automatically detect the various features within the product and automatically allow much more granular custom actions (Local Install, Verify, Repair etc.) and logging.

    Self-heal / repair is also a major plus for MSI's.

    Also, check out open source Windows Installer XML , "a toolset that builds Windows installation packages from XML source code. The toolset supports a command line environment that developers may integrate into their build processes to build MSI and MSM setup packages." This is used by MS to prepare several of its major software packages.

    you can do transformations – in theory you can customize a lot, if program was packaged properly by vendor you can make fully automated deployment without any interaction with end user – which is very helpful when you want to standardize your windows environment and have more then handful of computers.

    to see what people do with msis [ or unattended deployment ] visit for instance this site and it's forums.