Como detectar remotamente o Windows concluiu a configuração do patch após a reinicialização


10

Planejamos automatizar a criação de VMs para nossa infraestrutura de construção, para que possamos:

  1. Escale os recursos de construção com base na demanda, por exemplo, adicionando mais agentes de construção quando necessário e removendo-os quando não necessário
  2. Recrie todo ou parte do ambiente de construção se / quando as máquinas morrerem
  3. Duplique o ambiente de construção quando precisarmos de uma configuração de teste

Uma das etapas deste processo é automatizar a criação das imagens base da VM (no nosso caso, usando o Hyper-V). Para isso, temos um script que:

  1. Cria um novo VHDX da ISO com o script Convert-WindowsImage . Atualmente, estamos usando o Windows 2012R2, mas pretendemos começar com 2016 assim que disponível.
  2. Adiciona um script autônomo ao novo VHDX com toda a configuração básica que precisamos
  3. Atualiza o VHDX com os patches mais recentes do Windows usando o script Apply-WindowsUpdate
  4. Cria uma nova VM Hyper-V baseada no VHDX e a inicia
  5. Aguarda a inicialização da VM e aguarda o serviço WinRM estar pronto para aceitar conexões remotas
  6. Aguarda o Windows concluir a configuração inicial e a configuração dos novos patches
  7. Aplica outros patches
  8. Reinicia para concluir a configuração dos patches mais recentes
  9. Aguarda o Windows concluir a configuração dos patches
  10. Envia um script sysprep para a máquina e chama esse script. Isso executa o sysprep e depois desliga a máquina
  11. Exclui a VM, mas mantém o VHDX
  12. Remove sysprep e arquivos autônomos do VHDX e depois compacta o VHDX
  13. Move VHDX para o local do modelo e marca como somente leitura

O problema que estamos enfrentando está nas etapas 6 e 9. Idealmente, esperamos que toda a configuração seja concluída antes de reiniciar / desligar a máquina, mas não parece haver uma maneira de detectar se o Windows terminou o estágio de configuração.

Ao percorrer a interface do usuário, fica muito claro quando uma das etapas é concluída porque a interface do usuário de logon não aparece até que o processo esteja pronto. No entanto, ao usar o WinRM para conectar-se remotamente à máquina, isso fica menos claro porque o WinRM fornece acesso à máquina antes de concluir o trabalho de configuração.

Portanto, a questão é qual é a maneira mais segura de detectar através de uma conexão remota que o Windows concluiu a configuração de atualizações etc. para que possamos reiniciar / desligar a máquina sem causar problemas mais tarde.

------ EDIT -----

No final, estamos usando uma versão modificada da resposta de Katherine, pois nosso script também espera windeploye ngené concluído. Dado que ngennão é concluído até bem após o término da inicialização do sistema operacional, e como um bônus, o VHDX final terá todo o framework .NET ngen-ed, o que significa que não precisamos lidar com isso quando criarmos novos VMs do disco de modelo. Tanto o script que usamos para criar o modelo VHDX quanto os scripts para criar o ambiente de teste local estão no github, caso alguém esteja interessado.

Respostas:


6

Pode parecer uma resposta estranha, mas ...

Há um script do PowerShell para verificar se há atualizações disponíveis para o Nagios . Você provavelmente poderia usar esse script ou uma variante para seus propósitos, sem o Nagios.

Para saber se estão em andamento, verifique se o Wuauclt e o TrustedInstaller estão em execução. Os conselhos da Microsoft sobre atualizações no Server Core podem ajudar aqui :

Dependendo das atualizações instaladas, pode ser necessário reiniciar o computador, embora o sistema não o notifique disso. Para determinar se o processo de instalação foi concluído, use o Gerenciador de Tarefas para verificar se os processos Wuauclt ou Trusted Installer não estão sendo executados ativamente. Você também pode usar os métodos na seção "Visualizando atualizações instaladas" para verificar a lista de atualizações instaladas.

Você provavelmente pode extrair essa informação com algo parecido Get-Process -Computername YourImage TrustedInstaller.exe. Após a conclusão dos processos Wuauclt e TrustedInstaller, deve ser seguro reiniciar.


Esse script resolve o problema de obter atualizações e detectar se é necessária uma reinicialização, que é outro problema que precisamos resolver, mas o script não lida com a espera pela conclusão da reinicialização até o ponto em que a máquina está pronta para o trabalho .
— Petrik 21/01

Você comentou enquanto eu estava editando. Adicionei algumas informações sobre a detecção desse estado no Server Core, que está próximo de fazê-lo remotamente.
— Katherine Villyard

1
Eu estava sendo muito feliz em comentar. Vou dar uma olhada na pesquisa por Wuauclt ou TrustedInstaller.
— Petrik 21/01

Eu estava sendo um pequeno "hit post" feliz comigo mesmo. :)
— Katherine Villyard

1
Essa abordagem quase funcionou para mim, exceto que o TrustedInstaller e o Wuauclt terminam antes que a inicialização seja concluída. Depois de adicionar o windeploy e o ngen, o script espera que a máquina conclua toda a inicialização (provavelmente porque o ngen não será concluído até bem depois que a máquina terminar de inicializar).
— Petrik 06/02

3

Cada patch de atualização do Windows gravará vários eventos no log de eventos da Instalação.

  • Identificação do evento 1 - Iniciando alterações no pacote KB ####
  • Identificação do evento 4 - É necessário reiniciar antes que o pacote KB #### possa ser alterado para o estado instalado
  • Identificação de evento 2 - O pacote KB #### foi alterado com êxito para o estado Instalado

Uma maneira de determinar que todos os patches foram aplicados seria executar uma verificação no ID do Evento 4. Compare a hora desse evento com a hora atual. Se nenhum evento ID 4 tiver sido gravado por 5 ou 10 minutos, todos os pataches provavelmente estão concluídos e prontos para reiniciar.

Não sei se você deseja fazer a primeira reinicialização quando os patches forem concluídos na instalação (evento4) ou a segunda reinicialização após a conclusão da configuração (evento 2). Este código faz o primeiro. Simplesmente altere o filterHashTable para a identificação de evento 2 da outra reinicialização antes da etapa 10.

$target = "bart"
$found = $false
while (-not $found) {
    $lastEvent4 = (get-winevent -comp $target -maxEvents 1 -filterHashTable @{ Logname='Setup'; id = '4';}).timeCreated
    if (((get-date) - $lastEvent4).totalMinutes -gt 10) {
        "do reboot"
        restart-computer -comp -$target
        $found = $true
    } else {
        "wait"
        start-sleep 60
    }
}

Não funcionaria anotar os IDs de KB de todos os pacotes que começam a instalar e assumir a conclusão somente quando não houver mais atualizações em andamento?
— Simon Richter

A lista de patches será alterada a cada mês na terça-feira. Atualizar o processo todos os meses para usar uma nova lista seria um ponto de manutenção contínuo ... Pensei que o que sugeri seria mais simples.
— Clayton

1
Eu quis dizer como uma extensão da sua resposta: quando a atualização começa a instalar (evento 1), ela é adicionada à lista e removida quando é feito o relatório (evento 4). Com alguns ajustes (atualizações com falha, redefinição da lista durante a reinicialização?), Deve ser possível determinar se ainda existe uma instalação em andamento.
— Simon Richter

Portanto, para uma instalação nova, infelizmente não há entradas no log de eventos. Não tentei instalar depois que a máquina foi inicializada, mas presumo que essa abordagem funcione bem nesse caso.
— Petrik 06/02

Instalação nova? Confuso. Você tem um processo de 13 etapas aqui. Você solicitou assistência nas etapas 6 e 9. Sua pergunta era "uma maneira de detectar se o Windows terminou o estágio de configuração" e não uma maneira de iniciar a implantação de patches.
— Clayton

0

Tive sucesso com a seguinte abordagem: Aguarde até que o Windows altere o tipo de inicialização do Serviço Instalador de Módulos do Windows (também conhecido como TrustedInstaller) para Manual (Início da Demanda) - após uma reinicialização. Nesse ponto, as atualizações concluíram a instalação.

Às vezes, o processo do Trusted Installer continua em execução após a instalação dos patches? No entanto, o tipo de inicialização do serviço ainda é redefinido para Manual.

Você pode verificar por si mesmo, se a observação acima é consistente / correta, observando as mensagens anteriores do log de eventos e correlacionando eventos entre os logs do sistema e da instalação.

A alteração de inicialização para o Windows Module Installer é registrada como um evento do sistema 7040 e se correlaciona com o último evento 2 no log da instalação, após uma reinicialização.

Penso que, quando as atualizações são instaladas pela primeira vez, esse serviço é definido como 'Auto Start', caso seja necessário reiniciar. É definido como 'Manual' quando o último patch é instalado (independentemente de uma reinicialização ser necessária).

Em alguns servidores, notei que a inicialização confiável do Instalador é rapidamente alternada de Manual para Automática e vice-versa, e isso pode ocorrer a cada hora. Suspeito que seja algum aplicativo que verifique regularmente se há atualizações. Mas, pela minha experiência, é que geralmente parece seguro supor que, se a inicialização for Manual, não ocorrerá o patch.

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.