Estou tentando usar o System Center Configuration Manager 2012 para atualizar um programa existente instalado na maioria dos nossos computadores. O programa usa um instalador InstallShield. Somos novos no SCCM aqui, e este programa existe desde muito antes de termos o SCCM disponível.
A nova versão do programa e o instalador não têm nada embutido que eu possa encontrar para detectar ou remover versões antigas. Se você apenas executar o novo instalador sem remover a versão antiga do programa, as coisas parecem boas por um tempo, mas eventualmente você começa a encontrar coisas que não estão certas. O fornecedor recomenda remover manualmente a versão antiga antes de instalar a nova.
Já posso usar o SCCM para implantar a nova versão em uma estação de trabalho limpa. No entanto, neste momento não consigo remover com êxito a versão antiga.
Depois de fazer muita pesquisa, cheguei ao ponto em que gravei um arquivo de resposta para o InstallShield. Usei um arquivo MSI fictício para criar um modelo de instalação para o programa antigo. Em seguida, editei as propriedades de detecção no SCCM para localizar com precisão o programa antigo. Alterei o programa de instalação para um comando fictício que apenas sai e procurei o comando de desinstalação do programa no registro do Windows.
Neste ponto, se eu criar uma implantação de desinstalação do SCCM para este aplicativo fictício, ele detectará corretamente se o programa está instalado ou não. O Centro de Software em minhas estações de trabalho mostrará se está instalado ou não, e a porcentagem de conclusão mostrada no SCCM é precisa. Também posso fazer com que o desinstalador execute scripts arbitrários, desde que todo o script caiba no Uninstall program:
campo da guia Programas do tipo de implantação do SCCM para esse aplicativo. Eu só tenho que colocar o comando com algo como cmd /d /c"command goes here"
.
Se eu editar o comando de desinstalação para o programa não precisar de aspas e colocá-lo dentro dessa sintaxe de comando, posso ver pelo Process Explorer que o desinstalador inicia, mas está oculto em uma área de trabalho privada para a conta do sistema local, onde será espere pela entrada que nunca vem. Parece que preciso informar sobre o arquivo de resposta para concluir a instalação. No entanto, isso apresenta dois problemas.
O primeiro problema é que, se não usar a cmd /d /c"..."
sintaxe, não consigo ver se o programa de desinstalação é iniciado, mas se eu usar a sintaxe, não posso incluir o arquivo de resposta, porque ele deve ser colocado entre aspas. Não há como escapar das aspas no programa de desinstalação: campo que preciso usar.
Mesmo se eu contornar esse problema, agora preciso saber como enviar o arquivo de resposta para sistemas individuais. Pelo que vi, não posso usar um compartilhamento de rede para isso, porque o desinstalador será executado como uma conta do sistema local que não terá permissões para nenhum recurso de rede. Se eu pudesse enviar arquivos aleatórios para os computadores, também poderia enviar um script de desinstalação mais complicado... mas isso também deixaria artefatos que ainda preciso de uma maneira de remover.
Já gastei muito tempo com isso e pareço estar batendo em uma parede de tijolos. InstallShield e SCCM são amplamente usados. Certamente não é tão difícil? o que estou perdendo?
Padronizei os arquivos em lote para hospedar os comandos para executar a (des)instalação. Portanto, o campo "Instalar programa" indica
Install-Application.bat
. Isso me permite testar o processo de (des)instalação totalmente separado do SCCM simplesmente executando o arquivo em lote. Então, quando estiver funcionando, posso usar o SCCM para executar esse arquivo em lote com a confiança de que ele será executado da mesma maneira que já testei (supondo que você testou no mesmo contexto que o SCCM usa). Os arquivos em lote são distribuídos junto com os outros arquivos que compõem o conteúdo desse aplicativo.O SCCM cuida da distribuição de conteúdo (incluindo cache e limpeza) para você. Faz um bom trabalho nisso. Acho que você pode estar perdendo o conceito de conteúdo e distribuição para aplicativos SCCM. O SCCM cuidará da distribuição do conteúdo de qualquer pasta UNC que você colocar no campo "Localização do conteúdo" para todos os clientes que precisarem. Descobri que isso funciona de maneira confiável e automática. Minhas pastas de conteúdo geralmente incluem arquivos em lote, instaladores, scripts powershell, arquivos XML, arquivos .msp e quaisquer outras armadilhas de um processo de instalação autônoma.
É tão difícil. Ou pelo menos muitas vezes é. Pode valer a pena afirmar que o SCCM não ajuda na instalação e desinstalação de software. O SCCM realmente lida apenas com a distribuição de software (e faz um bom trabalho nisso). O SCCM depende inteiramente de instaladores e desinstaladores pré-criados para executar essas tarefas. O SCCM não pode ajudá-lo se você ainda não tiver um (des)instalador que funcione da maneira que você deseja. A dor geralmente resulta (para cerca de 60% dos instaladores que vejo) de alguma combinação do seguinte:
Alguns desses problemas podem ser superados pelo App-V (mas isso não ajudará você a desinstalar seu aplicativo nativo existente). Pelo que posso dizer, no entanto, existem alguns aplicativos cuja instalação e desinstalação simplesmente não podem ser automatizadas de maneira confiável.
São situações difíceis. Alguns aplicativos installsheild são muito mal construídos e serão executados apenas no contexto do usuário, mas se um usuário não for um administrador local, o processo nunca funcionará. Você pode tentar reclamar com os fornecedores de novos aplicativos.
Para aplicativos existentes, você pode testar seus scripts de desinstalação da mesma forma que o Configuration Manager os executa. Obtenha psexec em um computador em um prompt de comando administrativo e digite
c:\temp\psexec.exe -s -i cmd
. O-s
é para sistema,-i
é para Interativo ecmd
é o processo a ser iniciado no contexto do sistema. Na nova janela System cmd, digite os comandos que você está tentando executar e veja se eles realmente funcionam. Se eles não funcionarem, você não poderá usar o CM para executar esses comandos (pelo menos não no contexto do sistema).