Wix Toolset CustomAction用于确定操作系统是Windows 7 / xp家庭版还是初学者版,并显示消息

时间:2014-04-14 09:12:30

标签: wix windows-installer wix3.7

我是Wix Toolset安装的新手。我使用的是Wix 3.7和Visual Studio 2010 SP1。

我正在阅读一个使用BootStrapper的教程,其中在Product.Wxs文件中有一个条件消息,用于检查.NET Framework 4.0是否安装了PropertyRef Id变量和条件消息

<PropertyRef Id="NETFRAMEWORK40FULL"/>
<Condition Message="This application requires .NET Framework 4.0. Please install the .NET Framework then run  
   this installer again.">
  <![CDATA[Installed OR NETFRAMEWORK40FULL]]>
</Condition>

如何同样检查Windows XP Starter / Home和Windows 7 Starter / Home / Home Premium版本的条件,并显示安装不支持所列操作系统且需要专业版的条件消息。

我已经浏览了Wixtoolset网站上的链接,但它没有帮助:

检查Windows版本 http://wixtoolset.org/documentation/manual/v3/howtos/redistributables_and_install_checks/block_install_on_os.html

http://msdn.microsoft.com/library/aa370556.aspx

我还尝试将条件放在bootstrapper的Bundle.wxs文件中:

<Bundle Name="!(loc.ProductName)" Compressed="yes" Version="1.2.6.0"  
SplashScreenSourceFile="Resources\SplashScreen.bmp" IconSourceFile="Resources\IXMWeb.ico"  Manufacturer="! 
(loc.ManufacturerName)" UpgradeCode="FED377E5-8762-48C4-B123-8D4AD89B0222" Condition="((VersionNT >= v5.1) AND 
(ServicePackLevel >= 3) AND NOT(NTSuitePersonal)) OR ((VersionNT >= v5.2) AND (ServicePackLevel >= 2)) OR 
(VersionNT >= v6.0 AND NOT(NTSuitePersonal))">

我已经完成了我需要使用NTSuitePersonal而不是MsiNTSuitePersonal来检查该版本是否正在安装的Home版本的帖子。

请告诉我上述使用条件不正确的地方。

1 个答案:

答案 0 :(得分:2)

要检查Windows版本(例如Windows XP,Vista,7,8,...),您可以使用VersionNT - 属性,如您提供的链接中所述。要检查版本(例如Home,Premium,Professional,...),根据this SO-question,您可以使用注册表配置单HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion下面的值。
与WiX结合使用,您可以进行注册表搜索,设置属性,然后在您的条件中使用此属性(我可以仅在Windows 7 Professional上验证名称为EditionID的确切注册表项):

...

<Property Id="WINDOWSEDITION" Secure="yes">
    <RegistrySearch Id="WindowsEditionReg" Root="HKLM" Key="SOFTWARE\Microsoft\Windows NT\CurrentVersion" Name="EditionID" Type="raw" />
</Property>

...

另见How to: Read a registry entry during installation

修改:使用链接Operating System Property ValuesHow To: Read a Registry Entry During Installation以及How To: Block Installation Based on OS Version中指定的媒体资源,检查用户是否拥有Windows 7专业版的示例安装Service Pack 1并拒绝安装其他所有内容(将其放在Product - 标签内):

<Condition Message="This application can only be installed on Windows 7 Professional with Service Pack 1.">
    <![CDATA[Installed OR (VersionNT = 601 AND WindowsBuild > 7100 AND WINDOWSEDITION ~= "Professional")]]>
</Condition>

条件开头的Installed - 属性可确保仅在尚未安装产品时验证条件。在括号内,我们找到其他条件元素。我们确保在Windows 7(VersionNT = 601 AND WindowsBuild > 7100)上运行并且版本正确(WINDOWSEDITION ~= "Professional")。请注意,~=检查字符串不区分大小写 对于条件语句的语法,您可以查看here。您当然可以使用ORAND组合任何其他条件,并在适当的位置将它们与括号分组。在现实世界中,您很可能会遇到另一种情况,例如Windows 7及更高版本。