Olá pessoal,
Quando preciso aplicar updates em algum servidor, prefiro fazer de maneira remota para utilizar o minimo possível de recursos. Para isso temos 3 passos basicos para poder atualizar o servidor, Enumerar os updates, Baixar os pacotes e instalá-los. Para isso podemos utilizar diversas ferramentas graficas, porém via linha de comando podemos aproveitar o processo para orquestrar a instalação de algum patch em especifico, reportar para uma ferramenta de monitoria quais os updates pendentes e gerar alertas para eles, e assim por diante. Caso não queira utilizar dessa maneira, na Galeria Powershell há o módulo PSWindowsUpdate, mas acaba gerando a dependencia do módulo.
Para começar vamos instanciar uma nova sessão e criar o Update Searcher:
$Session = New-Object -ComObject Microsoft.Update.Session
$Searcher = $Session.CreateUpdateSearcher()
Em seguida vamos definir algumas propriedes como o ServiceID, o escopo da busca para a maquina e em ServerSelection permitir atualizações de terceiros:
$Searcher.ServiceID = '7971f918-a847-4430-9279-4a52d1efe18d'
$Searcher.SearchScope = 1 # MachineOnly
$Searcher.ServerSelection = 3 # Third Party
Nossa busca, nesse exemplo, terá o critério de updates não instalados e Ocultos:
$Criteria = "IsInstalled=0 and ISHidden=0"
$SearchResult = $Searcher.Search($Criteria)
$Updates = $SearchResult.Updates
Podemos retornar a lista de updates pendentes então dessa maneira:
$Updates | Select-Object -Property Title, DriverModel, DriverVerDate, Driverclass, DriverManufacturer
Em seguida vamos criar uma lista com os updates que irão ser baixados, podendo aplicar ou não algum critério de filtro nesses pacotes:
$UpdatesToDownload = New-Object -ComObject Microsoft.Update.UpdateColl
$Updates | Foreach-Object -Process {
[void]$UpdatesToDownload.Add($_)
}
Vamos agora baixar os pacotes:
$UpdateSession = New-Object -ComObject Microsoft.Update.Session
$Downloader = $UpdateSession.CreateUpdateDownloader()
$Downloader.Updates = $UpdatesToDownload
$Downloader.Download()
Feito isso iremos checar se todos os pacotes foram baixados com sucesso:
$UpdatesToInstall = New-Object -Com Microsoft.Update.UpdateColl
$updates | Foreach-Object -Process {
if($_.IsDownloaded){
[void]$UpdatesToInstall.Add($_)
}
}
Agora podemos finalmente instalar os updates:
$Installer = $UpdateSession.CreateUpdateInstaller()
$Installer.Updates = $UpdatesToInstall
$InstallationResult = $Installer.Install()
Caso o valor de $InstallationResult.RebootRequired seja True, o servidor deverá ser reiniciado.
Aqui temos o script completo para realizar o processo todo:
#search and list all missing Drivers
$Session = New-Object -ComObject Microsoft.Update.Session
$Searcher = $Session.CreateUpdateSearcher()
$Searcher.ServiceID = '7971f918-a847-4430-9279-4a52d1efe18d'
$Searcher.SearchScope = 1 # MachineOnly
$Searcher.ServerSelection = 3 # Third Party
Write-Host -Object 'Searching Driver-Updates...' -ForegroundColor Green
$Criteria = "IsInstalled=0 and ISHidden=0"
$SearchResult = $Searcher.Search($Criteria)
$Updates = $SearchResult.Updates
#Show available Drivers
$Updates | Select-Object -Property Title, DriverModel, DriverVerDate, Driverclass, DriverManufacturer
#Download the Drivers from Microsoft
$UpdatesToDownload = New-Object -Com Microsoft.Update.UpdateColl
$Updates | Foreach-Object -Process {
[void]$UpdatesToDownload.Add($_)
}
Write-Host -Object 'Downloading Drivers...' -ForegroundColor Green
$UpdateSession = New-Object -Com Microsoft.Update.Session
$Downloader = $UpdateSession.CreateUpdateDownloader()
$Downloader.Updates = $UpdatesToDownload
$Downloader.Download()
#Check if the Drivers are all downloaded and trigger the Installation
$UpdatesToInstall = New-Object -Com Microsoft.Update.UpdateColl
$updates | Foreach-Object -Process {
if($_.IsDownloaded){
[void]$UpdatesToInstall.Add($_)
}
}
Write-Host -Object 'Installing Drivers...' -ForegroundColor Green
$Installer = $UpdateSession.CreateUpdateInstaller()
$Installer.Updates = $UpdatesToInstall
$InstallationResult = $Installer.Install()
if($InstallationResult.RebootRequired){
Write-Host -Object 'Reboot required! please reboot now..' -ForegroundColorore Red
}
else {
Write-Host -Object 'Done..' -Fore Green
}
Dúvidas? Sugestões? Comente!
Até a proxima!
8 Comments
Bom dia mestre Guido.
Parabéns pelos excelentes conteúdos.
Nos ajuda muito a otimizar as tarefas no dia-a-dia.
Abs.
André Gomes
Fico feliz que tenha gostado 🙂
Guido, tudo bem? poderia me ajudar , Eu gostaria de saber como eu faria para instalar um conjunto de kb’s em um determinado servidor remotamente via poweshell !
Voce pode baixar manualmente os KBs e fazer um laco foreach para instalar os arquivos msu.
Guido como fazer para pegar atualizações apenas do wsus?
Essa opcao e via GPO, voce basicamente forca o servidor WSUS como unico servidor de update.
up
up