Jim*_*Jim 6 windows-installer wix vcredist
我正在创建一个 .msi 安装程序,它必须确定系统中是否存在 Visual C++ 2015 Redistributable,如果没有,则使用自定义消息中断安装。官方 Wix 文档指的是 VC++ 的实际安装,我不希望这样做,因为我的安装程序是“每个用户”,还有其他几个 stackoverflow 问题是指包而不是 .msi http://wixtoolset .org/documentation/manual/v3/howtos/redistributables_and_install_checks/install_vcredist.html。
Wix Burn vcredist,WIX 检查是否安装了 VS2015 C++ redistributable,https: //gist.github.com/nathancorvussolis/6852ba282647aeb0c5c00e742e28eb48
所以我想问题是,如何有效地检测每个用户安装程序中 Visual C++ 2015 Redistributable 的存在。
我可以找到几种方法来检测Visual C++ Runtime的存在。
注册表
文件存在和版本检查
微星API
摔倒EXE?
好与坏 - 评估:Option 1似乎容易受到攻击,因为部署运行时的合并模块变体可能不会编写这些密钥。Option 3可能工作得很好,但很难跟踪所有 GUID。Option 4基于较新的运行时删除某些注册表项,似乎已经失败。虽然现在已经修复,但这可能会重新出现。
我看的越多,我就越开始认为您必须检查实际文件本身,并可能检查正确的文件版本。该文件vcruntime140.dll中System32的文件夹(64位版本)和SysWOW64文件夹(32位版本)?在此处查看底部的文件列表。
只需添加一个链接以确保安全。
测试 VBScript - 仅用于测试目的(脚本有时会被防病毒软件阻止):
Set fso = CreateObject("Scripting.FileSystemObject")
MsgBox fso.GetFileVersion("C:\Windows\System32\vcruntime140.dll")
Run Code Online (Sandbox Code Playgroud)
您可以使用MSI 文件中的AppSearch检测文件是否存在和版本。
下面是我写的其他一些东西,只是留下来。
似乎Visual C++ Redistributable Packages ( VCRedist_x86.exe, VCRedist_x64.exe) - 这是部署运行时的推荐方式 - 检查以下注册表项以确定实际安装的运行时版本:
Run Code Online (Sandbox Code Playgroud)HKLM\SOFTWARE\Microsoft\VisualStudio\<version>\VC\Runtimes\
子项x86和x64似乎都包含一个“已安装”值,在安装运行时时该值设置为1。我会假设 - 没有时间测试这一切 - 然后你可以检查:
HKLM\SOFTWARE\WOW6432Node\Microsoft\VisualStudio\14.0\VC\Runtimes\x64 Installed = 1HKLM\SOFTWARE\WOW6432Node\Microsoft\VisualStudio\14.0\VC\Runtimes\x86 Installed = 1合并模块:经过简短的检查,看起来这些值不是由也可用于分发此运行时的合并模块写入的。我现在没有时间或手段来正确检查这个。
令人惊讶的是,运行时的 2015 版和 2017 版都写入了 14.0 密钥 - 因为它们是二进制兼容的。如果安装了 2017 版本,则 VCRedist 可执行文件将返回错误,因为不需要安装。确实很奇怪。但就你的目的而言,这应该不是重点。来源。
更新:
installer.ProductState- 正常安装状态是5:在编写以下内容时,我忘记了ProductState 属性。如果您有实际的产品代码,您可以使用两行代码检查已安装的产品:
Run Code Online (Sandbox Code Playgroud)Dim installer : Set installer = CreateObject("WindowsInstaller.Installer") MsgBox installer.ProductState("{00000000-0000-0000-0000-000000000001}")
这里还有另一种方法:MSDN:如何使用产品代码以编程方式检查基于 Windows Installer 的产品是否存在。
提示:我不会使用这种方法,因为当产品更新时产品代码会经常更改。因此我更喜欢检查核心运行时文件的文件版本。这对于未来似乎更可靠(前提是版本解析正确可靠地完成 - 不要自己动手)。
样机:
HKLM\SOFTWARE\Microsoft\VisualStudio\<version>\VC\Runtimes\
Run Code Online (Sandbox Code Playgroud)
根据Zett42 的建议更新,列举出共享相同升级代码的产品:
Dim installer : Set installer = CreateObject("WindowsInstaller.Installer")
MsgBox installer.ProductState("{00000000-0000-0000-0000-000000000001}")
Run Code Online (Sandbox Code Playgroud)
除了检测之外,还有几种分发 Visual Studio C++ 运行时的方法:
VCRedist_x86.exe, VCRedist_x64.exe, 或VCRedist_arm.exeProgram Files(x86)\Microsoft Visual Studio\2017\edition\VC\Redist\MSVC\lib-version.msm files)
安全保管链接:
有这个老帖子。我不太喜欢直接读取注册表,让我看看是否可以找到更可靠的方法,但同时也可以看看:Detect if Visual C++ Redistributable for Visual Studio 2012 is installed
还有一个链接,如何找到已安装产品的 Windows Installer 产品代码:如何找到已安装 MSI 安装程序的产品 GUID?
| 归档时间: |
|
| 查看次数: |
3535 次 |
| 最近记录: |