我们一直在处理带有集合的包(现在是应用程序)的所有定位逻辑。现在,我们已经从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_InstalledSoftware
WMI类(属于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%'
,则会得到以下信息:wbemtest
root\cimv2\sms
接下来,让我们尝试在SCCM中构建全局条件:
这是完全不直观的,但我认为我理解正确。全局条件只是设置了整个应用程序逻辑的条件部分,而不是评估性应用程序逻辑中的任何一个。因此,我在WHERE子句中什么也不做。此全局条件应在类的root\cimv2\sms
名称空间中查找SMS_InstalledSoftware
并“返回” ProductName属性。现在,我应该能够使用我的应用程序的“部署类型需求”评估该属性的值,对吗?
再说一遍-我要么不理解整个Global Condition / Requires逻辑是如何组合在一起的,要么只是这个不直观,但是上述Requirement应该能够查看从ProductName
属性返回的所有Strings ,评估其中是否包含'Firefox ',如果可以的话,请愉快地部署Adobe Flash Player插件。
不幸的是,它不起作用。部署中的几乎所有计算机都返回以下错误:
2147749893 (0x80041005) Type Mismatch
我认为这意味着Global Condition返回的变量类型与我在Requirement中评估的变量类型不同,但是我不知道如何从此处进行故障排除。我尝试将全局条件的类型设置为布尔值,并设置WHERE子句(Name like '%Firefox%'
),但这会产生相同的错误。
如何使用应用程序的全局条件/需求定位逻辑来复制基于WQL查询的集合?我在这里想念什么(apt-get除外)?