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.

Petrik
fonte

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.

Katherine Villyard
fonte
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
    }
}
Clayton
fonte
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.

ydrol
fonte