Nicht übereinstimmende WQL-Abfragetyp-SCCM-globale Bedingung (wbemErrTypeMismatch - 0x80041005)


8

Wir haben unsere gesamte Targeting-Logik für Pakete (und jetzt Anwendungen) mit Sammlungen verarbeitet. Nachdem wir von SCCM 2007 zu SCCM 2012 SP1 gewechselt sind, wurde empfohlen, diese Logik in das Anwendungsprogrammmodell zu verschieben und sie unter Verwendung globaler Bedingungen und Anforderungen zu implementieren. Dies hat eine Reihe positiver Vorteile: Sammlungen werden ausschließlich für hierarchische oder logische Gruppierungen verwendet. Bei Verwendung von Supercedence erhalten wir eine nahtlosere Anwendungsbereitstellung und eine verbesserte Erkennungslogik.

Ich werde das Adobe Flash Player Plugin als Beispiel verwenden. Wir möchten das Adobe Flash Player Plugin nur auf Workstations bereitstellen, auf denen Firefox installiert ist. Unter Verwendung des SCCM 2007-Paketprogrammmodells würden wir eine Sammlung basierend auf einer WQL-Abfrage erstellen, die alle Arbeitsstationen mit installiertem Firefox enthält:

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"

Sobald wir die Sammlung erstellt hatten, stellten wir unser Paketprogramm dagegen bereit. Ich versuche, dieselbe Logik mithilfe der globalen Bedingungen und Anforderungslogik des Anwendungsprogramms zu replizieren. Alle meine Versuche, meine auf WQL-Abfragen basierende globale Bedingung zu erstellen, führen zu einem wbemErrTypeMismatch- Fehler ( 2147749893 (0x80041005)).



Nachdem Best Practices empfohlen haben, unsere Targeting-Logik mit der Anwendung zu bündeln, müssen wir lediglich eine geeignete globale Bedingung für die WQL-Abfrage erstellen und diese dann anhand der Anforderungen der Anwendung bewerten.

Beginnen wir mit der WQL-Abfrage. Ich habe Scriptomatic verwendet, um einfach alles in der SMS_InstalledSoftwareWMI-Klasse zu sichern, die Teil des root\cimv2\smsNamespace ist. Ich bin mir ziemlich sicher, dass SMS_InstalledSoftware der beste Ort ist, um Abfragen auszuführen, wenn versucht wird, zu bewerten, ob etwas installiert ist oder nicht, da Win32_Product nur für Windows Installer installierte Software ist.

Ich finde das folgende Firefox-Objekt:

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



Das Ausführen von WQL für die ProductName-Eigenschaft scheint ein guter Weg zu sein. Wenn ich SELECT * FROM SMS_InstalledSoftware WHERE ProductName like '%Firefox%'auf wbemtestden root\cimv2\smsNamespace stoße, erhalte ich Folgendes:

wbemtest Ergebnisse



Versuchen wir als nächstes, die globale Bedingung in SCCM zu erstellen:

Globale Zustandsabfrage



Das ist völlig unintuitiv, aber ich denke, ich verstehe es richtig. Globale Bedingungen richten nur den bedingten Teil der gesamten Anwendungsprogrammlogik ein, nicht die auswertende Anwendungsprogrammlogik. Aus diesem Grund mache ich in der WHERE-Klausel nichts. Diese globale Bedingung sollte im root\cimv2\smsNamespace nach der SMS_InstalledSoftwareKlasse suchen und die ProductName-Eigenschaft "zurückgeben". Ich sollte jetzt in der Lage sein, die Werte dieser Eigenschaft anhand der Anforderungen für den Bereitstellungstyp meiner Anwendungen zu bewerten, oder?

SCCM-Anforderungen



Nochmals - Ich verstehe entweder nicht, wie die gesamte Logik für globale Bedingungen / Anforderungen zusammenhängt, oder es ist nur so unintuitiv, aber die obige Anforderung sollte in der Lage sein, alle von der ProductNameEigenschaft zurückgegebenen Zeichenfolgen anzuzeigen und zu bewerten, ob eine von ihnen 'Firefox' enthält 'und wenn ja, gerne das Adobe Flash Player Plugin bereitstellen.

Leider funktioniert es nicht. Fast alle Computer in der Bereitstellung geben den folgenden Fehler zurück:

2147749893 (0x80041005) Type Mismatch

Ich verstehe dies so, dass Global Condition einen anderen Variablentyp zurückgibt, als ich in meiner Anforderung auswerte, aber ich habe keine Ahnung, wie ich ihn von hier aus beheben kann. Ich habe versucht, den Typ meiner globalen Bedingung auf Boolean und die WHERE-Klausel ( Name like '%Firefox%') zu setzen, aber dies führt zu demselben Fehler.

Wie kann ich meine auf WQL-Abfragen basierende Sammlung mithilfe der Targeting-Logik für globale Bedingungen / Anforderungen des Anwendungsprogramms replizieren? Was vermisse ich hier (außer apt-get)?

Antworten:


1

Der Dialog "Globale Bedingung" ist wahrscheinlich der unintuitivste Teil von SCCM, den ich bisher gesehen habe.

Probieren Sie es aus:

  1. Erstellen Sie Ihre globale Firefox 2-Bedingung auf die gleiche Weise neu, diesmal jedoch im Feld WQL Query Where Clause unten: ProductName like "%Firefox%"

  2. Verwenden Sie auf der Registerkarte "Anforderungen" des Bereitstellungstyps Ihrer Anwendung die globale Firefox 2-Bedingung, ändern Sie jedoch den Regeltyp in "Existenziell"


0

Dies ist eine qualifizierte Vermutung, da ich dies nicht praktisch testen kann

Da WQL keinen nativen Containment-Operator hat, glaube ich, dass der ContainsOperator wie in PowerShell behandelt wird:

$referenceCollection -Contains $testValue

Wenn diese Theorie korrekt ist, wird Ihre zugrunde liegende Anforderungslogik wie folgt erweitert:

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

Wenn der linke Operand von -Containskeine Sammlung ist, sondern eine einzelne Instanz desselben Typs wie der Testwert (wie in Ihrem Beispiel zwei Zeichenfolgen), -Containswird genau so behandelt -eq.

Daher "Microsoft Firefox 23 (en-us)" -Contains "firefox"wird immer false zurückgegeben.


0

Ich persönlich würde dafür eher ein Powershell-Skript als eine WQL-Abfrage verwenden. Meine Powershell würde so ziemlich genau das Gleiche tun wie die WQL, die Sie machen (sogar dieselbe WMI-Klasse abfragen), aber es würde mit einem Booleean funktionieren, z

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

Dies gibt im Wesentlichen true zurück, wenn die WMI-Abfrage ein Ergebnis zurückgibt, und false, wenn nicht. Sie können dann grundsätzlich die globale Bedingung in Ihrer Anwendung wie folgt verwenden: Firefox 2 muss gleich true sein. Ich habe dies jetzt viel getan, wobei ich diese Methode hauptsächlich für Konfigurationselemente und Anwendungserkennungsmethoden verwendet habe, bei denen eine MSI verwendet wird, wenn sie nicht verwendet wird.

Wenn Sie weiterhin so arbeiten möchten, wie Sie es derzeit sind, müsste ich @ 1.618 Kommentaren zustimmen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.