Verifique se as atualizações do Windows estão sendo instaladas

2

Eu tenho um script PowerShell usado pelo departamento de suporte de TI para instalar remotamente software em estações de trabalho. O script suporta a instalação de vários produtos (um após o outro) e, portanto, tem o potencial de levar muito tempo para ser executado.

Ontem, um técnico usou o script para instalar remotamente vários produtos de software em uma máquina que havia sido desligada por alguns dias.

Temos um GPO do Windows Update destinado a todas as nossas estações de trabalho. Ele está configurado para instalar atualizações às 21h todas as quartas-feiras. Se uma estação de trabalho perder esta data de instalação agendada, as atualizações serão instaladas 60 minutos após a próxima ligação da máquina.

Enquanto o técnico estava instalando o software na estação de trabalho remota, o reprogramamento do Windows Update entrava em ação. Portanto, sua instalação e as atualizações do Windows agora estavam sendo instaladas ao mesmo tempo. Isso fez com que o produto que ele estava instalando (SQL Server Management Studio) falhasse.

Gostaria de modificar meu script para verificar se as atualizações do Windows estão sendo instaladas no momento. Se sim, avise o técnico e aborte o script. Se não, então pare e desabilite o serviço de atualização do Windows (wuauserv), isso evitará a possibilidade de chutar enquanto o script estiver em uso, então inicie e reative o serviço quando o script chegar ao fim.

Não consigo encontrar uma maneira robusta de verificar se as atualizações do Windows estão sendo instaladas no momento.

Qualquer sugestão será bem vinda; Fico feliz em usar um objeto, ferramenta de linha de comando, WMI, ler o registro, etc ...

ATUALIZAÇÃO 1. 06/04/13: O que eu esperava era uma forma de consultar o status do serviço Windows Update. Se as atualizações estiverem sendo instaladas no momento, minha preferência seria respeitar o fato de que as atualizações estão sendo instaladas e aconselhar o técnico a voltar mais tarde. No momento, estou realizando alguns testes para determinar o efeito da interrupção do serviço wuauserv nos seguintes cenários:

  1. Pare o serviço antes que as atualizações sejam instaladas.
  2. Pare o serviço enquanto as atualizações estão sendo instaladas.

UPDATE 2. 06/04/13: Eu tinha uma VM do Windows 7 que não tinha sido ligada por alguns dias e, portanto, consegui imitar a situação que o técnico enfrentou no outro dia. Consegui usar instantâneos a meu favor para realizar uma série de testes diferentes.

Devo salientar que modifiquei o GPO responsável pelas configurações do Windows Update, reduzindo o tempo de reprogramação de 60 minutos para 10 minutos após a ativação de uma estação de trabalho (para facilitar um pouco o teste).

TESTE 1) Interrompeu o serviço wuauserv antes que as atualizações fossem instaladas.

As atualizações deviam ser instaladas às 12:40.

Eu paro o wuauserv remotamente usando o powershell. Eu estava seguindo o WindowsUpdate.log e o seguinte apareceu:

2013-04-06      12:36:00:287     984    e68     Service *********
2013-04-06      12:36:00:287     984    e68     Service **  END  **  Service: Service exit [Exit code = 0x240001]
2013-04-06      12:36:00:287     984    e68     Service *************

Eu esperei até 12h40 para o caso de o serviço ser capaz de se reiniciar novamente com alguma mágica. Isso não aconteceu.

Eu iniciei o serviço e o seguinte foi gravado no WindowsUpdate.log, confirmando que o serviço foi iniciado novamente.

2013-04-06    12:42:07:571     984    e70    Misc    ===========  Logging initialized (build: 7.6.7600.256, tz: +0100)  ===========
2013-04-06    12:42:07:571     984    e70    Misc      = Process: C:\Windows\system32\svchost.exe
2013-04-06    12:42:07:571     984    e70    Misc      = Module: c:\windows\system32\wuaueng.dll
2013-04-06    12:42:07:571     984    e70    Service    *************
2013-04-06    12:42:07:571     984    e70    Service    ** START **  Service: Service startup
2013-04-06    12:42:07:571     984    e70    Service    *********

O log também confirmou que o reagendamento de 10 minutos se aplicou novamente:

Success    Content Install    Installation Ready: The following updates are downloaded and ready for installation. This computer is currently scheduled to install these updates on 06 April 2013 at 12:52

TEST 2) Interrompido o serviço wuauserv durante a instalação da atualização

Esta é uma extração do WindowsUpdate.log pouco antes de eu parar o serviço:

2013-04-06      13:25:00:372    1004    4dc     DnldMgr Preparing update for install, updateId = {F13298D7-7EC1-4D33-9A57-A367F54BA4DA}.106.
2013-04-06      13:25:00:372    3472    790     Handler :::::::::::::
2013-04-06      13:25:00:372    3472    790     Handler :: START ::  Handler: CBS Install
2013-04-06      13:25:00:372    3472    790     Handler :::::::::
2013-04-06      13:25:00:372    3472    790     Handler Starting install of CBS update F13298D7-7EC1-4D33-9A57-A367F54BA4DA
2013-04-06      13:25:00:419    3472    790     Handler CBS package identity: Package_for_KB2698365~31bf3856ad364e35~amd64~~6.1.1.2
2013-04-06      13:25:00:434    3472    790     Handler Installing self-contained with source=C:\Windows\SoftwareDistribution\Downloadfff2597df465a2957121c20dbd4bcec\windows6.1-kb2698365-x64.cab, workingdir=C:\Windows\SoftwareDistribution\Downloadfff2597df465a2957121c20dbd4bcec\inst

Isto é o que foi gravado quando parei o serviço:

2013-04-06      13:25:19:957    3472    3e4     Handler CUHCbsHandler::Cancel called with fReleaseThreadNow=0
2013-04-06      13:25:19:957    1004    ed0     AU      ###########  AU: Uninitializing Automatic Updates  ###########
2013-04-06      13:25:19:973    3472    3e4     Handler CUHCbsHandler::Cancel called with fReleaseThreadNow=1
2013-04-06      13:25:19:973    3472    790     Handler WARNING: CBS handler has been told to exit immediately.
2013-04-06      13:25:19:973    3472    790     Handler FATAL: Completed install of CBS update with type=2, requiresReboot=0, installerError=0, hr=0x80242008
2013-04-06      13:25:19:973    3472    790     Handler :::::::::
2013-04-06      13:25:19:973    3472    790     Handler ::  END  ::  Handler: CBS Install
2013-04-06      13:25:19:973    3472    790     Handler :::::::::::::
2013-04-06      13:25:19:988    1004    4dc     Agent     * WARNING: Exit code = 0x8024000B
2013-04-06      13:25:19:988    1004    4dc     Agent   *********
2013-04-06      13:25:19:988    1004    4dc     Agent   **  END  **  Agent: Installing updates [CallerId = AutomaticUpdates]
2013-04-06      13:25:19:988    1004    4dc     Agent   *************
2013-04-06      13:25:19:988    1004    4dc     Agent   WARNING: WU client failed installing updates with error 0x8024000b
2013-04-06      13:25:20:004    1004    ed0     Report  REPORT EVENT: {72199C19-359E-4D78-A075-4EAA44C368D9}    2013-04-06 13:25:19:973+0100  1186     101     {D5FD720E-0F2C-4363-AA87-6AD4A6D11B0E}  106     8024000b        AutomaticUpdates        Success Content Install User cancelled the installation.
2013-04-06      13:25:20:035    1004    ed0     Report  CWERReporter::HandleEvents - WER report upload completed with status 0x8
2013-04-06      13:25:20:035    1004    ed0     Report  WER Report sent: 7.6.7600.256 0x8024000b D5FD720E-0F2C-4363-AA87-6AD4A6D11B0E Install 101 Managed
2013-04-06      13:25:20:035    1004    ed0     Report  CWERReporter finishing event handling. (00000000)
2013-04-06      13:25:20:160    1004    ed0     Service *********
2013-04-06      13:25:20:160    1004    ed0     Service **  END  **  Service: Service exit [Exit code = 0x240001]
2013-04-06      13:25:20:160    1004    ed0     Service *************

Como você pode ver, ele documenta o fato de que a atualização que estava sendo instalada foi cancelada.

Eu só espero que a instalação que estava ocorrendo tenha sido cancelada de uma forma graciosa? Mas eu não sei realmente saber a resposta para isso ... Como a maioria das atualizações da Windiws usa MSIs, eu espero que eles usem sua capacidade de reverter as alterações de arquivo e registro e, assim, deixar a estação de trabalho em um estado estável.

    
por Fitzroy 06.04.2013 / 02:49

3 respostas

1

net stop wuauserv

não importa se está sendo executado, não será depois que este comando for concluído.

Quando seu script é concluído

net start wuauserv

    
por 06.04.2013 / 07:38
1

Eu não estou em uma máquina de domínio agora para verificar os nomes, mas a maneira como lidamos com isso é:

Procure por processos em execução:

  1. msiexec.exe
  2. Setup.exe
  3. Processo SCCM - esqueci o nome exato, mato-o.
  4. Processo do SMS - Nome esquecido também, mate-o

Eu verifico as duas primeiras execuções (e mais uma que é CompanyNameSetup.exe) para ver se há instalações atuais. Caso contrário, mate os processos do SCCM e do SMS para que não seja possível instalar novas instalações.

Faça suas instalações e reinicialize ou reinicie os processos / serviços do SCCM e do SMS.

Após os comentários abaixo: Eu acho que este seria o caminho no psuedo:

while (msiexec.exe isRunning OR Setup.EXE isRunning)
{wait for completion}
net stop wuauserv  #Prevent installs
taskkill /im Wuauclt.exe /f  #Kill an empty Wuauclt.exe

Então você pode chamar seus scripts, depois que suas instalações terminarem, tudo que você precisa fazer é chamar

net start wuauserv  #Start WSUS service
    
por 06.04.2013 / 03:52
1

Eu não recomendaria matar esses processos no meio da instalação, como você e o AthomSfere discutiram. No entanto, vendo como os dois principais nomes de instalação no Windows a procurar são msiexec.exe e setup.exe , você pode procurar por aqueles em seu script powershell e, se esses processos estiverem em execução, crie um loop em que o script seja suspenso até aqueles estão fechados. Algo como (pseudocódigo):

while($(get-process -like msiexec.exe).count -gt 1 -or $(get-process -like setup.exe).count -gt 1){
    sleep 300
}

Eu só recomendo parcialmente essa solução porque há a possibilidade de que as atualizações que foram instaladas possam exigir uma reinicialização, e se o fizerem, e o software instalado do script não será instalado se houver uma reinicialização pendente, essa é a tempestade perfeita para isso falhar de qualquer maneira.

Idealmente, se você tivesse uma infraestrutura grande o suficiente para alavancar algo como o sccm para a implantação de software e atualizações do Windows, isso seria o que você desejaria, e isso evitaria esses conflitos (pelo menos do meu software) e as atualizações instaladas do sccm não estão em conflito, elas são instaladas consecutivamente em vez de simultaneamente).

    
por 08.04.2013 / 15:25