WIX安装程序:阻止在Windows Server 2012 R2上安装

时间:2018-04-05 18:29:33

标签: wix windows-installer installer windows-server-2012-r2 windows-server-2016

我有一个WIX项目,只能安装在Windows Server 2016(或更新版本)上。

查看Microsoft文档,VersionNT:

Windows Server 2016是603, Windows Server 2012是602。

从未提及过适用于Windows Server 2012R2的VersionNT。

当我使用以下代码行时:

<Condition Message="!(loc.RequireServer2016)"><![CDATA[INSTALLED OR (VersionNT >= 603)]]></Condition>

它仍然允许我在Windows Server 2012R2上安装。

如何将我的软件安装限制为仅限Server 2016并阻止它在Server 2012R2上安装?

2 个答案:

答案 0 :(得分:2)

INSTALLED应为InstalledProperties are case sensitive你肯定必须在你的情况下解决这个问题 - 否则这部分情况将永远不会成立 - 即使产品已安装。

其余的情况实际上看起来不错。只是一些想法来确定错误:

  1. WiX源元素 :您确定已将此条件包含在WiX源中的正确位置吗?

  2. 无版本 :对Windows 10中检测到操作系统版本的方式进行了大量更改。我不知道这是否也会影响Windows Server 2012R2

    • 似乎总的想法是Windows现在是#green;常青无版本&#34; (对于一个术语来说这是怎么回事) - 意味着VersionNT根本不一定报告操作系统的正确版本!
    • 请阅读此答案,而不是重复此处的内容: Windows 10 not detecting on installshield
  3. 为了确定VersionNT在您的设置中的真正价值,我将使用以下两种方法之一在运行时检查属性。后一个选项(日志记录)通常更快更容易,而第一个选项允许您在设置运行时评估复杂条件,并使用Session.EvaluateCondition method在运行时显示它们是真还是假(我使用此方法)当条件复杂且令人困惑时调用,我想要一些运行时证明它们的行为与我期望的一样):

    1. 属性调试器VBScript :我有一个属性调试器VBScript,用于在运行时为MSI文件显示一堆属性值,并评估条件运行时显示它们是否评估为真 - 如上所述。如果我是你,我会使用这样的脚本在运行时显示VersionNT(以及你要检查的任何其他属性或条件)。

      • It is recommended that you don't use VBScript for production setups - debugging only 的。 Rob WiX创建者 - 我同意他所有的反脚本论点,但我个人仍然认为VBScript对于调试很有用 - 快速,简单和没有编译的嵌入式源代码。设置一个完整的编译自定义操作只是为了检索一些属性进行测试是非常耗时的(使用&#34;真正的代码&#34;例如C ++),调试会更好,更容易。
      • 在企业环境中,由于嵌入式源,VBScript已经有很多用处 - 您总能找到嵌入在MSI中的真实自定义操作源 - 对于您编译的源代码的编译自定义操作不是这样来自可能无法使用(由于所有技术的固有混乱 - 在现实世界中) - 这确实非常糟糕。
      • 另一个好处是VBScripts的简单性以及企业应用程序打包器如何比C ++ / C#更好地掌握复杂性。但是整体脚本自定义操作总是会引起Rob提到的问题(反病毒阻塞,调试不佳以及没有正确错误处理的低成本编码)。
      • 至关重要的是,您将在企业部署方案中控制安全软件/防病毒。您可以以合理的方式处理问题并调整问题,直到程序包可靠地部署。
      • 最后,企业桌面是国有企业 - 标准化平台,其变化程度远低于普通PC (可能会出现更多变化的状态,因此会出现更多部署问题)。
      • 真正的问题基本上是自定义操作,它们非常容易出错:Why is it a good idea to limit the use of custom actions in my WiX / MSI setups?我想要的信息比你需要的多得多。 故事的寓意对我来说是:使用最快速完成工作的任何东西,但不要认为脚本对于全球发行的生产代码来说已经足够了
      • 对于企业部署,我们应该取消特定的脚本自定义操作,以支持经过充分测试的C ++自定义操作,并通过自定义MSI表驱动完全回滚支持,从而完整地声明安装过程中应该发生的事情。
    2. 记录 :只需为设置创建一个日志文件,然后检查其中VersionNT的值。我想按照此处的说明为所有设置启用日志记录:installsite.org on how to do logging - 请参阅&#34; 全局了解计算机上的所有设置&#34; -section)。尽管性能受到了影响,但我总是在TEMP folder中准备好日志文件以进行调试。相同的链接还将向您展示如何仅为单个安装创建临时日志(基本上:msiexec.exe /i "c:\filename.msi" /QN /L*V "C:\msilog.log" REBOOT=R - 带有日志记录的静默安装和禁止重新启动 - even more logging info)。

      < / LI>

      属性调试器演示 :这超出了您的要求,但我认为您可能很难调试此问题以及类似的服务器部署,我想为您提供有关如何评估VBScript中的MSI条件的快速演示。

      您的上述条件通常过于简单而无法理解,但这是一种非常复杂的条件的常规方法 - 例如,当您只想在修复或主要升级启动的卸载时运行自定义操作时 - 证据总是在测试中,不管你对事情有多么认真。

      使用VBScript在运行时评估您的条件:

      MsgBox "Condition: " & CBool( Session.EvaluateCondition("Installed OR (VersionNT >= 603)"))
      

      这样的VBScript自定义操作可以根据需要插入不同的序列和不同的位置。属性值可能会有所不同,具体取决于您的排序(!)以及您所在的安装模式installuninstall,{{1} },repairmodifyself-repair(涉及安装一个MSI,另一个正在卸载),major upgrademinor upgrademinor upgrade patch等。 ..)以及您是在major upgrade patch还是deferred 上下文中投放,还是以默默以交互方式投放 ,以及我忘记的任何变量 - 在MSI中有很多活动部分。例如,如果在UI序列的开头插入自定义操作,则AppSearch尚未运行,并且尚未设置某些属性。如果需要,您还可以在immediateadministrative-序列中插入属性调试构造。

      可能还有一些其他条件用于测试目的:

      • advertisement-installation
      • "NOT Installed AND NOT WIX_UPGRADE_DETECTED"

      然后一些由于复杂性(not my conditions, they are from here)而需要进行测试:

      • "NOT Installed AND NOT REMOVE~="ALL""
      • Installed AND (NOT REMOVE="ALL" OR UPGRADINGPRODUCTCODE)

      我希望这是一个清晰的概念。我有一个VBScript来进行这样的属性调试,但它放在这里太大而且太乱了。

答案 1 :(得分:0)

根据本文关于Windows 10和Server 2016的VersionNT值的值:

https://support.microsoft.com/en-us/help/3202260/versionnt-value-for-windows-10-and-windows-server-2016

我会从以下条件开始:

VersionNT = 603和MsiNTProductType&gt; 1

后者表示服务器系统:

https://msdn.microsoft.com/en-us/library/windows/desktop/aa370329(v=vs.85).aspx

除此之外,请查看WindowsBuild属性以查看它是否具有Server 2016的有用值(或者可用于排除Server 2012的值)。您还可以查看调用GetSystemMetrics的自定义操作:

https://msdn.microsoft.com/en-us/library/windows/desktop/ms724385(v=vs.85).aspx

查看2012年是否设置了SM_SERVERR2。

您不需要包含已安装属性的条件。首次执行安装时,未设置“已安装”值。如果您尝试再次安装相同的MSI,则无法获得启动条件,因为Windows将看到已安装此特定ProductCode并进入维护模式(修复,卸载,功能更改类型的东西)。所以不清楚为什么你认为你需要它。如果您需要确保启动条件仅适用于初始安装,请将条件“未安装”添加到UI中的LaunchConditions操作并执行序列。