I have been using the UpdateHF.vbs vbscript for years to patch all my servers. I wrote a simple HTA to wrap it, and it gets executed by psexec. I wanted to take that script, strip it down, and convert it to PowerShell. My intension was to run it through a PSSession but I get access denied. Maybe I will try launching it with SCCM?
I found these three scripts, that I chopped to together for a script that I wanted:
Function JBMURPHY-Install-WindowsUpdates { PARAM([switch]$Install,[switch]$reboot) if($(Test-Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update\RebootRequired")){ if (!($reboot)){ write-host "There are pending reboots, please pass the reboot command" return } else{ restart-computer return } } Write-Host -nonewline " + Searching for Updates: " $UpdateSession = New-Object -ComObject Microsoft.Update.Session $Updates=$updateSession.CreateupdateSearcher().Search("IsAssigned=1 and IsHidden=0 and IsInstalled=0").Updates Write-Host " Found [$($Updates.count)] Updates to Download and install`n`n" $UpdatesCollection = New-Object -ComObject Microsoft.Update.UpdateColl $UpdatesDownloader = $UpdateSession.CreateUpdateDownloader() foreach ($Update in $Updates){ # Add Update to Collection if ( $Update.EulaAccepted -eq 0 ) { $Update.AcceptEula() } $UpdatesCollection.Add($Update) | out-null # Download Write-Host -NoNewline " + Downloading Update $($Update.Title)" $UpdatesDownloader.Updates = $UpdatesCollection $DownloadResult = $UpdatesDownloader.Download() $DownloadResultResultCode = switch -exact ($DownloadResult.ResultCode) { 0 {"NotStarted"} 1 {"InProgress"} 2 {"Succeeded"} 3 {"SucceededWithErrors"} 4 {"Failed"} 5 {"Aborted"} } $Message = " [{0}] " -f ($DownloadResultResultCode) Write-Host -ForegroundColor Green $message } if (($Install) -and ($($Updates.count) -gt 0)) { write-host "`n`nInstalling updates" $Installer = $UpdateSession.CreateUpdateInstaller() $Installer.Updates = $UpdatesCollection $InstallerResult = $Installer.Install() $InstallerResultCode = switch -exact ($InstallerResult.ResultCode) { 0 {"NotStarted"} 1 {"InProgress"} 2 {"Succeeded"} 3 {"SucceededWithErrors"} 4 {"Failed"} 5 {"Aborted"} } $Message = " Installation [{0}] " -f ($InstallerResultCode) Write-Host $message Write-Host } if (($reboot) -and ($($Updates.count) -gt 0)) { if($(Test-Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update\RebootRequired")) { write-host "Rebooting" restart-computer } } }
Thanks to those that put the original scripts together