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.