Incompatibilité du type de requête WQL de condition globale SCCM (wbemErrTypeMismatch - 0x80041005)

8

Nous avons géré toute notre logique de ciblage pour les packages (et maintenant les applications) avec les collections. Maintenant que nous sommes passés de SCCM 2007 à SCCM 2012 SP1, il a été recommandé de déplacer cette logique vers le modèle de programme d'application et de l'implémenter à l'aide des conditions et exigences globales. Cela présente un certain nombre d'avantages positifs: les collections sont utilisées uniquement pour le regroupement hiérarchique ou logique, nous obtenons un déploiement d'application plus transparent lors de l'utilisation de la supercedence et une logique de détection améliorée.

Je vais utiliser Adobe Flash Player Plugin comme exemple. Nous souhaitons uniquement déployer le plug-in Adobe Flash Player sur les postes de travail sur lesquels Firefox est installé. En utilisant le modèle SCCM 2007 Package-Program, nous créerions une collection basée sur une requête WQL qui contiendrait tous les postes de travail avec Firefox installé:

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"

Une fois la collection créée, nous déploierions alors notre programme de packages. J'essaie de répliquer la même logique à l'aide de la logique Conditions générales et exigences du programme d'application. Toutes mes tentatives pour créer ma condition globale basée sur une requête WQL entraînent une erreur wbemErrTypeMismatch ( 2147749893 (0x80041005)).



Maintenant que les meilleures pratiques recommandent que nous conservions notre logique de ciblage avec l'application, nous devons créer une condition globale de requête WQL appropriée, puis nous pouvons l'évaluer à l'aide des exigences de l'application.

Commençons par la requête WQL. J'ai utilisé Scriptomatic pour simplement vider tout dans la SMS_InstalledSoftwareclasse WMI qui fait partie de l' root\cimv2\smsespace de noms. Je suis raisonnablement sûr que SMS_InstalledSoftware est le meilleur endroit pour exécuter des requêtes lorsque vous essayez d'évaluer si quelque chose est installé ou non car Win32_Product est uniquement pour le logiciel installé Windows Installer.

Je trouve l'objet lié à Firefox suivant:

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'exécution du WQL sur la propriété ProductName semble être une bonne solution. Si je lance SELECT * FROM SMS_InstalledSoftware WHERE ProductName like '%Firefox%'en wbemtestcontre l' root\cimv2\smsespace de noms que je reçois le texte suivant:

résultats wbemtest



Essayons de construire la condition globale dans SCCM ensuite:

Requête de condition globale



C'est complètement peu intuitif mais je pense que je le comprends correctement. Les conditions globales viennent de configurer la partie conditionnelle de l'ensemble de la logique du programme d'application et non de la logique évaluative du programme d' application. Pour cette raison, je ne fais rien dans la clause WHERE. Cette condition globale doit rechercher dans l' root\cimv2\smsespace de noms de la SMS_InstalledSoftwareclasse et "renvoyer" la propriété ProductName. Je devrais maintenant être en mesure d'évaluer la valeur / s de cette propriété avec l'exigence de type de déploiement de mes applications, non?

Exigences SCCM



Encore une fois - je ne comprends pas comment l'ensemble de la logique Condition globale / Exigences se tient ensemble ou c'est juste peu intuitif, mais l'exigence ci-dessus devrait être en mesure de regarder toutes les chaînes renvoyées par la ProductNamepropriété, d'évaluer si l'une d'entre elles contient 'Firefox 'et, si heureux, déployez Adobe Flash Player Plugin.

Malheureusement ça ne marche pas. Presque toutes les machines du déploiement renvoient l'erreur suivante:

2147749893 (0x80041005) Type Mismatch

Je suppose que cela signifie que Global Condition renvoie un type de variable différent de celui que j'évalue dans mon exigence, mais je ne sais pas comment le résoudre à partir d'ici. J'ai essayé de définir le type de ma condition globale sur booléen et de définir la clause WHERE ( Name like '%Firefox%'), mais cela génère la même erreur.

Comment puis-je répliquer ma collection basée sur une requête WQL à l'aide de la logique de ciblage Condition globale / Exigences du programme d'application? Qu'est-ce que je manque ici (à part apt-get)?


la source

Réponses:

1

La boîte de dialogue Condition globale est probablement la partie la plus intuitive de SCCM que j'ai vue jusqu'à présent.

Essayez ceci:

  1. recréez votre condition globale de Firefox 2 de la même manière, mais cette fois dans le champ WQL Query Where Clause en bas, mettez: ProductName like "%Firefox%"

  2. Dans l'onglet Exigences du type de déploiement de votre application, utilisez la condition globale de Firefox 2, mais changez le type de règle en Existentiel

1,618
la source
0

C'est une conjecture qualifiée, car je n'ai aucun moyen de tester cela,

Comme WQL n'a pas d'opérateur de confinement natif, je pense que l' Containsopérateur est traité comme dans PowerShell:

$referenceCollection -Contains $testValue

Si cette théorie est correcte, votre logique d'exigence sous-jacente se développera comme suit:

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

Si l'opérande de gauche -Containsn'est pas une collection, mais une seule instance du même type que la valeur de test (comme dans votre exemple, deux chaînes), -Containsest traitée exactement comme -eq.

Par conséquent, "Microsoft Firefox 23 (en-us)" -Contains "firefox"retournera toujours faux.

Mathias R. Jessen
la source
0

J'utiliserais personnellement un script PowerShell pour cela plutôt qu'une requête WQL. Mon PowerShell ferait à peu près exactement la même chose que le WQL que vous faites (même en interrogeant la même classe WMI) mais cela fonctionnerait en utilisant un booléen, par exemple

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

Cela renverra essentiellement true si la requête WMI renvoie un résultat et false sinon. Vous pouvez ensuite utiliser la condition globale sur votre application de la manière suivante: Firefox 2 doit être égal à true. J'ai beaucoup fait cela maintenant en utilisant cette méthode principalement pour les éléments de configuration et les méthodes de détection d'application où un MSI n'est pas utilisé.

Si vous vouliez continuer à faire les choses comme vous êtes actuellement, je serais d'accord avec les commentaires @ 1.618.

d4rkcell
la source