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


8

我们一直在处理带有集合的包(现在是应用程序)的所有定位逻辑。现在,我们已经从SCCM 2007迁移到SCCM 2012 SP1,建议将逻辑移至应用程序模型,并使用全局条件和需求来实现它。这具有许多积极的好处-集合仅用于层次结构或逻辑分组,使用“高级”时我们可以实现更加无缝的应用程序部署,并改进了检测逻辑。

我将以Adobe Flash Player插件为例。我们只想将Adobe Flash Player插件部署到已安装Firefox的工作站。使用SCCM 2007 Package-Program模型,我们将基于WQL查询创建一个Collection,其中包含所有安装了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"

一旦创建了Collection,就可以针对它部署Package-Program。我正在尝试使用应用程序的全局条件和需求逻辑来复制相同的逻辑。我基于全局条件构建WQL查询的所有尝试都导致了wbemErrTypeMismatch错误(2147749893 (0x80041005))。



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

让我们从WQL查询开始。我使用Scriptomatic只是转储了SMS_InstalledSoftwareWMI类(属于root\cimv2\sms名称空间)中的所有内容。我可以肯定地确定,当尝试评估是否已安装某些东西时,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



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

测试结果



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

全局条件查询



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

SCCM要求



再说一遍-我要么不理解整个Global Condition / Requires逻辑是如何组合在一起的,要么只是这个不直观,但是上述Requirement应该能够查看从ProductName属性返回的所有Strings ,评估其中是否包含'Firefox ',如果可以的话,请愉快地部署Adobe Flash Player插件。

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

2147749893 (0x80041005) Type Mismatch

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

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

Answers:


1

到目前为止,“全局条件”对话框可能是SCCM中最不直观的部分。

试试看:

  1. 以相同的方式重新创建Firefox 2 Global Condition,但是这次在底部的WQL Query Where Clause字段中,输入: ProductName like "%Firefox%"

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


0

这是合格的猜测,因为我无法亲自测试

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

$referenceCollection -Contains $testValue

如果该理论正确,那么您的基本需求逻辑将扩展为:

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

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

因此,"Microsoft Firefox 23 (en-us)" -Contains "firefox"将始终返回false。


0

我个人会为此使用Powershell脚本,而不是WQL查询。我的powershell几乎可以完成与您正在执行的WQL相同的操作(甚至查询相同的WMI类),但是可以使用booleean例如

$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的评论。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.