1

客户端机器都是 Windows 10 Pro(64 位)。

如果我们要通过 SCCM 安装MyCompanyApp.msi,我们发现我们可以使用 SCCM 成功更新它。那里一切正常。

但是,如果我通过双击 msi 或运行msiexec在本地运行MyCompanyApp.msi,则使用 SCCM 更新它会失败。此外,SCCM 继续运行安装,就好像它从未检测到以前的安装一样。当您检查控制面板时,您会看到该产品列出了两次;每个都有不同的版本号。

底线是,当我将手动安装/升级与 SCCM 手动安装/升级混合使用时,我遇到了上述问题。下表应该总结一些事情。

在此处输入图像描述

4

1 回答 1

2

日志记录:您有正确的日志文件吗?如果没有,请创建它: Enable installation logs for MSI installer without any command line arguments

msiexec.exe /i C:\Path\Your.msi /L*v C:\Your.log

起点:我会搜索FindRelatedProducts并检查日志文件在找到的部分中读取的内容。


调试:主要升级失败调试: WIX 不卸载旧版本


原因?您很可能有:

  1. 错误创作的升级表。
  2. 每台机器和每用户安装的混合。

1.升级表

检查升级表中的条目。它看起来像这样吗。有很多方法可以把这张桌子弄乱。最常见的问题是指定的版本范围。如果设置不正确,则找到的版本可能超出标识为“有效删除”的范围:

升级


2. 安装上下文 MSI 不支持“跨上下文”更新,正如WiX 的创建者 Rob Mensching 所解释的。我对他的后续评论是,我曾经使用过一种或多或少疯狂的方法来删除错误上下文中的一些散乱安装: Crazy approach。取而代之的是:检查 SCCM 如今有哪些功能可以删除每个用户的安装?

每用户安装:在我看来(以及许多其他 MSI 用户),为什么不推荐每用户安装(由 MSI 实施)的原因如下。

您可以像这样在有问题的机器上找到每个用户的安装 - note that there could very well be NO per user installations

Dim i, msi
Set installer = CreateObject("WindowsInstaller.Installer")
i = 1

For Each product In installer.ProductsEx("", "", 7)
   productcode = product.ProductCode
   name = product.InstallProperty("ProductName")
   version=product.InstallProperty("VersionString")
   allusers=product.Context
   
   ' Ignore all per-machine installations
   If(allusers <> 4) Then
      msi = msi + CStr(i) + ": " & productcode & ", " & name & ", " & version & ", " & allusers & vbNewLine & vbNewLine
      i = i + 1
   End If

Next

MsgBox msi

删除 if 部分以获取所有已安装的 MSI 产品。可以显示多少个字符是有限制的MsgBox。而是写入文件?(请参阅此处的中页)或使用WScript.Echo msi.

链接:

  • 不同的安装环境Enum MsiInstallContext

    • Const msiInstallContextAllUserManaged = 8
    • Const msiInstallContextFirstVisible = 0
    • Const msiInstallContextMachine = 4
    • Const msiInstallContextUser = 2
    • Const msiInstallContextUserManaged = 1
  • Windows 安装程序自动化接口(COM 自动化)。

于 2020-08-21T19:59:39.097 回答