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
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:
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.
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
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:
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
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).