我有一个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上安装?
答案 0 :(得分:2)
INSTALLED
应为Installed
。 Properties are case sensitive你肯定必须在你的情况下解决这个问题 - 否则这部分情况将永远不会成立 - 即使产品已安装。
其余的情况实际上看起来不错。只是一些想法来确定错误:
WiX源元素 :您确定已将此条件包含在WiX源中的正确位置吗?
无版本 :对Windows 10
中检测到操作系统版本的方式进行了大量更改。我不知道这是否也会影响Windows Server 2012R2
。
VersionNT
根本不一定报告操作系统的正确版本!为了确定VersionNT
在您的设置中的真正价值,我将使用以下两种方法之一在运行时检查属性。后一个选项(日志记录)通常更快更容易,而第一个选项允许您在设置运行时评估复杂条件,并使用Session.EvaluateCondition method在运行时显示它们是真还是假(我使用此方法)当条件复杂且令人困惑时调用,我想要一些运行时证明它们的行为与我期望的一样):
属性调试器VBScript :我有一个属性调试器VBScript,用于在运行时为MSI文件显示一堆属性值,并评估条件运行时显示它们是否评估为真 - 如上所述。如果我是你,我会使用这样的脚本在运行时显示VersionNT
(以及你要检查的任何其他属性或条件)。
记录 :只需为设置创建一个日志文件,然后检查其中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)。
属性调试器演示 :这超出了您的要求,但我认为您可能很难调试此问题以及类似的服务器部署,我想为您提供有关如何评估VBScript中的MSI条件的快速演示。
您的上述条件通常过于简单而无法理解,但这是一种非常复杂的条件的常规方法 - 例如,当您只想在修复或主要升级启动的卸载时运行自定义操作时 - 证据总是在测试中,不管你对事情有多么认真。
使用VBScript在运行时评估您的条件:
MsgBox "Condition: " & CBool( Session.EvaluateCondition("Installed OR (VersionNT >= 603)"))
这样的VBScript自定义操作可以根据需要插入不同的序列和不同的位置。属性值可能会有所不同,具体取决于您的排序(!)以及您所在的安装模式(install
,uninstall
,{{1} },repair
,modify
,self-repair
(涉及安装一个MSI,另一个正在卸载),major upgrade
,minor upgrade
,minor upgrade patch
等。 ..)以及您是在major upgrade patch
还是deferred
上下文中投放,还是以默默或以交互方式投放 ,以及我忘记的任何变量 - 在MSI中有很多活动部分。例如,如果在UI序列的开头插入自定义操作,则AppSearch尚未运行,并且尚未设置某些属性。如果需要,您还可以在immediate
和administrative-
序列中插入属性调试构造。
可能还有一些其他条件用于测试目的:
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值的值:
我会从以下条件开始:
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操作并执行序列。