SCCM Глобальное условие WQL Несоответствие типов запросов (wbemErrTypeMismatch - 0x80041005)
Мы обрабатывали всю нашу логику таргетинга для пакетов (а теперь и приложений) с коллекциями. Теперь, когда мы перешли с 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_InstalledSoftware
Класс WMI, который является частью 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. Теперь я должен иметь возможность оценить значение / значения этого свойства с помощью требований к типу развертывания моих приложений, верно?
Опять же - я либо не понимаю, как вся логика Глобальных Условий / Требований соединяется вместе, либо это просто не интуитивно понятно, но вышеприведенное Требование должно быть в состоянии просмотреть все строки, возвращаемые из ProductName
оцените, если какой-либо из них содержит "Firefox" и, если это так, разверните плагин Adobe Flash Player
К сожалению, это не работает. Почти все машины в Deployment возвращают следующую ошибку:
2147749893 (0x80041005) Type Mismatch
Я предполагаю, что это означает, что Global Condition возвращает переменную другого типа, чем я оцениваю в своем Требовании, но я не знаю, как ее устранить здесь. Я попытался установить тип моего глобального условия на Boolean и задать условие WHERE (Name like '%Firefox%'
) но это дает ту же ошибку.
Как я могу реплицировать мою коллекцию на основе запросов WQL, используя логику таргетинга глобальных условий / требований прикладной программы? Что мне здесь не хватает (кроме apt-get)?
3 ответа
Диалоговое окно "Глобальные условия", вероятно, является самой неинтуитивной частью SCCM, которую я когда-либо видел.
Дайте это попробовать:
Аналогичным образом воссоздайте глобальное условие Firefox 2, но на этот раз в поле WQL Query Where Clause внизу введите:
ProductName like "%Firefox%"
На вкладке "Требования" типа развертывания вашего приложения используйте глобальное условие Firefox 2, но измените тип правила на "Existential".
Я бы лично использовал для этого сценарий 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.
Это квалифицированные догадки, так как у меня нет возможности проверить это на практике
Поскольку в WQL отсутствует встроенный оператор сдерживания, я считаю, что Contains
оператор рассматривается как в PowerShell:
$referenceCollection -Contains $testValue
Если эта теория верна, ваша базовая логика требований расширится до следующего:
"Microsoft Firefox 23 (en-us)" -Contains "firefox"
Если левый операнд -Contains
это не коллекция, а один экземпляр того же типа, что и тестовое значение (как в вашем примере две строки), -Contains
трактуется как -eq
,
Следовательно, "Microsoft Firefox 23 (en-us)" -Contains "firefox"
всегда вернет false.