我们一直在用集合来处理所有的包(和现在的应用程序)的定位逻辑。 现在我们已经从SCCM 2007迁移到SCCM 2012 SP1,build议我们将该逻辑移至应用程序模型,并使用全局条件和要求来实施。 这有许多好处 – 集合纯粹用于分层或逻辑分组,当使用超级时,我们获得了更加无缝的应用程序部署,并改进了检测逻辑。
我将使用Adobe Flash Player插件作为示例。 我们只想将Adobe Flash Player插件部署到已安装Firefox的工作站上。 使用SCCM 2007 Package-Program模型,我们将创build一个基于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"
一旦我们创build了Collection,我们就可以部署我们的Package程序。 我试图使用应用程序的全局条件和需求逻辑复制相同的逻辑。 我所有试图构build基于全局条件的WQL查询都会导致wbemErrTypeMismatch错误( 2147749893 (0x80041005) )。
现在,最佳做法build议我们保持与应用程序捆绑在一起的定位逻辑,我们需要做的是创build一个适当的WQL查询全局条件,然后我们可以使用应用程序的要求来评估它。
我们从WQL查询开始。 我使用Scriptomatic只是转储所有在SMS_InstalledSoftware WMI类,这是root\cimv2\sms命名空间的一部分。 我确信SMS_InstalledSoftware是在尝试评估是否安装某些软件时运行查询的最佳位置,因为Win32_Product仅适用于Windows安装程序安装的软件。
我find以下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%'运行SELECT * FROM SMS_InstalledSoftware WHERE ProductName like '%Firefox%'的root\cimv2\sms命名空间,我得到以下内容:

让我们试着在SCCM中构build全局条件:

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

再次 – 我不了解整个全局条件/需求逻辑是如何挂在一起的,或者这只是不直观的,但上面的要求应该能够查看从ProductName属性返回的所有string,评估它们是否包含“火狐“,如果是这样,愉快地部署Adobe Flash Player插件。
不幸的是它不工作。 部署中的几乎所有机器都会返回以下错误:
2147749893 (0x80041005) Type Mismatch
我认为这意味着全球状况正在返回一个不同于我在要求中评估的variablestypes,但是我不知道如何从这里排除故障。 我已经尝试将我的全局条件的types设置为布尔值,并设置WHERE子句( Name like '%Firefox%' ),但是这会产生相同的错误。
如何使用应用程序的全局条件/需求目标逻辑来复制我的基于WQL查询的集合? 我在这里错过了什么(除了apt-get)?
全局条件对话框可能是迄今为止我见过的SCCM中最不直观的部分。
试试这个:
以同样的方式重新创build您的Firefox 2全局条件,但是这次在底部的WQL查询Where子句字段中input: ProductName like "%Firefox%"
在应用程序部署types的“需求”选项卡中,使用Firefox 2全局条件,但将“规则types”更改为“存在”
这是合格的猜测,因为我没有办法testing这个,动手
由于WQL没有原生的遏制操作符,我相信Contains操作符被视为在PowerShell中:
$referenceCollection -Contains $testValue
如果这个理论是正确的,你的基础需求逻辑将扩展到:
"Microsoft Firefox 23 (en-us)" -Contains "firefox"
如果-Contains的左边的操作数不是一个集合,而是与testing值相同types的单个实例(如你的例子中的两个string),则-Contains完全等同于-eq 。
因此, "Microsoft Firefox 23 (en-us)" -Contains "firefox"将永远返回false。
我个人使用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。 我已经做了很多,现在使用这种方法主要用于configuration项和应用程序检测方法,如果不使用MSI。
如果你想保持现在的状态,那么我将不得不同意@ 1.618的评论。