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

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

我们一直使用集合来处理针对包(现在还有应用程序)的所有定位逻辑。现在我们已经从 SCCM 2007 迁移到 SCCM 2012 SP1,因此建议我们将该逻辑迁移到应用程序模型并使用全局条件和要求来实现它。这有许多积极的好处 - 集合仅用于分层或逻辑分组,使用 Supercedence 时我们可以实现更无缝的应用程序部署,并改进检测逻辑。

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

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"

一旦创建了集合,我们就会针对它部署我们的包程序。我试图使用应用程序的全局条件和要求逻辑复制相同的逻辑。我尝试构建基于 WQL 查询的全局条件,但结果都是wbemErrType不匹配错误 (2147749893 (0x80041005))。



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

让我们从 WQL 查询开始。我​​使用 Scriptomatic 转储SMS_InstalledSoftwareWMI 类中的所有内容,该类是命名空间的一部分root\cimv2\sms。我相当确定SMS_已安装软件是尝试评估某些东西是否安装时运行查询的最佳位置,因为 Win32_Product 仅适用于 Windows 安装程序安装的软件。

我找到以下与 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



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

wbemtest 结果



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

全局条件查询



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

SCCM 要求



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

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

2147749893 (0x80041005) Type Mismatch

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

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

答案1

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

尝试一下:

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

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

答案2

这是合理的猜测,因为我没有办法亲自测试

由于 WQL 没有本机包含运算符,我认为该Contains运算符在 PowerShell 中处理方式如下:

$referenceCollection -Contains $testValue

如果这个理论是正确的,那么你的底层需求逻辑将扩展为:

"Microsoft Firefox 23 (en-us)" -Contains "firefox"

如果的左边操作数-Contains不是一个集合,而是与测试值相同类型的单个实例(如您的示例中的两个字符串),-Contains则将被视为-eq

因此,"Microsoft Firefox 23 (en-us)" -Contains "firefox"总是会返回 false。

答案3

我个人会使用 powershell 脚本来实现这一点,而不是 WQL 查询。我的 powershell 几乎可以完成与你正在执行的 WQL 完全相同的事情(甚至查询相同的 WMI 类),但它可以使用布尔值,例如

$Firefox = Get-WmiObject -namespace root\cimv2\sms -class SMS_InstalledSoftware -filter "ARPDisplayName LIKE '%Firefox%'"
if($Firefox){return $true}else{return $false}

如果 WMI 查询返回结果,则返回 true,否则返回 false。然后,您基本上可以在应用程序上使用全局条件,如下所示:Firefox 2 必须等于 true。我现在已经多次使用此方法,主要用于配置项和应用程序检测方法,其中不使用 MSI。

如果您想继续按照当前的方式行事,那么我不得不同意@1.618 的评论。

相关内容