
Estou tentando automatizar todo o processo de atualização na biblioteca onde trabalho. Eu escrevi um script simples que me permite atualizar todos os nossos pacotes de software usando Chocolatey e realizar atualizações do Windows usando o módulo PSWindowsUpdate. No entanto, estou encontrando algumas dificuldades quando se trata de ocultar atualizações do Windows usando PSWindowsUpdate. Parece bastante simples, de acordo com os vários artigos/documentações on-line que li, mas por algum motivo não está funcionando para mim. Eu mencionei especificamenteesta pergunta do Stackoverflowe tentei aplicar a resposta aceita como minha solução, mas sem problemas. A resposta aqui também não atinge exatamente o que estou tentando realizar. Deixe-me fornecer algumas informações básicas primeiro:
FUNDO
Tenho 5 sistemas Windows 10 Pro e 11 sistemas Windows 7 Pro. Todos são de 64 bits. Todos os sistemas Windows 7 foram atualizados anteriormente para WMF 5.1. Estou usando o Remote Desktop Enterprise Edition para executar scripts em vários computadores simultaneamente para me ajudar a agilizar o processo de atualização.
O QUE TENTEI
Passei bastante tempo tentando resolver meu próprio problema por meio de várias pesquisas no Google e tentativa e erro com meu script PS. Quando executo o script em minhas máquinas remotas, tudo funciona e é atualizado perfeitamente. O problema, como já mencionei, é que nem sempre ele esconde as atualizações do Windows que eu especifiquei (já que provavelmente estou bagunçando em algum lugar haha). Aqui está meu roteiro:
#This script will update all chocolatey packages and will also download install any new Windows Updates
#Begin ExecutionPolicy Set
Echo "Setting Execution Policy Settings"
Set-ExecutionPolicy -Scope LocalMachine -ExecutionPolicy RemoteSigned -Force -Confirm:$false
Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy Bypass -Force -Confirm:$false
Echo "Initializing Unattended Update Automation Powershell Script"
#Begin Chocolatey Update
Echo "Updating Chocolatey Packages"
#Remove Java and reinstall 64-bit only
cuninst jre8 -y
cinst jre8 -PackageParameters "/exclude:32" -y
#Queries Chocolatey.org database for updates to locally installed packages and updates them if necessary
cup all -y --ignore-checksums
#Begin Windows Update
Echo "Enabling Windows Update Services"
Get-Service bits, wuauserv | Set-Service -StartupType manual
Echo "Copying Module PSWindowsUpdate to PowerShell Modules Folder"
#Grabs copy of PSWindowsUpdate Module and copies it to remote machine
Copy-Item -Path \\DIROFFICE\WindowsUpdate\PSWindowsUpdate -Destination C:\Windows\System32\WindowsPowerShell\v1.0\Modules -recurse -force
Echo "Importing Powershell Module PSWindowsUpdate"
Import-Module -Name PSWindowsUpdate -force
refreshenv
Echo "Enabling updates for additional Microsoft components and software"
Add-WUServiceManager -ServiceID 7971f918-a847-4430-9279-4a52d1efe18d -Confirm:$false
Echo "Querying Microsoft Update Server for Windows Updates"
Get-WUList -MicrosoftUpdate
Echo "Hiding Unnecessary Updates"
Hide-WUUpdate -Title "Update for Microsoft OneDrive" -HideStatus:$true -Confirm:$false
Echo "Downloading and Installing Windows Updates"
Get-WUInstall -MicrosoftUpdate -acceptall
Echo "Stopping Windows Update Services"
Get-Service bits,wuauserv | Stop-Service
Echo "Setting CurrentUser Execution Policy Back to RemoteSigned"
Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy RemoteSigned -Force -Confirm:$false
O PROBLEMA/PERGUNTA
O que quero realizar é ocultar certas atualizações com base em determinadas palavras-chave que aparecem no título da atualização. Por exemplo, temos o Microsoft 2016 instalado em todos os nossos computadores, mas quero poder ocultar todas as atualizações do Outlook, OneDrive, Visio e Skype em máquinas W10 e W7, e também o Microsoft Security Essentials em máquinas W7. Existe uma maneira eficaz de usar o módulo PSWindowsUpdate para ocultar atualizações que contenham determinadas palavras?
NOTAS ADICIONAIS
A pequena linha de código listada em meu script na seção de ocultação de atualizações existe simplesmente para fins de teste. Inicialmente tentei ocultar as atualizações usando o título completo da atualização. Por exemplo, houve inúmeras atualizações para o Outlook 2016 em que o título era “Atualização de segurança para Microsoft Outlook 2016” ou simplesmente “Atualização para Microsoft Outlook 2016”. Eu tentei usar Hide-WUUpdate -Title "Update for Microsoft Outlook" -HideStatus:$true -Confirm:$false
também Hide-WUUpdate -Title "Security update for Microsoft Outlook" -HideStatus:$true -Confirm:$false
. Isso parece não funcionar, pois quando vi minhas atualizações instaladas, mostrou que 4 ou 5 atualizações para o Microsoft Outlook foram instaladas.
Também tentei usar o curinga (*), mas acho que não entendi completamente como funciona. Eu tentei algumas coisas como Hide-WUUpdate -Title "Update for Microsoft Outlook*" -HideStatus:$true -Confirm:$false
e Hide-WUUpdate -Title "Outlook*" -HideStatus:$true -Confirm:$false
. Eu até tentei um curinga duplo com algo como Hide-WUUpdate -Title "*Microsoft Oulook*" -HideStatus:$true -Confirm:$false
.
Pelo que li no TechNet e no MSDN, o curinga (*) corresponderá aos caracteres que começam na posição especificada. Isso falha se houver espaços incluídos?
Usar o ID do artigo da base de conhecimento não é meu método preferido, pois eu teria que atualizar meu script sempre com os novos IDs da base de conhecimento que preciso ocultar. Eu preferiria a abordagem de palavras-chave, se possível. Tentei usar o método listado na referência Stackoverflow acima apenas para sorrir e rir, mas, em última análise, não é a solução que estou procurando no momento.
Responder1
Hide-WUUpdate
pode não suportar a atualização de vários registros de uma só vez.
Uma abordagem comum para isso no Powershell é restringir seus objetos na frente do pipeline e, em seguida, enviá-los para sua ação no final do pipeline (por exemplo, Get-Process notepad | Stop-Process
). Isto só se aplicará a este cenário se Hide-WUUpdate
aceitar objetos como entrada. Pode não, permitindo apenas o uso com seu -Title
sinalizador, que pode não suportar múltiplas entradas.