SCCM Global Condition WQL Query Type Mismatch (wbemErrTypeMismatch - 0x80041005)


8

Kami telah menangani semua logika penargetan kami untuk Paket (dan sekarang Aplikasi) dengan Koleksi. Sekarang kami telah pindah dari SCCM 2007 ke SCCM 2012 SP1, kami merekomendasikan agar kami memindahkan logika itu ke model Program-Aplikasi dan mengimplementasikannya menggunakan Ketentuan dan Persyaratan Global. Ini memiliki sejumlah manfaat positif - Koleksi digunakan murni untuk pengelompokan hierarkis atau logis, kami mendapatkan penyebaran Aplikasi yang lebih mulus saat menggunakan Supercedence, dan peningkatan logika Deteksi.

Saya akan menggunakan Adobe Flash Player Plugin sebagai contoh. Kami hanya ingin menggunakan Adobe Flash Player Plugin ke workstation yang telah diinstal Firefox. Menggunakan model Program-Paket SCCM 2007 kami akan membuat Koleksi berdasarkan kueri WQL yang berisi semua workstation dengan Firefox yang diinstal:

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"

Setelah Koleksi dibuat, kami akan menggunakan Paket-Program kami untuk menentangnya. Saya mencoba mereplikasi logika yang sama menggunakan logika Kondisi dan Persyaratan Global Program-Program. Semua upaya saya untuk membangun kondisi global saya berdasarkan hasil WQL dalam kesalahan wbemErrTypeMismatch ( 2147749893 (0x80041005)).



Sekarang karena praktik terbaik merekomendasikan agar kami menjaga agar logika penargetan kami tetap dibundel dengan Aplikasi, apa yang perlu kami lakukan adalah membuat WQL query Global Condition yang sesuai dan kemudian kami dapat mengevaluasinya menggunakan Persyaratan Aplikasi.

Mari kita mulai dengan permintaan WQL. Saya menggunakan Scriptomatic untuk membuang semuanya di SMS_InstalledSoftwareKelas WMI yang merupakan bagian dari root\cimv2\smsnamespace. Saya cukup yakin bahwa SMS_InstalledSoftware adalah tempat terbaik untuk menjalankan kueri ketika mencoba mengevaluasi apakah sesuatu diinstal atau tidak karena Win32_Product hanya untuk perangkat lunak yang diinstal Windows Installer.

Saya menemukan objek terkait Firefox berikut:

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



Menjalankan WQL terhadap properti ProductName tampaknya menjadi cara yang baik untuk pergi. Jika saya menjalankan SELECT * FROM SMS_InstalledSoftware WHERE ProductName like '%Firefox%'di wbemtestmelawan root\cimv2\smsnamespace saya mendapatkan berikut:

hasil wbemtest



Mari kita coba membangun Kondisi Global di SCCM berikutnya:

Permintaan Kondisi Global



Ini benar-benar tidak intuitif tetapi saya pikir saya memahaminya dengan benar. Ketentuan Global hanya mengatur bagian kondisional dari seluruh logika Program-Aplikasi, bukan logika Program-Aplikasi yang evaluatif . Untuk alasan itu, saya tidak melakukan apa pun dalam klausa WHERE. Kondisi Global ini harus mencari di root\cimv2\smsnamespace untuk SMS_InstalledSoftwarekelas dan "mengembalikan" properti ProductName. Saya sekarang harus dapat mengevaluasi nilai Properti itu dengan Persyaratan Jenis Penerapan Aplikasi saya, kan?

Persyaratan SCCM



Sekali lagi - Saya tidak mengerti bagaimana logika Kondisi / Persyaratan Global saling terkait atau ini hanya tidak intuitif tetapi Persyaratan di atas harus dapat melihat semua String yang dikembalikan dari ProductNameproperti, mengevaluasi apakah ada di antara mereka yang mengandung 'Firefox 'dan jika begitu dengan senang hati gunakan Plugin Adobe Flash Player.

Sayangnya itu tidak berhasil. Hampir semua mesin di Deployment mengembalikan kesalahan berikut:

2147749893 (0x80041005) Type Mismatch

Saya menganggap ini berarti bahwa Kondisi Global mengembalikan jenis variabel yang berbeda dari yang saya evaluasi dalam Persyaratan saya, tetapi saya tidak tahu bagaimana cara memecahkannya dari sini. Saya sudah mencoba mengatur tipe Kondisi Global saya ke Boolean, dan mengatur klausa WHERE ( Name like '%Firefox%') tetapi ini menghasilkan kesalahan yang sama.

Bagaimana saya bisa meniru Koleksi berbasis permintaan WQL saya menggunakan logika penargetan Kondisi / Persyaratan Global Program-Program? Apa yang saya lewatkan di sini (selain apt-get)?

Jawaban:


1

Dialog Kondisi Global mungkin adalah bagian paling tidak intuitif dari SCCM yang pernah saya lihat sejauh ini.

Cobalah ini:

  1. buat ulang Firefox 2 Global Condition Anda dengan cara yang sama, tetapi kali ini di bidang WQL Query Where Clause di bagian bawah, masukkan: ProductName like "%Firefox%"

  2. Di tab Persyaratan dari Jenis Penerapan Aplikasi Anda, gunakan Kondisi Global Firefox 2, tetapi ubah Tipe Aturan menjadi Eksistensial


0

Ini adalah dugaan yang memenuhi syarat, karena saya tidak punya cara untuk menguji ini, langsung

Karena WQL tidak memiliki operator penahanan asli, saya percaya bahwa Containsoperator diperlakukan seperti di PowerShell:

$referenceCollection -Contains $testValue

Jika teori ini benar, logika Persyaratan mendasar Anda akan diperluas ke ini:

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

Jika operan kiri -Containsbukan koleksi, tetapi sebuah instance tunggal dari jenis yang sama dengan nilai tes (seperti dalam contoh Anda, dua string), -Containsdiperlakukan persis seperti -eq.

Karena itu, "Microsoft Firefox 23 (en-us)" -Contains "firefox"akan selalu mengembalikan false.


0

Saya pribadi akan menggunakan skrip PowerShell untuk ini daripada permintaan WQL. PowerShell saya akan melakukan banyak hal yang persis sama dengan WQL yang Anda lakukan (bahkan meminta kelas WMI yang sama) tetapi akan bekerja menggunakan booleean misalnya

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

Ini pada dasarnya akan mengembalikan true jika kueri WMI mengembalikan hasil dan false jika tidak. Anda pada dasarnya dapat menggunakan kondisi global pada aplikasi Anda di sepanjang baris: Firefox 2 harus sama dengan benar. Saya telah melakukan ini banyak sekarang menggunakan metode ini sebagian besar untuk item konfigurasi dan metode deteksi aplikasi di mana MSI jika tidak digunakan.

Jika Anda ingin terus melakukan hal-hal seperti Anda saat ini maka saya harus setuju dengan @ 1,618 komentar.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.