“Tocando” a política do grupo de implantação de software programaticamente ou via script

5

Eu tenho um aplicativo interno que usa o Windows Installer. Cada atualização para este aplicativo é uma "atualização principal" (código de produto diferente, mesmo código de atualização) e chama RemoveExistingProducts. (Na verdade, isso significa que sempre que uma nova compilação é criada, você pode instalá-la apenas clicando no arquivo MSI, pois ela desinstalará a versão antiga e instalará a nova versão.)

Ele está atualmente implantado por meio de uma configuração de máquina na política de grupo. Qualquer GPO vinculado instalará o software na próxima inicialização, e isso funciona muito bem.

Eu também tenho um servidor de integração contínua (TeamCity) que constrói e executa testes para este software cada vez que nós cometemos algo para controlar a origem e "fixá-lo" para implementação. Posso até copiar o arquivo MSI recém-criado para o compartilhamento de rede na preparação para a implantação.

Infelizmente, não vejo uma maneira de realmente dizer ao GPO para reimplantar o arquivo MSI recém-atualizado programaticamente como parte do meu processo de integração.

Se eu apenas substituir o arquivo MSI existente e não tocar no GPO, a alteração não será percebida por máquinas que tenham o MSI antigo instalado e as máquinas mais novas surtam quando não conseguirem encontrar o arquivo MSI com o arquivo MSI. código do produto no script gerado pelo Editor de Gerenciamento de Diretiva de Grupo. Tudo bem, faz sentido.

O mesmo comportamento parece acontecer se eu sobrescrever o arquivo MSI existente e clicar em "Reimplantar aplicativo" no GPME. Novamente, parece que estamos insatisfeitos com a tentativa de reimplantar com um arquivo MSI cujo código de pacote não corresponde ao do script gerado pelo GPME. Tudo bem, faz sentido.

O que funciona é clicar com o botão direito no pacote de instalação no GPME, clicar em "Immediately Remove" e adicionar o pacote de instalação de volta - isso cria um novo script * .aas e o antigo O pacote é removido e o novo pacote é instalado na próxima inicialização. Existe alguma maneira de fazer isso através de um script em lote que eu possa adicionar ao processo de criação do meu servidor de integração?

Obrigado!

Atualização de acompanhamento

Depois de analisar os comentários de Evan, acabei de escrever um pequeno script em lote que é executado na inicialização . Eu também escrevi um pequeno utilitário chamado msicheck que determina se um determinado pacote MSI está ou não instalado. Isso satisfez minhas necessidades bem o suficiente, e é muito melhor do que percorrer as páginas de uma especificação LDAP! =)

    
por Nicholas Piasecki 04.11.2009 / 22:48

1 resposta

5

Eu tive o desejo de fazer algo semelhante e fiz algumas pesquisas sobre o assunto no passado.

Não há nenhuma API exposta que eu possa encontrar para fazer o que o Editor de Diretiva de Grupo está fazendo para criar esses arquivos de script de anúncio de aplicativo (.aas) e os registros correspondentes no AD. A API de diretiva de grupo do PowerShell permite definir configurações baseadas no Registro, mas não configurações para outras extensões de diretiva de grupo.

Existe agora uma referência ao Extensão de protocolo de instalação de software de diretiva de grupo (graças ao acordo antitruste da UE!) e suponho que você poderia tentar e transferir o mecanismo para executar tarefas por conta própria. As transações LDAP necessárias para executar a adição do pacote e o formato dos arquivos .aas estão lá. Parece um pouco assustador (embora divertido) ...

Francamente, sua atenção aos detalhes é: o teste de implantação deve ser elogiado. Eu queria que você estivesse escrevendo softwares que meus clientes usam. O fato de você estar usando o Windows Installer sozinho coloca você à frente do pacote. Que você saiba sobre implantação de software de Diretiva de Grupo e esteja realmente testando isso me deixa tonta! Eu gostaria que alguma fração mensurável de desenvolvedores se importasse tanto quanto é claro que você faz.

    
por 04.11.2009 / 23:52