Incompatibilidade de tipo de consulta WQL de condições globais do SCCM (wbemErrTypeMismatch - 0x80041005)

8

Estamos lidando com toda a nossa lógica de segmentação de pacotes (e agora aplicativos) com coleções. Agora que mudamos do SCCM 2007 para o SCCM 2012 SP1, foi recomendado que movêssemos essa lógica para o modelo do Programa de Aplicativos e a implementássemos usando Condições Globais e Requisitos. Isso tem vários benefícios positivos: as coleções são usadas apenas para agrupamentos hierárquicos ou lógicos, obtemos uma implantação de aplicativos mais perfeita ao usar o Supercedence e aprimoramos a lógica de detecção.

Vou usar o plug-in do Adobe Flash Player como exemplo. Queremos apenas implantar o plug-in do Adobe Flash Player em estações de trabalho que tenham o Firefox instalado. Usando o modelo SCCM 2007 Package-Program, criamos uma coleção baseada 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 que a coleção foi criada, nós implantaremos nosso pacote-programa. Eu estou tentando replicar a mesma lógica usando lógica de requisitos globais e requisitos do programa de aplicativo. Todas as minhas tentativas de criar minha Condição Global com base na consulta WQL resultam em um wbemErrTypeMismatch ( 2147749893 (0x80041005) ).


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

Vamos começar com a consulta WQL. Eu usei o Scriptomatic para apenas despejar tudo na classe% W_de% WMI que faz parte do namespace SMS_InstalledSoftware . Tenho certeza de que o SMS_InstalledSoftware é o melhor local para executar consultas ao tentar avaliar se ou não, algo está instalado como Win32_Product é apenas para o software instalado pelo Windows Installer.

Encontrei 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 com a propriedade ProductName parece ser um bom caminho a percorrer. Se eu executar root\cimv2\sms em SELECT * FROM SMS_InstalledSoftware WHERE ProductName like '%Firefox%' no namespace wbemtest , obtenho o seguinte:



VamostentarconstruiraCondiçãoGlobalnoSCCMaseguir:



Isso é completamente não intuitivo, mas acho que entendi corretamente. As Condições Globais apenas configuram a parte condicional de toda a lógica do Aplicativo-Programa, não qualquer lógica de Programa de Aplicação avaliativa . Por esse motivo, não estou fazendo nada na cláusula WHERE. Essa Condição Global deve procurar no namespace root\cimv2\sms para a classe root\cimv2\sms e "retornar" a propriedade ProductName. Agora devo ser capaz de avaliar o valor / s dessa propriedade com o requisito de tipo de implantação dos meus aplicativos, certo?



Mais uma vez - ou não estou entendendo como a lógica da Condição / Requisitos Globais se mantém unida ou é apenas não intuitivo, mas o Requisito acima deve ser capaz de examinar todas as Strings retornadas da propriedade SMS_InstalledSoftware , avaliar se qualquer um deles contém 'Firefox' e, se assim for, implantar com alegria o plugin do Adobe Flash Player.

Infelizmente isso não funciona. Quase todas as máquinas no Deployment retornam o seguinte erro:

2147749893 (0x80041005) Type Mismatch

Suponho que isso signifique que a Condição Global está retornando um tipo diferente de variável do que estou avaliando em meu Requisito, mas não tenho ideia de como resolvê-lo a partir daqui. Eu tentei definir o tipo da minha condição global como booleano e definir a cláusula WHERE ( ProductName ), mas isso gera o mesmo erro.

Como posso replicar minha coleção baseada em consulta WQL usando a lógica de segmentação Global Condição / Requisitos do Programa de Aplicativos? O que estou perdendo aqui (além do apt-get)?

    
por kce 20.09.2013 / 03:20

3 respostas

1

O diálogo Condição Global é provavelmente a parte mais não intuitiva do SCCM que eu vi até agora.

Experimente:

  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

por 09.10.2013 / 14:30
0

Esta é uma suposição qualificada, já que não tenho como testar isso, hands-on

Como o WQL não tem um operador de restrição nativo, acredito que o operador Contains seja tratado como no PowerShell:

$referenceCollection -Contains $testValue

Se essa teoria estiver correta, sua lógica subjacente do Requirement expandirá para isso:

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

Se o operando à esquerda de -Contains não for uma coleção, mas uma única instância do mesmo tipo que o valor de teste (como em seu exemplo, duas sequências), -Contains será tratado exatamente como -eq .

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

    
por 10.10.2013 / 23:58
0

Eu pessoalmente usaria um script 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 booleeano, 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. Você pode basicamente usar a condição global em sua aplicação ao longo das linhas: O Firefox 2 deve ser igual a true. Eu fiz muito isso agora usando este método principalmente para itens de configuração e métodos de detecção de aplicativos onde um MSI não está sendo usado.

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

    
por 31.01.2015 / 08:18

Tags