我发现当我更新bootstrapper的清单以支持Windows 10兼容性时,MSI的InstallUISequence将正确设置VersionNT = 1000,但InstallExecuteSequence将设置VersionNT = 603。
如何使InstallExecuteSequence也设置VersionNT = 1000?
答案 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兼容性,并且VersionNT
是private property,因此我没有清楚的方法来使执行序列看到{ {1}}。我会推荐其中一种方法:
msiexec.exe
复制到另一个属性(VersionNT=1000
一些VersionNT
;请务必将其列在public property中,就像要传递给其他任何属性一样执行序列),(我对注册表项选项很不满意,因为如果操作系统将来升级它可能会过时。请注意,所有这些选项可能只有你的bootstrap中的清单正确。 Windows的理论未来版本。)
答案 2 :(得分:1)
在Windows 10或Windows Server 2016上安装.msi安装包时,VersionNT值为603.
答案 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版本 包正在运行