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_InstalledSoftware
classe WMI, que faz parte do root\cimv2\sms
espaç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 wbemtest
relação ao root\cimv2\sms
namespace recebo a seguinte:
Vamos tentar construir a Condição Global no SCCM a seguir:
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\sms
espaço de nomes a SMS_InstalledSoftware
classe 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?
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 ProductName
propriedade, 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)?