Wix Toolset CustomAction 用于确定操作系统是 windows 7/xp 家庭版还是入门版,并显示消息不是

Posted

技术标签:

【中文标题】Wix Toolset CustomAction 用于确定操作系统是 windows 7/xp 家庭版还是入门版,并显示消息不是【英文标题】:Wix Toolset CustomAction for determining if the OS is windows 7/xp home edition or starter edition and display message for not 【发布时间】:2014-04-14 09:12:30 【问题描述】:

我是 Wix 工具集安装的新手。我正在使用 Wix 3.7 和 Visual Studio 2010 SP1。

我正在阅读一个使用 BootStrapper 的教程,其中 Product.Wxs 文件中有一个条件消息,用于检查 .NET 框架 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

我还尝试将条件放在引导程序的 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 来检查版本是否是正在安装的家庭版的帖子。

请让我知道我在上面使用的条件中哪里不正确。

【问题讨论】:

【参考方案1】:

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

...

<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 Values 和How To: Read a Registry Entry During Installation 和How To: Block Installation Based on OS Version 中命名的属性,检查用户是否安装了带有Service Pack 1 的Windows 7 Professional 和拒绝安装其他所有内容(将其放在Product-tag 中):

<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 &gt; 7100) 上运行并且版本正确 (WINDOWSEDITION ~= "Professional")。请注意,~= 检查字符串不区分大小写。 对于条件语句的语法,您可以查看here。您当然可以使用ORAND 组合任何其他条件,并在适当的情况下用括号将它们分组。在现实世界的场景中,您很可能会遇到其他情况,例如 Windows 7 和更高版本。

【讨论】:

嗨!非常感谢。如何在我的情况下使用此属性 ID? 我已经用示例和附加链接编辑了上面的答案。 非常感谢!这对我有用。再次感谢。还有一件事,您能否推荐一些好的wix教程以及学习wix的先决条件。据我所知,现在应该对以下内容有一个很好的理解:1. Windows Installer 2. XML 3. Wix 变量 4. WPF(在 Bootstrapper 的情况下) 5. windows 的注册表结构。还有什么其他人应该知道的。请添加一些链接。再次感谢您。 我们使用 ~= 条件来检查专业版。如何检查不区分大小写的!=“个人”版?我的意思是,我根据条件语句表使用 WINDOWSEDITION "Personal"。但是这个条件的计算结果为真。 WINDOWSEDITION != "Personal" WINDOWSEDITION !~= "Personal" WINDOWSEDITION ~!= "Personal" 它给了我错误。 您应该尝试使用 MsiNTSuitePersonal 属性来确定它是否是家庭版。

以上是关于Wix Toolset CustomAction 用于确定操作系统是 windows 7/xp 家庭版还是入门版,并显示消息不是的主要内容,如果未能解决你的问题,请参考以下文章

以提升用户身份在 wix 中运行 CustomAction

Wix:无法从Wix CustomAction调用DISM

从对话框调用 CustomAction 时出现 WiX 安装错误 2762

wix toolset将 cab 打包进msi

具有提升权限的 WiX CustomAction SCHTASKS“拒绝访问”

wix customaction UAC dtf