如何防止vc_redist.x ##。exe(VS2017)因挂起的重启而模棱两可地失败?

时间:2018-10-11 07:29:08

标签: visual-studio-2017 windows-installer msiexec vcredist visual-c++-2017

TL; DR 是一个由多个安装程序组成的链,用于自动调用VS 2017 vc_redist的明智方法是什么?


MS为VS 15.x(VS 2017)提供的Visual C++ Redistributable Installer,即均为 (14.15.26706-VS 15.8.4)):

  • vc_redist.x86.exe
  • vc_redist.x64.exe

作为完整产品安装的一部分,我必须静默运行几个 vcredist安装程序(也是旧版本)。

现在的问题是,这些安装程序将在重新启动处于挂起状态时拒绝安装(例如"HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager" - PendingFileRenameOperations)。

使用vc_redist /q调用这些安装程序时,它们会甚至触发立即重启系统。可以通过用/q /norestart调用它们来解决此问题,但是:

调用vc_redist /q /norestart时,如果 prior 挂载到此安装程序,它将返回MSI退出代码3010,表示需要重新启动。

,FAIK,此退出代码表示,此设置需要重新启动才能完成。

实际问题

因此,我无法区分该安装程序是否成功,并且仅在安装顺序的最后(我确实在安装之前和之后安装过其他东西)之后才需要重新启动-安装程序是否真的拒绝执行任何操作,我需要重新启动系统并重新启动该安装程序!

如何在一系列不同的第三方安装程序中将此vc_redist命名为

  • 理想情况下,最后只需要重启一次即可
  • 至少要确定它是否安装成功。

一些其他信息,如下:

不确定这些问题,但出于完整性考虑。

  • 安装程序GUI清楚地指示正在发生的事情:(抱歉,德语Windows)

Popup Box

  

“未采取任何行动,因为需要重新启动系统。”

Summary / Close / Restart

  • 这是我们的“产品套件”的InnoSetup内置安装程序,将由客户使用,安装顺序如下:

    1. 运行MSVC 2005(VC8)32位vcredist
    2. 运行32位vcredist MSVC 2010(VC10)
    3. 运行MSVC 2017(VC141)64位vcredist
    4. 运行MSVC 2017(VC141)32位vcredist
    5. 运行其他一些第三方依赖项/库安装程序
    6. 安装实际的应用程序文件(通过InnoSetup)
    7. 重新启动(询问)是否有任何安装程序指示需要重新启动。

从此序列中可以看到,每个vcredist都将疯狂后重新启动,幸运的是,到目前为止,似乎只有2017年的redist表现出这种不幸的行为。

注释:我的试用版在我的开发机上运行,​​所有启动均已在“步骤0”处进行了重启,并且VC2005和VC2010安装程序都运行良好(通过其GUI进度进行了验证) ),即使事先没有重启 。如果挂起重启,则VC2017安装程序将拒绝执行任何操作。

2 个答案:

答案 0 :(得分:1)

MSU软件包 :在反编译 vc_redist.x64.exe (它是WiX捆绑包)之后,使用以下命令:

dark.exe -x Extract vc_redist.x64.exe

我发现该捆绑软件安装了:Update for Universal C Runtime in Windows - KB2999226。该组件由 Windows Update文件(由Windows Update使用的 *.msu )组成,而不仅仅是MSI文件。 我怀疑它们可能被设计为在允许安装之前需要重新启动,但我没有证据

建议 :运行检查以确保已安装 KB2999226 。这该怎么做?我不知道Win32电话,但是WiX家伙可能会知道。 Here are some other suggestions


实际的Windows Update文件是(随着时间的推移,这些文件名可能会随着具有无版本文件名vc_redist.x64.exe的该安装程序的新版本的发布而更改):

  • Windows6.0-KB2999226-x64.msu
  • Windows6.1-KB2999226-x64.msu
  • Windows8.1-KB2999226-x64.msu
  • Windows8-RT-KB2999226-x64.msu

换句话说,对于Vista,Windows 7,Windows 8等。各种服务器操作系统也是如此。 Windows 10内置了此组件。

  

企业部署 :在公司环境中,我将通过以下方式部署这些 *.msu 文件   可用的分配机制-可能是-   示例SCCM-在安装 vc_redist.x64.exe 软件包之前。

     

当您直接从MSU本身获取错误消息时,这应该可以更好地控制分发过程。

     

坦率地说,这些是SOE的核心组成部分。我不知道为什么Microsoft将这些运行时保留在主要的OS安装之外。它们对于大多数软件都至关重要。


可以在以下位置找到使用WiX工具包的 dark.exe 二进制文件进行反编译方法的描述:How can I compare the content of two (or more) MSI files?

答案 1 :(得分:1)

严格来说,错误3010是成功的结果。这意味着安装已完成,但需要重新启动。我不知道有什么迹象表明安装根本没有开始。典型的“如果挂起重新启动将不会安装”是基于MsiSystemRebootPending属性使用启动条件的结果。由于此启动条件而导致的失败不会返回3010结果-它们通常会返回1602错误,这是一种“用户取消”错误。