Remotamente Trigger WSUS Downloaded update Instalação

8

Isso tem me incomodado por um tempo. Nós temos nossos servidores configurados para baixar apenas as atualizações do Windows para prepará-los para serem instalados durante uma das nossas atualizações mensais bimensais. Eu olhei alto e baixo para uma maneira de acionar a instalação remotamente nos servidores durante este tempo para que eu não precise fazer o login em uma centena de servidores ou mais e clique no balão "Instalar Atualizações Agora".

Alguém sabe de uma maneira de acionar remotamente as instalações de atualização?

    
por Zypher 04.01.2010 / 22:49

4 respostas

7

Eu finalmente percebi isso. Há uma API de atualização do Windows (mal) documentada que você pode usar para acionar esses tipos de coisas. Eu usei uma forma modificada do script encontrado aqui que é aproximadamente como perto da documentação como você pode obter.

Eu o modifiquei como abaixo, removendo as partes de download - porque eu controlo o download com o GPO e o WSUS, bem como com todos os prompts. Então eu inseri algum código para reiniciar a caixa, se necessário, pelas atualizações.

Set updateSession = CreateObject("Microsoft.Update.Session")
Set updateSearcher = updateSession.CreateupdateSearcher()
WScript.Echo "Searching for updates..." & vbCRLF

Set searchResult = updateSearcher.Search("IsInstalled=0 and Type='Software'")


WScript.Echo "List of applicable items on the machine:"

For I = 0 To searchResult.Updates.Count-1
    Set update = searchResult.Updates.Item(I)
    WScript.Echo I + 1 & "> " & update.Title
Next

If searchResult.Updates.Count = 0 Then
    WScript.Echo "There are no applicable updates."
    WScript.Quit
End If


Set updatesToInstall = CreateObject("Microsoft.Update.UpdateColl")

WScript.Echo  vbCRLF & _
"Creating collection of downloaded updates to install:" 

For I = 0 To searchResult.Updates.Count-1
    set update = searchResult.Updates.Item(I)
    If update.IsDownloaded = true Then
       WScript.Echo I + 1 & "> adding:  " & update.Title 
       updatesToInstall.Add(update) 
    End If
Next

'WScript.Echo  vbCRLF & "Would you like to install updates now? (Y/N)"
'strInput = WScript.StdIn.Readline
'WScript.Echo 

'If (strInput = "N" or strInput = "n") Then 
'   WScript.Quit
'ElseIf (strInput = "Y" or strInput = "y") Then
    WScript.Echo "Installing updates..."
    Set installer = updateSession.CreateUpdateInstaller()
    installer.Updates = updatesToInstall
    Set installationResult = installer.Install()

    'Output results of install
    WScript.Echo "Installation Result: " & _
    installationResult.ResultCode 
    If (installationResult.RebootRequired = True) Then
        Set RebootShell = WScript.CreateObject("Wscript.Shell")
        RebootShell.Run "shutdown.exe -r -t 0"
    End If

    WScript.Echo "Reboot Required: " & _ 
    installationResult.RebootRequired & vbCRLF 
    WScript.Echo "Listing of updates installed " & _
     "and individual installation results:" 

    For I = 0 to updatesToInstall.Count - 1
        WScript.Echo I + 1 & "> " & _
        updatesToInstall.Item(i).Title & _
        ": " & installationResult.GetUpdateResult(i).ResultCode         
    Next
'End If

O próximo passo foi colá-lo junto com o psExec - que não gosta de rodar o VBScripts remotamente. Eu reuni o seguinte arquivo em lote para copiar o script localmente para o servidor e, em seguida, iniciei a instalação com o psExec sendo executado como um usuário do sistema:

for /f %%i in (%1) do copy installUpdates.vbs \%%i\c$
psexec @%1 -s cscript C:\installUpdates.vbs

Tudo o que você precisa neste momento é passar o script em lote de um arquivo de texto com os nomes dos seus computadores - um por linha, e você está pronto para ir. Não é mais necessário fazer login em todos os servidores para iniciar instalações de atualização do Windows!

A única questão que é um pouco irritante é que esta é uma execução muito séria, então se você tiver muitas atualizações, pode demorar um pouco. Não consegui encontrar uma boa maneira de contornar isso, além de dividir sua lista de máquinas e executar várias cópias do arquivo em lote. Não é o fim do mundo.

Um pouco de atualização. Eu descobri que existem algumas instalações que você precisa estar logado interativamente com as permissões adequadas para instalar. Basicamente, se o WSUS diz que não conseguiu instalar você tem que entrar na caixa. Embora este seja um bom passo de ter que entrar em cada caixa.

    
por 05.01.2010 / 18:55
3

Use um GPO para configurá-los para todas as instalações automaticamente em um período de tempo que esteja na sua janela e, em seguida, apenas não aprove quaisquer atualizações até algumas horas antes de suas janelas bimensais serem exibidas?

Você ainda pode aprová-los para suas máquinas de bancada de teste ver se eles vão fazer o mundo implodir, isso garante que todos sejam baixados antes da janela e aprová-los para todos os servidores antes de você sair do escritório para o dia durante a sua janela de atualização (eu suponho que é em alguma hora íngreme da manhã que você não quer ser para cima), todos devem ser feitos no momento em que você vem no dia seguinte.

    
por 04.01.2010 / 23:05
0

Se você deseja executar de forma não sequencial, apenas adicione -d à linha de comando PSEXEC. Em seguida, executará o installupdates.vbs de forma não interativa.

    
por 26.04.2010 / 10:44
0

Há também o WuInstall . A versão gratuita não parece melhor do que o script da API do WUA que você montou, mas a versão pro tem a opção de aceitar automaticamente o eula, o que eu imagino ser o que faz com que a maioria das atualizações interativas seja necessária.

    
por 26.04.2010 / 12:32