【问题标题】:SCCM does not update software that was installed manuallySCCM 不会更新手动安装的软件
【发布时间】:2023-03-13 19:27:01
【问题描述】:

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

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

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

最重要的是,当我将手动安装/升级与 SCCM 手动安装/升级混合使用时,我遇到了上述问题。下表应该总结一下。

【问题讨论】:

  • 我猜升级表没有正确编写(所以主要升级失败)或者新版本可能是按用户安装的? (用户特定的安装,而不是机器范围的注册安装)。不确定所有细节,因为我已经很久没有测试过了——我避免按用户安装。 Perhaps see this list of common problems with major upgrades。或者我可能没有意义,因为已经很晚了。
  • @SteinÅsmul:我会查看链接。谢谢
  • Stein 打败了我。查看升级表docs.microsoft.com/en-us/windows/win32/msi/upgrade-table。当您打包新版本的 MyCompanyApp.msi 时,您将使用与之前版本相同的 UpgradeCode GUID,或者至少将之前的 UpgradeCodes 添加到该表中。这告诉 MSI 引擎在安装新版本之前卸载以前的版本。如果您这样做,则无需在 SCCM 中取代或做任何额外的事情。如果您不想使用升级表(尽管我推荐它),您始终可以将您的安装包装在一个首先卸载旧版本的脚本中。
  • @PaulG 我很好奇一些事情。您是否考虑到只要 SCCM 执行升级就成功的事实?仅当我尝试使用手动方式(例如双击 MSI)更新 SCCM 安装时,它才不起作用。我将更新问题以使其更清晰。
  • @ezG,我的建议取决于您的哪一项描述是实际问题。请稍微清理一下您的问题,因为您的描述与您刚刚发布的新表格不匹配。 1.) 说明 = 手动安装,然后 SCCM 升级失败 2.) 表格图片 = SCCM 安装,然后手动安装升级失败 如果问题实际上是 (1),那么它可能是 Stein 和我建议的升级表,如果它是 (2) ) 发生这种情况可能有多种原因,并且没有足够的信息,但可能是安装它的用户和 ALLUSERS 设置。

标签: windows-installer sccm installaware sccm-2007


【解决方案1】:

日志记录:您有正确的日志文件吗?如果没有,请创建它: 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 does not uninstall older version


原因?您很可能有:

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

1.升级表

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


2.安装上下文MSI does not support "cross context" updates as explained here by Rob Mensching - WiX 的创建者。我对他的后续评论是,我曾经使用过一种或多或少疯狂的方法来删除错误上下文中的一些零散安装:Crazy approach。取而代之的是:检查 SCCM 目前有哪些功能可以删除每个用户的安装?

每用户安装次数Here is a piece on why per-user installs - as implemented by MSI - are not recommended - 在我看来(以及许多其他 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 可以显示的字符数有限制。而是写入文件? (see mid-page here) 或使用 WScript.Echo msi

链接:

【讨论】:

  • 这值得一些赞成/选择作为答案,即使它没有回答您的直接问题,因为这是惊人的信息!
  • @Stein Asmul 我会用一把细齿梳子来解决这个问题。优秀的信息。我会告诉你这是否有效。
  • @PaulG 是的,这个答案肯定会进入我的工具箱。
  • @Stein Asmul 这里的一切都很棒,但正是“安装上下文”信息解决了我们的问题。我们对此一无所知。谢谢
  • 是的,这可能是一个真正的颈部疼痛。我更喜欢强制每台机器安装所有软件包以供企业使用,但情况发生了变化,每用户安装似乎再次更受欢迎。较新的部署技术似乎对他们有利。
猜你喜欢
  • 1970-01-01
  • 2011-10-26
  • 1970-01-01
  • 2016-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-08
  • 1970-01-01
相关资源
最近更新 更多