For administrators without a WSUS server, you need this script.
Well, I got good news, annoying news, then great news for this post! The good news is that the strike at my work is over now! YAY! The annoying news is that the staff systems haven’t been turned on for 4 months to do updates! The great news is that I can tell all the Windows systems in my network to install their updates, without needing a WSUS server!
First off, let’s make it clear that I have the technology to run programs, as my Domain Admin user, from a central location, on to all the other Windows systems in my network. I use a program called PDQ Deploy to do this. Secondly, note that I made some tweaks to the script I found!
The credit goes to the Microsoft Developer Network (MSDN) for the script, which runs as a .VBS command. It looks for the updates available, downloads the available updates, then checks if you need to accept a EULA, and if it needs to reboot your computer to finish. Because my goal is to push this out to 300+ computers, I just want them to download the updates, install them, and shut down! Ahh, the goodness that can come from using Linux servers in a Windows-workstation environment (sarcasm intended)!
First off, download the script from MSDN, and save it somewhere accessible to the clients. If you want to push it out, you’ll need to make 2 changes to it. On Line 39, change it to strInput = "Y"
. You’ll need to make the same change on Line 96. When I did it to my script, I commented out the original lines, then added my new lines directly after it. Save the script.
A quick note
Another thing to mention is that sometimes, the updates are quite large! When I ran it on my tech laptop that reboots about once per month, the biggest update was 715MB in size (the Microsoft SQL Server 2012 Service Pack)! So, it will take a while to run. The good news about my setup though, is that I have a Squid Proxy server setup, which will cache 50GB of Windows Updates for my company, so it is only ever the first computer needing the update that is slow at downloading. If you have a proxy server, you can push out a netsh
command to force the Windows Update service to use your proxy server, which will speed up the other machines.
Use a specific proxy server for Windows Updates:
netsh.exe winhttp set proxy <ipaddress>:<port>
The code (save to a .VBS file)
Original Windows Update script
My Updated script (which says YES to the EULA and to installing the updates found):
Set updateSession = CreateObject("Microsoft.Update.Session")
updateSession.ClientApplicationID = "MSDN Sample Script"
Set updateSearcher = updateSession.CreateUpdateSearcher()
WScript.Echo "Searching for updates..." & vbCRLF
Set searchResult = _
updateSearcher.Search("IsInstalled=0 and Type='Software' and IsHidden=0")
WScript.Echo "List of applicable items on the machine:"
For I = 0 To searchResult.Updates.Count-1
Set update = searchResult.Updates.Item(I)
WScript.Echo I + 1 & "> " & update.Title
Next
If searchResult.Updates.Count = 0 Then
WScript.Echo "There are no applicable updates."
WScript.Quit
End If
WScript.Echo vbCRLF & "Creating collection of updates to download:"
Set updatesToDownload = CreateObject("Microsoft.Update.UpdateColl")
For I = 0 to searchResult.Updates.Count-1
Set update = searchResult.Updates.Item(I)
addThisUpdate = false
If update.InstallationBehavior.CanRequestUserInput = true Then
WScript.Echo I + 1 & "> skipping: " & update.Title & _
" because it requires user input"
Else
If update.EulaAccepted = false Then
WScript.Echo I + 1 & "> note: " & update.Title & _
" has a license agreement that must be accepted:"
WScript.Echo update.EulaText
WScript.Echo "Do you accept this license agreement? (Y/N)"
'strInput = WScript.StdIn.Readline
strInput = "Y"
WScript.Echo
If (strInput = "Y" or strInput = "y") Then
update.AcceptEula()
addThisUpdate = true
Else
WScript.Echo I + 1 & "> skipping: " & update.Title & _
" because the license agreement was declined"
End If
Else
addThisUpdate = true
End If
End If
If addThisUpdate = true Then
WScript.Echo I + 1 & "> adding: " & update.Title
updatesToDownload.Add(update)
End If
Next
If updatesToDownload.Count = 0 Then
WScript.Echo "All applicable updates were skipped."
WScript.Quit
End If
WScript.Echo vbCRLF & "Downloading updates..."
Set downloader = updateSession.CreateUpdateDownloader()
downloader.Updates = updatesToDownload
downloader.Download()
Set updatesToInstall = CreateObject("Microsoft.Update.UpdateColl")
rebootMayBeRequired = false
WScript.Echo vbCRLF & "Successfully downloaded updates:"
For I = 0 To searchResult.Updates.Count-1
set update = searchResult.Updates.Item(I)
If update.IsDownloaded = true Then
WScript.Echo I + 1 & "> " & update.Title
updatesToInstall.Add(update)
If update.InstallationBehavior.RebootBehavior > 0 Then
rebootMayBeRequired = true
End If
End If
Next
If updatesToInstall.Count = 0 Then
WScript.Echo "No updates were successfully downloaded."
WScript.Quit
End If
If rebootMayBeRequired = true Then
WScript.Echo vbCRLF & "These updates may require a reboot."
End If
WScript.Echo vbCRLF & "Would you like to install updates now? (Y/N)"
'strInput = WScript.StdIn.Readline
strInput = "Y"
WScript.Echo
If (strInput = "Y" or strInput = "y") Then
WScript.Echo "Installing updates..."
Set installer = updateSession.CreateUpdateInstaller()
installer.Updates = updatesToInstall
Set installationResult = installer.Install()
'Output results of install
WScript.Echo "Installation Result: " & _
installationResult.ResultCode
WScript.Echo "Reboot Required: " & _
installationResult.RebootRequired & vbCRLF
WScript.Echo "Listing of updates installed " & _
"and individual installation results:"
For I = 0 to updatesToInstall.Count - 1
WScript.Echo I + 1 & "> " & _
updatesToInstall.Item(i).Title & _
": " & installationResult.GetUpdateResult(i).ResultCode
Next
End If