パッケージ(および現在はアプリケーション)のすべてのターゲットロジックをコレクションで処理しています。 SCCM 2007からSCCM 2012 SP1に移動したので、そのロジックをアプリケーションプログラムモデルに移動し、グローバル条件を使用して実装することをお勧めしますこれには多くのメリットがあります-コレクションは純粋に階層的または論理的なグループ化に使用されます。Supercedenceを使用すると、よりシームレスなアプリケーションの展開が可能になり、検出ロジックが改善されます。
例として、Adobe Flash Playerプラグインを使用します。私たちは、FirefoxがインストールされているワークステーションにAdobe Flash Playerプラグインをデプロイしたいだけです。 SCCM 2007 Package-Programモデルを使用して、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クエリベースのグローバル条件を作成しようとすると、すべて wbemErrTypeMismatch エラー(2147749893 (0x80041005)
)になります。
ベストプラクティスでは、ターゲットロジックをアプリケーションにバンドルしておくことを推奨しているため、適切なWQLクエリのグローバル条件を作成し、アプリケーションの要件を使用してそれを評価できます。
WQLクエリから始めましょう。私はScriptomaticを使用して、_SMS_InstalledSoftware
_名前空間の一部である_root\cimv2\sms
_ WMIクラスのすべてを単にダンプしました。 Win32_ProductはWindowsインストーラーでインストールされたソフトウェア専用であるため、何かがインストールされているかどうかを評価しようとするときに、クエリを実行するのに SMS_InstalledSoftware が最適な場所であると確信しています。
次の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=でグローバル条件を構築してみましょう。次に:
これは完全に直感的ではありませんが、私はそれを正しく理解していると思います。グローバル条件は、アプリケーションプログラムロジック全体のconditional部分を設定するだけで、evaluativeアプリケーションプログラムロジック。そのため、WHERE句では何もしていません。このグローバル条件は、_root\cimv2\sms
_クラスの_SMS_InstalledSoftware
_名前空間を調べ、ProductNameプロパティを「返す」必要があります。アプリケーションのデプロイメントタイプ要件でそのプロパティの値を評価できるはずです。
繰り返しますが、グローバル条件/要件ロジック全体がどのようにぶら下がっているのか理解していないか、これは直感的ではありませんが、上記の要件はProductName
プロパティから返されたすべての文字列を調べて、それらのどれにも「Firefox」が含まれており、そうであれば幸いにもAdobe Flash Playerプラグインをデプロイします。
残念ながら動作しません。 Deploymentのほとんどすべてのマシンが次のエラーを返します。
_2147749893 (0x80041005) Type Mismatch
_
これは、グローバル条件が要件で評価している変数とは異なるタイプの変数を返すことを意味しますが、ここからトラブルシューティングする方法がわかりません。グローバル条件のタイプをブールに設定し、WHERE句(_Name like '%Firefox%'
_)を設定しようとしましたが、同じエラーが発生します。
アプリケーションプログラムのグローバル条件/要件ターゲティングロジックを使用して、WQLクエリベースのコレクションをどのように複製できますか?ここで何が欠けていますか(apt-get以外)?
グローバル条件ダイアログは、おそらくSCCMこれまでに見た中で最も直感的でない部分です。
これを試してみてください:
同じ方法でFirefox 2のグローバル条件を再作成しますが、今度は下部のWQLクエリのWhere句フィールドに次のように入力します:ProductName like "%Firefox%"
アプリケーションの展開タイプの[要件]タブで、Firefox 2グローバル条件を使用しますが、ルールタイプを[存在]に変更します
個人的には、WQLクエリではなく、Powershellスクリプトを使用します。私の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を返します。その後、基本的にアプリケーションのグローバル条件を使用できます。Firefox2はtrueに等しい必要があります。私は現在、この方法をMSIが使用されていない場合にMSIが使用される構成アイテムとアプリケーション検出方法に主に使用して、これをたくさん行ってきました。
あなたが現在のように物事を続けたい場合は、@ 1.618コメントに同意する必要があります。
これは私がこれをテストする方法がないため、これは当て推量です、実践的に
WQLにはネイティブの包含演算子がないため、Contains
演算子はPowerShellと同様に扱われると思います。
_$referenceCollection -Contains $testValue
_
この理論が正しければ、基礎となる要件ロジックは次のように拡張されます。
_"Microsoft Firefox 23 (en-us)" -Contains "firefox"
_
_-Contains
_の左側のオペランドがコレクションではなく、テスト値と同じタイプの単一のインスタンスである場合(例では2つの文字列)、_-Contains
_は_-eq
_。
したがって、"Microsoft Firefox 23 (en-us)" -Contains "firefox"
は常にfalseを返します。