Apesar do serviço WSUS ser relativamente simples e da Microsoft permitir a criação de regras de aprovação, ainda se exige uma atenção rotineira de reprovar itens, sincronização e limpar o servidor. O que além de desperdiçar tempo e abre à possibilidade de erros. Para evitar esses dois problemas pesquisei uma forma de automatizar tudo o que eu precisava, porém só achei soluções pagas e resolvi então criar meu próprio Script.

Executando manualmente (e compreendendo o que será feito)

No servidor WSUS instalado e configurado (softwares, linguagem, tipo de atualizações):

  • Configure a sincronização manual;
  • Retire qualquer regra de auto aprovação de atualizações;
  • Configure para só fazer download de atualizações aprovadas,;
  • Execute no Powershell (como administrador) o comando Get-WsusUpdate, analise toda a lista de atualização e separe as que não interessam, verifique o que elas tem em comum (por exemplo tipos de processadores que eu não tenho nenhum equipamento com essas caraterísticas). No meu caso, ao final concluí que as seguintes atualizações com a seguinte descrição nunca me interessavam:
    • ARM64
    • Itanium
    • 32 bits
    • x86
    • LanguageFeatureOnDemand
    • farm do Microsoft

Com isso, repita o comando Get-WsusUpdate, filtrando apenas as palavras da minha lista e automaticamente removendo todos os resultados do WSUS.

Como próximo passo, liste os updates restantes que ainda não foram aprovados e aprove para todos os computadores.

Agora, execute o assistente de limpeza do WSUS, a fim de evitar consumo desnecessário do disco.

Por fim, execute a sincronização dos updates aprovados.

Automatizando, com um script Powershell

No servidor:

  • Crie uma tarefa agendada no Windows para executar (altere as partes em cinza conforme sua realidade):
    • Nome WSUS;
    • Executar com o administrador local do servidor, com alto privilégio e podendo ser executada com o usuário logado ou não;
    • Configura com execução diária, às 23:00;
    • Executar o comando C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe e argumento C:\Scripts\WSUS.ps1
  • Crie o arquivo C:\Scripts\WSUS.ps1 com o seguinte conteúdo:
#Definir aqui HÁ QUANTOS dias a atualização precisa ter para ser usada em produção (ex: para pelo menos 14 dias, definir $maturidade = 14)
$maturidade = 14
#————————————————————————————————————–
#TOMAR AS AÇÕES BASEADAS NA ULTIMA SINCRONIZAÇÃO (BAIXAR ATUALIZACOES DO WSUS (FAÇO POR FIM POIS NAO SEI QUANTO TEMPO IRA DEMORAR, NA PROXIMA EXECUÇÃO DO SCRIPT QUE SERÃO APROVADAS E/OU RECUSADAS)

#REMOVER PACOTES QUE NAO INTERESSERAM
Get-WsusUpdate | Where {$_.update.title -like “itanium” -or $_.update.title -like “ARM64” -or $_.update.title -like “32 Bits” -or $_.update.title -like “x86” -or $_.update.title -like “LanguageFeatureOnDemand” -or $_.update.title -like “farm do Microsoft”} | Deny-WsusUpdate
Start-Sleep -s 5

#RETIRAR DA LISTA TOTAL AS ATUALIZACÕES “VENCIDAS”
Get-WsusUpdate | Where-Object { $_.Update.GetRelatedUpdates(([Microsoft.UpdateServices.Administration.UpdateRelationship]::UpdatesThatSupersedeThisUpdate)).Count -gt 0 } | Deny-WsusUpdate
Get-WSUSUpdate -Classification All -Approval any | Where-Object { $_.Update.IsSuperseded -eq $True} | Deny-WsusUpdate
Start-Sleep -s 5

#DEFININDO A DATA DE APROVACAO DE UPDATE
$data = (Get-Date).adddays(-$maturidade)

#ACEITANDO A EULA DOS PACOTES QUE EXIGEM E QUE ESTAO DENTRO DO PERIODO APROVADO
Get-WsusUpdate -Classification All -Approval Unapproved | Where-Object { ($_.Update.CreationDate -lt $data) -and ($_.update.isdeclined -ne $true) -and ($_.update.RequiresLicenseAgreementAcceptance -eq $true) } | ForEach { $_.update.AcceptLicenseAgreement() }

#APROVANDO O QUE HÁ DE NOVO DENTRO DO PERIODO APROVADO
Get-WsusUpdate -Classification All -Approval Unapproved | Where-Object { $_.Update.CreationDate -lt $data } | Approve-WsusUpdate -Action Install -TargetGroupName “All Computers”
Start-Sleep -s 5
#————————————————————————————————————–
#CONEXAO COM O SERVIDOR WSUS
[reflection.assembly]::LoadWithPartialName(“Microsoft.UpdateServices.Administration”) | Out-Null
$wsus = [Microsoft.UpdateServices.Administration.AdminProxy]::GetUpdateServer($env:computername, $False,8530);
Start-Sleep -s 5
#————————————————————————————————————–
#LIMPEZA DO WSUS (LIBERAR DISCO)
$cleanupScope = new-object Microsoft.UpdateServices.Administration.CleanupScope;
$cleanupScope.DeclineSupersededUpdates = $true
$cleanupScope.DeclineExpiredUpdates = $true
$cleanupScope.CleanupObsoleteUpdates = $true
$cleanupScope.CompressUpdates = $true
$cleanupScope.CleanupObsoleteComputers = $true
$cleanupScope.CleanupUnneededContentFiles = $true
$cleanupManager = $wsus.GetCleanupManager();
$cleanupManager.PerformCleanup($cleanupScope);
Invoke-WsusServerCleanup -CleanupObsoleteComputers -CleanupObsoleteUpdates
#————————————————————————————————————–
#BAIXAR ATUALIZACOES DO WSUS (FAÇO POR FIM POIS NAO SEI QUANTO TEMPO IRA DEMORAR, NA PROXIMA EXECUÇÃO DO SCRIPT QUE SERÃO APROVADAS E/OU RECUSADAS)
$wsus.GetSubscription().StartSynchronization();

Deixando a sincronização por conta da tarefa agendada, basta verificar na console do WSUS o status da última sincronização, estando tudo sincronizado significa que todos as demais etapas também estão corretas.

Fontes/Referências

https://docs.microsoft.com/en-us/powershell/module/updateservices/get-wsusupdate?view=windowsserver2019-ps
https://hochwald.net/powershell-accept-license-agreements-for-wsus-updates/
https://mcpmag.com/articles/2017/08/10/automate-wsus-using-the-powershell-updateservices.aspx
https://www.vanstechelman.eu/content/how-to-run-the-wsus-server-cleanup-wizard-from-command-line

Mais Informações

Esperamos ter ajudado da melhor forma possível e estaremos sempre a disposição para mais informações.

Entre em contato conosco pelo e-mail equipe@nvlan.com.br.

NVLAN - Consultoria