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


8

Abbiamo gestito tutta la nostra logica di targeting per pacchetti (e ora applicazioni) con raccolte. Ora che ci siamo spostati da SCCM 2007 a SCCM 2012 SP1, è stato raccomandato di spostare quella logica nel modello del programma applicativo e di implementarla utilizzando condizioni e requisiti globali. Ciò ha una serie di vantaggi positivi: le raccolte vengono utilizzate esclusivamente per raggruppamenti gerarchici o logici, otteniamo una distribuzione dell'applicazione più fluida quando si utilizza Supercedence e una logica di rilevamento migliorata.

Userò Adobe Flash Player Plugin come esempio. Vogliamo distribuire Adobe Flash Player Plugin su workstation su cui è installato Firefox. Usando il modello di programma di pacchetto SCCM 2007, creeremmo una raccolta basata su una query WQL che conteneva tutte le workstation con Firefox installato:

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"

Una volta creata la raccolta, avremmo quindi implementato il nostro programma di pacchetti contro di essa. Sto cercando di replicare la stessa logica usando la logica Condizioni e requisiti globali del programma applicativo. Tutti i miei tentativi di creare la mia condizione globale basata su query WQL generano un errore wbemErrTypeMismatch ( 2147749893 (0x80041005)).



Ora che le migliori pratiche raccomandano di mantenere la nostra logica di targeting in bundle con l'Applicazione, ciò che dobbiamo fare è creare una query WQL appropriata Condizione globale e quindi possiamo valutarla utilizzando i Requisiti dell'applicazione.

Cominciamo con la query WQL. Ho usato Scriptomatic per scaricare tutto nella SMS_InstalledSoftwareclasse WMI che fa parte dello root\cimv2\smsspazio dei nomi. Sono ragionevolmente sicuro che SMS_InstalledSoftware è il posto migliore per eseguire query quando si tenta di valutare se qualcosa è installato o meno, poiché Win32_Product è solo per il software installato Windows Installer.

Trovo il seguente oggetto relativo a 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



L'esecuzione di WQL contro la proprietà ProductName sembra essere una buona strada da percorrere. Se mi imbatto SELECT * FROM SMS_InstalledSoftware WHERE ProductName like '%Firefox%'nello spazio wbemtestdei root\cimv2\smsnomi ottengo quanto segue:

risultati wbemtest



Proviamo a creare la condizione globale in SCCM dopo:

Query sulle condizioni globali



Questo non è del tutto intuitivo ma penso di averlo capito correttamente. Le condizioni globali hanno appena impostato la parte condizionale dell'intera logica del programma applicativo e non della logica valutativa del programma applicativo. Per questo motivo, non sto facendo nulla nella clausola WHERE. Questa condizione globale dovrebbe cercare nello root\cimv2\smsspazio dei nomi la SMS_InstalledSoftwareclasse e "restituire" la proprietà ProductName. Ora dovrei essere in grado di valutare il / i valore / i di quella proprietà con il requisito del tipo di distribuzione delle mie applicazioni, giusto?

Requisiti SCCM



Ancora una volta: o non capisco come l'intera logica Condizione / Requisiti globali si blocca o è semplicemente così poco intuitivo, ma i Requisiti di cui sopra dovrebbero essere in grado di esaminare tutte le stringhe restituite dalla ProductNameproprietà, valutare se qualcuno di essi contiene "Firefox "e se così felicemente distribuire Adobe Flash Player Plugin.

Sfortunatamente non funziona. Quasi tutte le macchine nella distribuzione restituiscono il seguente errore:

2147749893 (0x80041005) Type Mismatch

Presumo che ciò significhi che la Condizione Globale sta restituendo un tipo di variabile diverso da quello che sto valutando nel mio Requisito, ma non ho idea di come risolverlo da qui. Ho provato a impostare il tipo della mia condizione globale su Booleano e impostare la clausola WHERE ( Name like '%Firefox%') ma questo produce lo stesso errore.

Come posso replicare la mia raccolta basata su query WQL usando la logica di targeting Condizioni / Requisiti globali del programma applicativo? Cosa mi sto perdendo qui (oltre a apt-get)?

Risposte:


1

La finestra di dialogo Condizione globale è probabilmente la parte più poco intuitiva di SCCM che ho visto finora.

Prova questo:

  1. ricrea la tua condizione globale di Firefox 2 allo stesso modo, ma questa volta nel campo Query WQL Query Where in fondo, inserisci: ProductName like "%Firefox%"

  2. Nella scheda Requisiti del tipo di distribuzione dell'applicazione, utilizzare la Condizione globale di Firefox 2, ma modificare il Tipo di regola in Esistente


0

Si tratta di congetture qualificate, in quanto non ho modo di provarlo, in modo pratico

Poiché WQL non ha un operatore di contenimento nativo, credo che l' Containsoperatore sia trattato come in PowerShell:

$referenceCollection -Contains $testValue

Se questa teoria è corretta, la logica Requisito sottostante si espanderà a questo:

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

Se l'operando di sinistra di -Containsnon è una raccolta, ma una singola istanza dello stesso tipo del valore di test (come nell'esempio, due stringhe), -Containsviene trattata esattamente come -eq.

Pertanto, "Microsoft Firefox 23 (en-us)" -Contains "firefox"restituirà sempre falso.


0

Personalmente userei uno script PowerShell per questo piuttosto che una query WQL. Il mio powershell farebbe praticamente la stessa cosa del WQL che stai facendo (anche interrogando la stessa classe WMI) ma funzionerebbe usando un booleeano ad es.

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

Ciò restituirà essenzialmente true se la query WMI restituisce un risultato e false in caso contrario. Quindi puoi sostanzialmente utilizzare la condizione globale sulla tua applicazione seguendo le linee di: Firefox 2 deve essere uguale a true. L'ho fatto molto ora usando questo metodo principalmente per elementi di configurazione e metodi di rilevamento delle applicazioni in cui un MSI se non utilizzato.

Se volessi continuare a fare le cose come sei, dovrei essere d'accordo con i commenti di @ 1.618.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.