我有一个由 WIX 创建的 MSI,可以以管理员身份在本地运行而不会出现错误。但是,当通过 SCCM 部署为从 MSI 导入的应用程序部署时,软件中心显示失败,代码为0x87D00324
。无论哪种情况,实际安装都会成功(因为文件和注册表项按预期创建并且应用程序加载)。
SCCM 错误表明安装后未检测到产品。如果使用与 SCCM 配置相同的命令行手动安装(msiexec /i [msi goes here] /qn
),软件中心会显示该应用程序已安装,表明检测规则正确 - 检测设置为查找已安装的产品代码。AppEnforce.log
跟踪表明上述情况正在发生:
- SCCM 安装 MSI 时没有出现任何错误
- 安装后尝试检测 MSI
- 检测失败,将部署标记为失败
MSI 配置为为所有用户安装(ALLUSERS=1
作为 MSI 属性,而不是在命令行上),并且需要提升才能运行。SCCM 作业配置为“为系统安装”和“仅在没有用户登录时”,并且针对特定机器而不是用户。
启用计算机范围的 MSI 日志记录后,我猜测日志记录输出中可能会出现一些差异:
- SCCM 发布的安装有一个日志条目:
PROPERTY CHANGE: Deleting ALLUSERS property. Its current value is '1'
虽然不清楚是什么原因造成的- 即使将 ALLUSERS=1 作为命令行参数提供,也会发生这种情况
msiexec
- 例如“添加 ALLUSERS...”,然后几行之后是“删除 ALLUSERS...”
- 即使将 ALLUSERS=1 作为命令行参数提供,也会发生这种情况
- 通过 SCCM 安装时,步骤
ProductPublish
/日志条目的值为Assignment
0(根据文档,相当于每个用户),但手动安装时(相当于每台机器)的值为 1 - SCCM 安装会导致创建三个 MSI 日志,而不是像手动情况那样只创建单个日志
ADVERTISE
一个显示正在使用操作调用的 MSI- 一个似乎根本没有调用
msiexec
但可能由于某种原因将其余ADVERTISE
操作记录到另一个文件中 - 使用空白操作调用的 MSI(在日志中显示为 的操作
INSTALL
)
安装后,Get-WmiObject -Namespace root\ccm\CIModels -Class CCM_MSIProduct
两种安装方法有不同的输出:
- 通过 SCCM 安装,没有新应用程序的条目 - 我猜这就是 SCCM 认为该应用程序未安装的原因
- 手动安装后,新应用程序会显示正确的详细信息
两种方法在通过 查询时均显示应用程序已安装wmic product get
。
客户:Windows 10 企业版,SCCM 客户端 5.0.0.8577.1115
服务器:SCCM 1710 (5.0.0.8577.1115)
2018 年 4 月 12 日更新,其他信息:
- SCCM 工作适用于一些机器,但它们之间没有明显的共同点
- 通过以 SYSTEM 身份运行 MSI,可以在给定的机器上永久修复 SCCM 作业
pstools
- 如果执行一次,手动卸载 MSI,然后通过 SCCM 重新安装即可工作并正确检测(这显然毫无意义,但却是一个有趣的结果) - 故障机器上的日志记录表明操作是在用户上下文中完成的,而不是在每台机器的上下文中完成的
Using cached product context: User assigned for product: 6176BC215761514458869E9B9ABB08BC
- 登录故障机器时,会显示多行上述内容,而登录正常运行的机器时,似乎会在机器上下文中命中多个产品代码
- 一旦通过 SCCM 在失败状态下安装,唯一明显的注册表差异就是
HKLM\Software\Classes\Installer\Products\[[Product Code]]\AdvertiseFlags
,它0x180
处于失败状态,而0x184
处于通过状态 - 我们的运营团队认为故障是在作业启用取代功能时开始的,但我无法确认所有故障是否都是如此
什么可能导致 SCCM 作业和手动安装之间的行为差异?什么可能导致 SCCM 作业在用户上下文中运行,即使它似乎以 SYSTEM 身份运行并配置为“为系统安装”?
答案1
正如您所提到的,它尝试宣传 MSI 而不是安装,这很奇怪。也许您必须重新查看脚本或在 orca 中阅读它并查看。
您是否碰巧检查了检测中定义的产品代码是否也出现在注册表中。
32 位:HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\Product code
或者
64 位:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Product code