Windows 10上的VersionNT MSI属性

时间:2015-08-11 03:18:16

标签: wix windows-installer installshield

我发现当我更新bootstrapper的清单以支持Windows 10兼容性时,MSI的InstallUISequence将正确设置VersionNT = 1000,但InstallExecuteSequence将设置VersionNT = 603。

如何使InstallExecuteSequence也设置VersionNT = 1000?

5 个答案:

答案 0 :(得分:16)

这是我的两分钱......

我发现VersionNT属性非常有用。 VersionNT64是:VersionNT64 ....不是VersionNT64来确定位数。

这有点像黑客(他们这样做,我们这样做......)但是绝望的时候需要采取绝望的措施....

在MSFT正在播放的所有兼容性游戏中,他们似乎只是屏蔽了Major和Minor,而是构建和修改。我还得知在Win8上它们将它掩盖为6.2,在Win 10上它们将它掩盖为6.3。所以我觉得这样做很舒服:

<Property Id="WIN10FOUND">
  <DirectorySearch Id="searchSystem" Path="[SystemFolder]" Depth="0">
    <FileSearch Id="searchFile" Name="advapi32.dll" MinVersion="6.3.10000.0"/>
  </DirectorySearch>
</Property>

我倾向于问自己是“为什么”我需要Windows(FOO)?然后我查找一些注册表项或DLL,指示存在特定功能,组件,API并将其用于我的测试。

微软已经采用了一种常绿的方法,“你不需要知道它是什么版本,你将永远拥有最新的,它将永远被称为Windows 10”,对我而言,这加强了我更喜欢的方法采取。我知道有一天他们会错,我确实需要知道否则我会安装,我的应用程序将会失败,我的用户会抱怨并且不知道他们有什么版本。 (唉...)

答案 1 :(得分:3)

由于ComboBox.SelectedItem在其清单中没有Windows 10兼容性,并且VersionNTprivate property,因此我没有清楚的方法来使执行序列看到{ {1}}。我会推荐其中一种方法:

  • 在用户界面序列中将msiexec.exe复制到另一个属性(VersionNT=1000一些VersionNT;请务必将其列在public property中,就像要传递给其他任何属性一样执行序列),
  • 从您的引导程序传递实际值(同上)或
  • 如果在维护或卸载过程中需要相同的信息,可能会在引导程序中设置一个注册表项,然后通过系统搜索将其值放入安装中。

(我对注册表项选项很不满意,因为如果操作系统将来升级它可能会过时。请注意,所有这些选项可能只有你的bootstrap中的清单正确。 Windows的理论未来版本。)

答案 2 :(得分:1)

微软官方回答:

  

在Windows 10或Windows Server 2016上安装.msi安装包时,VersionNT值为603.

Source

答案 3 :(得分:0)

对于没有引导程序的安装程序,我发现创建一个调用GetVersionEx()的立即自定义操作并为其他安装程序设置属性也是一个不错的选择。 我已经对我的自定义操作进行了排序,以便在AppSearch之后进行,并且足以用它来调整组件。

答案 4 :(得分:0)

我发现检测Windows 10的一种非常简单而强大的方法是调用内置的WMIC命令并解析它的输出:

<强> wmic os get Name,Version,BuildNumber /VALUE

它将准确返回您确定所使用的操作系统所需的信息:

  

BuildNumber = 14393

     

版= 10.0。的 14393

http://helpnet.flexerasoftware.com/installshield22helplib/helplibrary/whats_newIS2015.htm

  

在具有Windows 10的系统上,Windows Installer属性为VersionNT   和VersionNT64表示603,最初是作为   Windows 8.1的版本号。因此,无法创建   .msi包中专门针对Windows 10的条件。

     

自Windows Installer 5.0和Windows 7以来,.msi中的DLL自定义操作   软件包被填充以阻止获取操作系统版本;   API GetVersion,GetVersionEx和RtlGetVersion返回Windows   版本为6.0.6000,最初的版本号为   Windows Vista。因此,也不可能获得实际的   DLL自定义操作或来自的自定义Windows版本号   InstallScript自定义操作(作为DLL实现)。

     

由于Windows Installer中的上述行为,事实并非如此   很容易检测到.msi的Windows版本   包正在运行