O truque aqui é não ter o Windows Update fazendo a instalação através do mecanismo de Atualizações Automáticas. Você pode configurá-lo para baixar automaticamente, mas para instalações automáticas, não há como impedir que o timer de reinicialização seja disparado, a menos que haja um usuário conectado ao sistema, como o Sem política de reinício automático com utilizadores registados para instalações de atualizações automáticas agendadas . Como isso é para servidores, vou assumir que esse não é o caso padrão e que ninguém estar logado não significa que os recursos da máquina não sejam necessários no momento.
Configure uma tarefa agendada que acionará a instalação das atualizações e o relatório quando as atualizações forem concluídas ou alguma outra ação, para que você saiba que o computador deve ser reinicializado.
Modifiquei rapidamente o script encontrado aqui para atender às suas necessidades:
# Author: Gregory Strike
# Website: www.GregoryStrike.com
# Date: 02-19-2010
# Information: This script was adapated from the WUA_SearchDownloadInstall.vbs VBScript from Microsoft. It uses the
# Microsoft.Update.Session COM object to query a WSUS server, find applicable updates, and install them.
# < --- SNIP --- >
$UpdateSession = New-Object -Com Microsoft.Update.Session
$UpdateSearcher = $UpdateSession.CreateUpdateSearcher()
$SearchResult = $UpdateSearcher.Search("IsInstalled=0 and Type='Software'")
$UpdatesToInstall = New-Object -Com Microsoft.Update.UpdateColl
For ($X = 0; $X -lt $SearchResult.Updates.Count; $X++){
$Update = $SearchResult.Updates.Item($X)
If ($Update.IsDownloaded) {
$Null = $UpdatesToInstall.Add($Update)
}
}
If ($Install.ToUpper() -eq "Y" -or $Install.ToUpper() -eq "YES"){
Write-Host("")
Write-Host("Installing Updates...") -Fore Green
$Installer = $UpdateSession.CreateUpdateInstaller()
$Installer.Updates = $UpdatesToInstall
$InstallationResult = $Installer.Install()
$ResultsBody = "List of Updates Installed with Results:"
For ($X = 0; $X -lt $UpdatesToInstall.Count; $X++){
$ResultsBody = $ResultsBody + "'r'n" + $UpdatesToInstall.Item($X).Title + ": " + $InstallationResult.GetUpdateResult($X).ResultCode
}
If ($InstallationResult.RebootRequire -eq $True){
Send-MailMessage -From [email protected] -To [email protected] -Subject "Server has installed updates that require a reboot" -Body
} else {
Send-MailMessage -From [email protected] -To [email protected] -Subject "Server has installed updates that do not require a reboot" -Body
}
}
NOTA:
Você pode usar o script original vinculado e modificá-lo para fazer a detecção e o download, e, nesse caso, provavelmente seria melhor desabilitar a diretiva Configure Automatic Updates.
Adendo:
Há um Módulo do Windows Update PowerShell no Centro de scripts da Microsoft que fornece a funcionalidade necessária para escrever seus próprios scripts do Windows Update facilmente. Na verdade, existem muitos recursos bons (no momento da redação deste artigo) na primeira página do google para a pesquisa: PowerShell windows update