SCCM 全局条件 WQL 查询类型不匹配 (wbemErrTypeMismatch - 0x80041005)

8 wmi sccm-2012

我们一直在处理带有集合的包(现在是应用程序)的所有定位逻辑。既然我们已经从 SCCM 2007 转移到 SCCM 2012 SP1,建议我们将该逻辑转移到应用程序模型并使用全局条件和要求实施它。这有许多积极的好处 - 集合纯粹用于分层或逻辑分组,我们在使用 Supercedence 时获得更无缝的应用程序部署,以及改进的检测逻辑。

我将使用 Adob​​e Flash Player 插件作为示例。我们只想将 Adob​​e Flash Player Plugin 部署到安装了 Firefox 的工作站。使用 SCCM 2007 Package-Program 模型,我们将基于 WQL 查询创建一个集合,其中包含安装了 Firefox 的所有工作站:

select *  from  SMS_R_System inner join SMS_G_System_SoftwareProduct
on SMS_G_System_SoftwareProduct.ResourceId = SMS_R_System.ResourceId
where SMS_G_System_SoftwareProduct.ProductName like "Mozilla Firefox"
Run Code Online (Sandbox Code Playgroud)

一旦我们创建了集合,我们就会针对它部署我们的包程序。我正在尝试使用应用程序的全局条件和要求逻辑复制相同的逻辑。我所有尝试构建基于 WQL 查询的全局条件都会导致wbemErrTypeMismatch错误 ( 2147749893 (0x80041005))。



既然最佳实践建议我们将目标逻辑与应用程序捆绑在一起,我们需要做的是创建一个适当的 WQL 查询全局条件,然后我们可以使用应用程序的需求来评估它。

让我们从 WQL 查询开始。我使用 Scriptomatic 来转储SMS_InstalledSoftware属于root\cimv2\sms命名空间的WMI 类中的所有内容。我有理由确信SMS_InstalledSoftware是在尝试评估是否安装了某些东西时运行查询的最佳位置,因为 Win32_Product 仅适用于 Windows Installer 安装的软件。

我找到以下与 Firefox 相关的对象:

ARPDisplayName: Mozilla Firefox 23.0.1 (x86 en-US)
ChannelCode: 
ChannelID: 
CM_DSLID: 
EvidenceSource: CPXCCCCCCXCXCXCXXXXXCXXXXX

InstallDirectoryValidation: 4
InstalledLocation: C:\Program Files (x86)\Mozilla Firefox
InstallSource: 
InstallType: 0
Language: 0
LocalPackage: 
MPC: 
OsComponent: 0
PackageCode: 
ProductID: 
ProductName: Mozilla Firefox 23.0.1 (x86 en-US)
ProductVersion: 23.0.1
Publisher: Mozilla
RegisteredUser: 
ServicePack: 
SoftwareCode: mozilla firefox 23.0.1 (x86 en-us)
SoftwarePropertiesHash: 63896ed23146ec91dbc763b45c127ba31216e2f9d657a87953440d30b7f306bc
SoftwarePropertiesHashEx: 67c2ecc42f0e0b9da6ee55bc0dea67a4d90b9e8452c9fdb25db57d4891698f25
UninstallString: "C:\Program Files (x86)\Mozilla Firefox\uninstall\helper.exe"
UpgradeCode: 
VersionMajor: 2147483647
VersionMinor: 2147483647
Run Code Online (Sandbox Code Playgroud)



针对 ProductName 属性运行 WQL 似乎是一个不错的方法。如果我针对命名空间运行SELECT * FROM SMS_InstalledSoftware WHERE ProductName like '%Firefox%',我会得到以下信息:wbemtestroot\cimv2\sms

测试结果



接下来让我们尝试在 SCCM 中构建全局条件:

全局条件查询



这完全不直观,但我认为我理解正确。全局条件只是设置整个应用程序逻辑的条件部分,而不是任何评估应用程序逻辑。出于这个原因,我没有在 WHERE 子句中做任何事情。这个全局条件应该在类的root\cimv2\sms命名空间中查找SMS_InstalledSoftware并“返回”ProductName 属性。我现在应该能够使用我的应用程序的部署类型要求评估该属性的值,对吗?

SCCM 要求



再次 - 我要么不理解整个全局条件/需求逻辑是如何挂在一起的,要么就是不直观,但上述需求应该能够查看从ProductName属性返回的所有字符串,评估它们中是否有任何包含“Firefox” ' 如果是这样,请愉快地部署 Adob​​e Flash Player 插件。

不幸的是它不起作用。部署中的几乎所有机器都返回以下错误:

2147749893 (0x80041005) Type Mismatch
Run Code Online (Sandbox Code Playgroud)

我认为这意味着 Global Condition 返回的变量类型与我在我的 Requirement 中评估的变量类型不同,但我不知道如何从这里对其进行故障排除。我尝试将全局条件的类型设置为布尔值,并设置 WHERE 子句 ( Name like '%Firefox%') 但这会产生相同的错误。

如何使用应用程序的全局条件/需求定位逻辑复制基于 WQL 查询的集合?我在这里缺少什么(除了apt-get)?

小智 1

全局条件对话框可能是迄今为止我见过的 SCCM 最不直观的部分。

尝试一下:

  1. 以同样的方式重新创建 Firefox 2 全局条件,但这次在底部的 WQL 查询Where 子句字段中输入: ProductName like "%Firefox%"

  2. 在应用程序部署类型的“要求”选项卡中,使用 Firefox 2 全局条件,但将规则类型更改为“存在”