SCCM Глобальное условие WQL Несоответствие типов запросов (wbemErrTypeMismatch - 0x80041005)

8

Мы обрабатывали всю нашу логику таргетинга для пакетов (а теперь и приложений) с коллекциями. Теперь, когда мы перешли с SCCM 2007 на SCCM 2012 с пакетом обновления 1 (SP1), было рекомендовано перенести эту логику в модель Application-Program и реализовать ее с использованием глобальных условий и требований. Это имеет ряд положительных преимуществ: коллекции используются исключительно для иерархической или логической группировки, мы получаем более плавное развертывание приложений при использовании Supercedence и улучшенную логику обнаружения.

Я буду использовать плагин Adobe Flash Player в качестве примера. Мы хотим развернуть плагин Adobe Flash Player только на рабочих станциях, на которых установлен Firefox. Используя модель SCCM 2007 Package-Program, мы создали бы Collection на основе WQL-запроса, который содержал бы все рабочие станции с установленным Firefox:

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-запрос Global Condition, а затем мы можем оценить его, используя Требования Приложения.

Начнем с запроса WQL. Я использовал Scriptomatic, чтобы просто сбросить все в классе SMS_InstalledSoftwareWMI, который является частью root\cimv2\smsпространства имен. Я вполне уверен, что SMS_InstalledSoftware - лучшее место для выполнения запросов при попытке оценить, установлено ли что-то или нет, так как Win32_Product предназначен только для программного обеспечения, установленного установщиком Windows.

Я нахожу следующий связанный с 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



Запуск WQL для свойства ProductName кажется хорошим способом. Если я бегу SELECT * FROM SMS_InstalledSoftware WHERE ProductName like '%Firefox%'в wbemtestотношении root\cimv2\smsимен я получаю следующее:

лучшие результаты



Давайте попробуем создать глобальное условие в SCCM следующим образом:

Глобальный запрос условий



Это совершенно не интуитивно понятно, но, думаю, я правильно понимаю. Глобальные условия просто устанавливают условную часть всей логики прикладной программы, а не оценочную логику прикладной программы. По этой причине я ничего не делаю в предложении WHERE. Это глобальное условие должно искать в root\cimv2\smsпространстве имен SMS_InstalledSoftwareкласс и «возвращать» свойство ProductName. Теперь я должен иметь возможность оценить значение / значения этого свойства с помощью требований к типу развертывания моих приложений, верно?

Требования SCCM



Опять же - я либо не понимаю, как вся логика Глобальных Условий / Требований соединяется вместе, либо это просто не интуитивно понятно, но вышеуказанное Требование должно быть в состоянии просмотреть все строки, возвращаемые из ProductNameсвойства, оценить, содержат ли какие-либо из них «Firefox». и, если так, радостно разверните плагин Adobe Flash Player.

К сожалению, это не работает. Почти все машины в Deployment возвращают следующую ошибку:

2147749893 (0x80041005) Type Mismatch

Я предполагаю, что это означает, что Global Condition возвращает переменную другого типа, чем я оцениваю в своем Требовании, но я не знаю, как ее устранить здесь. Я попытался установить тип моего Глобального условия на Boolean и задать условие WHERE ( Name like '%Firefox%'), но это приводит к той же ошибке.

Как я могу реплицировать мою коллекцию на основе запросов WQL, используя логику таргетинга глобальных условий / требований прикладной программы? Что мне здесь не хватает (кроме apt-get)?


источник

Ответы:

1

Диалоговое окно «Глобальные условия», вероятно, является самой неинтуитивной частью SCCM, которую я когда-либо видел.

Попробуйте это:

  1. Аналогичным образом воссоздайте глобальное условие Firefox 2, но на этот раз в поле WQL Query Where Clause внизу введите: ProductName like "%Firefox%"

  2. На вкладке «Требования» типа развертывания вашего приложения используйте глобальное условие Firefox 2, но измените тип правила на «Existential».

1,618
источник
0

Это квалифицированные догадки, так как у меня нет возможности проверить это на практике

Поскольку в WQL нет встроенного оператора локализации, я считаю, что этот Containsоператор рассматривается как в PowerShell:

$referenceCollection -Contains $testValue

Если эта теория верна, ваша базовая логика требований расширится до следующего:

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

Если левый операнд -Containsявляется не коллекцией, а единственным экземпляром того же типа, что и тестовое значение (как в вашем примере две строки), то -Containsон обрабатывается точно так же, как -eq.

Поэтому "Microsoft Firefox 23 (en-us)" -Contains "firefox"всегда будет возвращать false.

Матиас Р. Ессен
источник
0

Я бы лично использовал для этого сценарий powershell, а не WQL-запрос. Мой PowerShell будет делать почти то же самое, что и WQL, который вы делаете (даже запрашивая тот же класс WMI), но он будет работать с использованием логического значения, например

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

По сути, это вернет true, если запрос WMI вернет результат, и false, если нет. Затем вы можете в основном использовать глобальное условие в вашем приложении по формуле: Firefox 2 должен быть равен true. Я сделал это много сейчас, используя этот метод в основном для элементов конфигурации и методов обнаружения приложений, где MSI, если не используется.

Если вы хотите продолжать делать то же, что и сейчас, я бы согласился с комментариями @ 1.618.

d4rkcell
источник