Incompatibilidade do tipo de consulta WQL de condição global do SCCM (wbemErrTypeMismatch - 0x80041005)


8

Temos lidado com toda a nossa lógica de segmentação para pacotes (e agora aplicativos) com coleções. Agora que passamos do SCCM 2007 para o SCCM 2012 SP1, foi recomendado que movêssemos essa lógica para o modelo de aplicativo-programa e a implementássemos usando condições e requisitos globais. Isso tem vários benefícios positivos - as coleções são usadas apenas para agrupamento hierárquico ou lógico, obtemos uma implantação de aplicativos mais transparente ao usar a Supercedência e uma lógica de detecção aprimorada.

Vou usar o plug-in do Adobe Flash Player como exemplo. Queremos implantar apenas o Adobe Flash Player Plugin em estações de trabalho com o Firefox instalado. Usando o modelo do SCCM 2007 Package-Program, criaríamos uma coleção com base em uma consulta WQL que continha todas as estações de trabalho com o Firefox instalado:

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"

Uma vez criada a coleção, implantávamos nosso programa de pacotes nele. Estou tentando replicar a mesma lógica usando a lógica de condições e requisitos globais do programa de aplicativos. Todas as minhas tentativas de criar minha Condição Global baseada em consulta WQL resultam em um erro wbemErrTypeMismatch ( 2147749893 (0x80041005)).



Agora que as práticas recomendadas recomendam manter nossa lógica de segmentação empacotada com o Aplicativo, o que precisamos fazer é criar uma Condição Global apropriada da consulta WQL e, em seguida, podemos avaliá-la usando os Requisitos do Aplicativo.

Vamos começar com a consulta WQL. Usei o Scriptomatic para despejar tudo na SMS_InstalledSoftwareclasse WMI, que faz parte do root\cimv2\smsespaço para nome. Tenho certeza de que o SMS_InstalledSoftware é o melhor local para executar consultas ao tentar avaliar se algo está ou não instalado, pois o Win32_Product é apenas para o software instalado no Windows Installer.

Eu encontro o seguinte objeto relacionado ao 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



Executar o WQL na propriedade ProductName parece ser um bom caminho a percorrer. Se eu executar SELECT * FROM SMS_InstalledSoftware WHERE ProductName like '%Firefox%'em wbemtestrelação ao root\cimv2\smsnamespace recebo a seguinte:

resultados wbemtest



Vamos tentar construir a Condição Global no SCCM a seguir:

Consulta de condição global



Isso é completamente pouco intuitivo, mas acho que entendi corretamente. As Condições Globais apenas configuram a parte condicional de toda a lógica do Programa Aplicativo, e não a lógica avaliativa do Programa Aplicativo. Por esse motivo, não estou fazendo nada na cláusula WHERE. Essa condição global deve procurar no root\cimv2\smsespaço de nomes a SMS_InstalledSoftwareclasse e "retornar" a propriedade ProductName. Agora devo poder avaliar os valores dessa propriedade com os Requisitos de tipo de implantação dos meus aplicativos, certo?

Requisitos do SCCM



Novamente - ou eu não estou entendendo como toda a lógica de Condição / Requisitos Globais se mantém unida ou é pouco intuitiva, mas o Requisito acima deve ser capaz de examinar todas as Strings retornadas da ProductNamepropriedade, avaliar se alguma delas contém 'Firefox 'e, se for o caso, implemente o plug-in do Adobe Flash Player.

Infelizmente isso não funciona. Quase todas as máquinas na Implantação retornam o seguinte erro:

2147749893 (0x80041005) Type Mismatch

Entendo que isso significa que a Condição Global está retornando um tipo diferente de variável do que estou avaliando no meu Requisito, mas não tenho idéia de como solucioná-lo daqui. Tentei definir o tipo da minha condição global como booleano e definir a cláusula WHERE ( Name like '%Firefox%'), mas isso gera o mesmo erro.

Como replicar minha coleção baseada em consulta WQL usando a lógica de direcionamento de condições / requisitos globais do programa de aplicativos? O que estou perdendo aqui (além do apt-get)?

Respostas:


1

A caixa de diálogo Condição Global é provavelmente a parte mais intuitiva do SCCM que eu já vi até agora.

Faça uma tentativa:

  1. recrie sua condição global do Firefox 2 da mesma maneira, mas desta vez no campo WQL Query Where Clause na parte inferior, coloque: ProductName like "%Firefox%"

  2. Na guia Requisitos do Tipo de implantação do seu aplicativo, use a Condição global do Firefox 2, mas altere o Tipo de regra para Existencial


0

Isso é adivinhação qualificada, pois não tenho como testar isso,

Como o WQL não possui um operador de contenção nativo, acredito que o Containsoperador seja tratado como no PowerShell:

$referenceCollection -Contains $testValue

Se essa teoria estiver correta, sua lógica de requisitos subjacente será expandida para isso:

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

Se o operando do lado esquerdo de -Containsnão for uma coleção, mas uma única instância do mesmo tipo que o valor de teste (como no exemplo, duas seqüências de caracteres), -Containsserá tratado exatamente como -eq.

Portanto, "Microsoft Firefox 23 (en-us)" -Contains "firefox"sempre retornará falso.


0

Eu pessoalmente usaria um script do PowerShell para isso, em vez de uma consulta WQL. Meu powershell faria exatamente a mesma coisa que o WQL que você está fazendo (mesmo consultando a mesma classe WMI), mas funcionaria usando um booleano, por exemplo

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

Isso essencialmente retornará true se a consulta WMI retornar um resultado e false se não. Basicamente, você pode usar a condição global em seu aplicativo ao longo das linhas de: Firefox 2 deve ser igual a true. Eu já fiz muito isso agora usando esse método principalmente para itens de configuração e métodos de detecção de aplicativos em que um MSI se não estiver sendo usado.

Se você quiser continuar fazendo as coisas como está atualmente, eu teria que concordar com os comentários @ 1.618.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.