VersionNT MSI 属性 Windows 10
VersionNT MSI property on Windows 10
我发现当我更新引导程序的清单以支持 Windows 10 兼容性时,MSI 的 InstallUISequence 将正确设置 VersionNT=1000,但 InstallExecuteSequence 将设置 VersionNT=603。
如何让 InstallExecuteSequence 也设置 VersionNT=1000?
由于 msiexec.exe
在其清单中没有 Windows 10 兼容性,并且 VersionNT
is a private property,我知道没有干净的方法让执行序列看到 VersionNT=1000
。我会推荐以下方法之一:
- 在 UI 序列期间将
VersionNT
复制到另一个 属性 (有些 public property like REALVERSIONNT
; be sure to list it in SecureCustomProperties
与您要传递给执行序列的任何其他 属性 一样) ,
- 从你的bootstrapper(同上)或
传递真实价值
- 如果您在维护或卸载期间需要相同的信息,可以在 bootstrapper 中设置一个注册表项,然后通过系统搜索将其值提取到安装中。
(我对注册表项选项感到困惑,因为如果 OS 将来升级,它可能会过时。另请注意,所有这些选项可能只是正确的bootstrap 上的清单在 Windows 的理论上的未来版本中。)
这是我的两分钱....
我不觉得 VersionNT 属性 非常有用。 VersionNT64 是:VersionNT64 .... 不是 VersionNT64 来确定位数。
这有点乱(他们做这个,我们做那个...)但危急时刻需要采取危急措施....
在 MSFT 玩的所有兼容性游戏中,它们似乎只屏蔽了 Major 和 Minor,但没有屏蔽 Build 和 revision。我还发现在 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>
我经常问自己 "WHY" 我需要 Windows (FOO) 吗?然后,我会查找一些注册表项或 DLL,这些注册表项或 DLL 表明存在特定功能、组件 API,并将其用于我的测试。
Microsoft 采用了 "you don't need to know what version it is, you'll always have the latest and it'll always be called Windows 10" 的常青方法,对我来说,这强化了我更喜欢采用的方法。我知道有一天他们会错,我确实需要知道,否则我会安装,我的应用程序会失败,我的用户会抱怨并且不知道他们有什么版本。 (叹息...)
对于没有引导程序的安装程序,我发现创建一个即时自定义操作调用 GetVersionEx() 并设置 属性 供安装程序的其余部分使用也是一个好的选择。
我已将我的自定义操作排序为在 AppSearch 之后发生,用它来调节组件就足够了。
我发现检测 Windows 10 的一种非常简单且可靠的方法是调用内置的 WMIC 命令并解析它的输出:
wmic os get Name,Version,BuildNumber /VALUE
它将 return 准确地提供您需要的信息,以确定您 OS 您所在的位置:
BuildNumber=14393
Version=10.0.14393
http://helpnet.flexerasoftware.com/installshield22helplib/helplibrary/whats_newIS2015.htm
On systems with Windows 10, the Windows Installer properties VersionNT
and VersionNT64 indicate 603, which was originally introduced as the
version number of Windows 8.1. Therefore, it is not possible to create
conditions in an .msi package that specifically target Windows 10.
Since Windows Installer 5.0 and Windows 7, DLL custom actions in .msi
packages are shimmed to block obtaining the operating system version;
the APIs GetVersion, GetVersionEx, and RtlGetVersion return a Windows
version of 6.0.6000, which was originally the version number of
Windows Vista. Therefore, it is also not possible to obtain the actual
version number of Windows from a DLL custom action or from an
InstallScript custom action (which is implemented as a DLL).
Because of the aforementioned behavior in Windows Installer, it is not
easily possible to detect what version of Windows on which an .msi
package is running
微软官方回答:
When you install an .msi installation package on Windows 10 or Windows Server 2016, the VersionNT value is 603.
我发现当我更新引导程序的清单以支持 Windows 10 兼容性时,MSI 的 InstallUISequence 将正确设置 VersionNT=1000,但 InstallExecuteSequence 将设置 VersionNT=603。
如何让 InstallExecuteSequence 也设置 VersionNT=1000?
由于 msiexec.exe
在其清单中没有 Windows 10 兼容性,并且 VersionNT
is a private property,我知道没有干净的方法让执行序列看到 VersionNT=1000
。我会推荐以下方法之一:
- 在 UI 序列期间将
VersionNT
复制到另一个 属性 (有些 public property likeREALVERSIONNT
; be sure to list it inSecureCustomProperties
与您要传递给执行序列的任何其他 属性 一样) , - 从你的bootstrapper(同上)或 传递真实价值
- 如果您在维护或卸载期间需要相同的信息,可以在 bootstrapper 中设置一个注册表项,然后通过系统搜索将其值提取到安装中。
(我对注册表项选项感到困惑,因为如果 OS 将来升级,它可能会过时。另请注意,所有这些选项可能只是正确的bootstrap 上的清单在 Windows 的理论上的未来版本中。)
这是我的两分钱....
我不觉得 VersionNT 属性 非常有用。 VersionNT64 是:VersionNT64 .... 不是 VersionNT64 来确定位数。
这有点乱(他们做这个,我们做那个...)但危急时刻需要采取危急措施....
在 MSFT 玩的所有兼容性游戏中,它们似乎只屏蔽了 Major 和 Minor,但没有屏蔽 Build 和 revision。我还发现在 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>
我经常问自己 "WHY" 我需要 Windows (FOO) 吗?然后,我会查找一些注册表项或 DLL,这些注册表项或 DLL 表明存在特定功能、组件 API,并将其用于我的测试。
Microsoft 采用了 "you don't need to know what version it is, you'll always have the latest and it'll always be called Windows 10" 的常青方法,对我来说,这强化了我更喜欢采用的方法。我知道有一天他们会错,我确实需要知道,否则我会安装,我的应用程序会失败,我的用户会抱怨并且不知道他们有什么版本。 (叹息...)
对于没有引导程序的安装程序,我发现创建一个即时自定义操作调用 GetVersionEx() 并设置 属性 供安装程序的其余部分使用也是一个好的选择。 我已将我的自定义操作排序为在 AppSearch 之后发生,用它来调节组件就足够了。
我发现检测 Windows 10 的一种非常简单且可靠的方法是调用内置的 WMIC 命令并解析它的输出:
wmic os get Name,Version,BuildNumber /VALUE
它将 return 准确地提供您需要的信息,以确定您 OS 您所在的位置:
BuildNumber=14393
Version=10.0.14393
http://helpnet.flexerasoftware.com/installshield22helplib/helplibrary/whats_newIS2015.htm
On systems with Windows 10, the Windows Installer properties VersionNT and VersionNT64 indicate 603, which was originally introduced as the version number of Windows 8.1. Therefore, it is not possible to create conditions in an .msi package that specifically target Windows 10.
Since Windows Installer 5.0 and Windows 7, DLL custom actions in .msi packages are shimmed to block obtaining the operating system version; the APIs GetVersion, GetVersionEx, and RtlGetVersion return a Windows version of 6.0.6000, which was originally the version number of Windows Vista. Therefore, it is also not possible to obtain the actual version number of Windows from a DLL custom action or from an InstallScript custom action (which is implemented as a DLL).
Because of the aforementioned behavior in Windows Installer, it is not easily possible to detect what version of Windows on which an .msi package is running
微软官方回答:
When you install an .msi installation package on Windows 10 or Windows Server 2016, the VersionNT value is 603.