<

Still celebrating National IT Professionals Day with 3 months of free Premium Membership. Use Code ITDAY17

x

VBS script to start Windows Updates installation

Published on
5,353 Points
1,753 Views
1 Endorsement
Last Modified:
If you need to start windows update installation remotely or as a scheduled task you will find this very helpful.
Microsoft has implemented the Windows Update as a three-stage process. This is the key to understand how Windows Update works. The process needs to find out which new updates are available for each Microsoft product, download and install them all.

Windows-Update-Process.jpgThere are only two native ways to start the update process:
  • by using the control panel
Always-check.jpg
  • or by using the wuauclt tool.
WuAuClt /DetectNow

Open in new window

The use of the control panel implies the user interaction and the WuAuClt tool does not start the installation of the downloaded updates, it can only start the search. With the WuAuClt tool, the download will automatically follow the search only if the Windows Update settings on the client computer instructs to download any available update without asking the user.

So, there is a lack of native tools to start and complete the update process at will from a command prompt or from a scheduled task. To meet this need I created a script that executes the installation process from start to finish without user interaction. The script follows the three-stages process described previously, by using special windows functions published on MSDN for managing windows updates.

The script algorithm is the following:

  1. Verify if there is a pending reboot, if so: reboot right now unless the /nr option was entered.
  2. Search for updates.
  3. If there are new updates then download them all.
  4. Install all downloaded updates.
  5. Reboot if it is needed, unless the /nr option was entered..
 
On Error Resume Next
WScript.StdOut.Write "*****************************************************************" & vbCrLf
WScript.StdOut.Write "***         Forced install of all pending updates             ***" & vbCrLf
WScript.StdOut.Write "*****************************************************************" & vbCrLf 
WScript.StdOut.Write "**                    How to use this script                   **" & vbCrLf
WScript.StdOut.Write "*****************************************************************" & vbCrLf
WScript.StdOut.Write "** cscript DoUpdate.vbs [/nr]                                  **" & vbCrLf
WScript.StdOut.Write "**                                                             **" & vbCrLf
WScript.StdOut.Write "** [/nr]      Never reboot (default is to reboot if needed)    **" & vbCrLf
WScript.StdOut.Write "*****************************************************************" & vbCrLf
' See if can auto-reboot.
DoReboot = True
if WScript.Arguments.Count <> 0 then
  for i = 0 to WScript.Arguments.Count - 1
    strInput1 = Lcase(Trim(WScript.Arguments(i)))
	
	if (strInput1 = "/nr") then
      DoReboot = False	'Do not reboot even if it is necessary.
    end if	
	
  next
end if
'*******************************************************************
' Create needed objects.
'*******************************************************************
Set updateSession = CreateObject("Microsoft.Update.Session")
Set updateSearcher	 = updateSession.CreateUpdateSearcher()
Set updateDownloader = updateSession.CreateUpdateDownloader()
Set updateInstaller  = updateSession.CreateUpdateInstaller()

Set ComputerStatus 	= CreateObject("Microsoft.Update.SystemInfo")
Set objShell = CreateObject("WScript.Shell")

' Step 1: Verify if there is a pending reboot, if so: reboot right now.
If ComputerStatus.RebootRequired then 
  WScript.StdOut.Write "This computer needs to reboot before start searching for updates." & vbCrLf
  if DoReboot then
    WScript.StdOut.Write "Rebooting in 5 seconds." & vbCrLf
    strErrorCode = objShell.Run("shutdown.exe -r -f -t 05",0,True)
  end if
  WScript.Sleep 3000
  WScript.Quit 1
End if

' Step 2: Search for updates.
WScript.StdOut.Write "Wait while searching updates." & vbCrLf
Set updateSearch = updateSearcher.Search("IsInstalled=0")
If updateSearch.ResultCode <> 2 Then
  WScript.StdOut.Write "Searching has failed with error code: " & updateSearch.ResultCode & vbCrLf
  WScript.Sleep 3000
  WScript.Quit 1
End If
' Step 3: If there are new updates download them all.
If updateSearch.Updates.Count = 0 Then
  WScript.StdOut.Write "No new updates. Finishing in 3 seconds." & vbCrLf
  WScript.Sleep 3000
  WScript.Quit 2
End If

WScript.StdOut.Write "Wait while downloading " & updateSearch.Updates.Count & " update(s)." & vbCrLf

updateDownloader.Updates = updateSearch.Updates
Set downloadResult = updateDownloader.Download()
If downloadResult.ResultCode <> 2 Then
  WScript.StdOut.Write "The download has failed with error code: " & downloadResult.ResultCode & vbCrLf
  WScript.Sleep 3000
  WScript.Quit 1
End If
WScript.StdOut.Write "Download completed." & vbCrLf
' Step 4: Install all downloaded updates.
WScript.StdOut.Write "Installing updates ..." & vbCrLf
updateInstaller.Updates = updateSearch.Updates
Set installationResult = updateInstaller.Install()
If installationResult.ResultCode <> 2 Then
  WScript.StdOut.Write "The installation has failed with error code: " & installationResult.ResultCode & vbCrLf
  WScript.Sleep 3000
  WScript.Quit 1
End If
' Step 5: Reboot if its needed.
If ComputerStatus.RebootRequired then 
  WScript.StdOut.Write "This computer needs to reboot to complete the installation." & vbCrLf
  if DoReboot then
    WScript.StdOut.Write "Rebooting in 5 seconds." & vbCrLf
    strErrorCode = objShell.Run("shutdown.exe -r -f -t 05",0,True)
  end if
  WScript.Sleep 3000
  WScript.Quit 1
  Else
  WScript.StdOut.Write "Script completed." & vbCrLf
  WScript.Sleep 3000
  WScript.Quit 2
End if
 

Open in new window


This is a Visual Basic Script that you can use freely. The script has an optional argument to control the reboot behavior of the computer: with /nr the script will not reboot even if it is needed by the update installation to complete. If you run the script without arguments it will always reboot  whenever is needed. If the computer needs to reboot before start to search for updates, it will reboot at the moment you run the script.

To run the script you must use the CSCRIPT.EXE native application. For example:
CScript //Nologo DoUpdate.vbs /nr

Open in new window

You can place the script in a network shared folder with read and execute permissions to everyone (something like the NETLOGON folder on domain controllers) and invoke the script from there. For example:

CScript //Nologo \\FQDN.Domain.Name\NetLogon\DoUpdate.vbs /nr

Open in new window

You can use the same approach when running this script as a scheduled task with the Windows Task Scheduler.

Thanks for reading and good luck to everyone.
1
Comment
Author:Hector2016
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
1 Comment
 

Expert Comment

by:sudhir singh
if we want to run this script for a group of computer only not domain wide ?
0

Featured Post

Concerto Cloud for Software Providers & ISVs

Can Concerto Cloud Services help you focus on evolving your application offerings, while delivering the best cloud experience to your customers? From DevOps to revenue models and customer support, the answer is yes!

Learn how Concerto can help you.

Join & Write a Comment

Windows 8 comes with a dramatically different user interface known as Metro. Notably missing from the new interface is a Start button and Start Menu. Many users do not like it, much preferring the interface of earlier versions — Windows 7, Windows X…
Finding and deleting duplicate (picture) files can be a time consuming task. My wife and I, our three kids and their families all share one dilemma: Managing our pictures. Between desktops, laptops, phones, tablets, and cameras; over the last decade…

Keep in touch with Experts Exchange

Tech news and trends delivered to your inbox every month