Tuesday, August 6, 2013

How can I find out how many updates are waiting to be installed on a remote server

Below script is written by Rob Dunn & contributors, It will tell you:

  • How many patches are waiting to be installed
  • If the patches will require a reboot
  • If the server is currently waiting on a reboot to enable the patches
Example usage: C:\> cscript ServerPendingUpdates.vbs myserver01 myserver02
Connecting to myserver01 to check software update status...
myserver01 has 2 updates pending installation
myserver01 WILL need to be rebooted to complete the installation of these updates.
myserver01 is waiting for a REBOOT to complete a previous installation.

I Modify the script that it will read hostname from file and print out the report: 

'#
'# ServerPendingUpdates.vbs
'#
'# Usage: cscript ServerPendingUpdates.vbs {servername} {servername} {servername} {servername}
'#    If no {servername} specified then 'localhost' assumed
'# Wrote by Rob Dunn & contributors, and modify by H.Pan
'# To do: Error handling
'#


'#Read file directly

strReadFile = "C:\script\server\host.txt"
 Set objFSO = CreateObject("Scripting.FileSystemObject")
 Set objTS = objFSO.OpenTextFile(strReadFile)
 
 Do Until objTS.AtEndOfStream
    strComputer = objTS.ReadLine
 CheckServerUpdateStatus(strComputer)
 
 Loop

'#
'# Loop through the input parameters for each server
'#
'#Dim i
'#For i = 0 To WScript.Arguments.Count - 1
 '#   CheckServerUpdateStatus GetArgValue(i,"localhost") 'strServer
'#Next

WScript.Quit(0)

Function CheckServerUpdateStatus( ByVal strServer )

    WScript.Echo vbCRLF & "Connecting to " & strServer & " to check software update status..."

    Dim blnRebootRequired    : blnRebootRequired     = False
    Dim blnRebootPending    : blnRebootPending     = False
    Dim objSession        : Set objSession    = CreateObject("Microsoft.Update.Session", strServer)
    Dim objUpdateSearcher     : Set objUpdateSearcher    = objSession.CreateUpdateSearcher
    Dim objSearchResult    : Set objSearchResult     = objUpdateSearcher.Search(" IsAssigned=1 and IsHidden=0 and Type='Software'")

    '#
    '#
    '#
    Dim i, objUpdate
    Dim intPendingInstalls    : intPendingInstalls     = 0

    For i = 0 To objSearchResult.Updates.Count-1
        Set objUpdate = objSearchResult.Updates.Item(I) 

        If objUpdate.IsInstalled Then
            If objUpdate.RebootRequired Then
                blnRebootPending     = True
            End If
        Else
            intPendingInstalls    = intPendingInstalls + 1
            'If objUpdate.RebootRequired Then    '### This property is FALSE before installation and only set to TRUE after installation to indicate that this patch forced a reboot.
            If objUpdate.InstallationBehavior.RebootBehavior <> 0 Then
                '# http://msdn.microsoft.com/en-us/library/aa386064%28v=VS.85%29.aspx
                '# InstallationBehavior.RebootBehavior = 0    Never reboot
                '# InstallationBehavior.RebootBehavior = 1    Must reboot
                '# InstallationBehavior.RebootBehavior = 2    Can request reboot
                blnRebootRequired     = True
            End If

        End If
    Next

 if intPendingInstalls <> 0 Then
  WScript.Echo strServer & " has " & intPendingInstalls & " updates pending installation"

  If blnRebootRequired Then
   WScript.Echo strServer & " WILL need to be rebooted to complete the installation of these updates."
  Else
   WScript.Echo strServer & " WILL NOT require a reboot to install these updates."
  End If
 End If

    '#
    '#
    '#
    If blnRebootPending Then
        WScript.Echo strServer & " is waiting for a REBOOT to complete a previous installation."
    End If 
 
 WScript.Echo "--------------------------------------------------------------"
End Function



'#
'#
'#
Function GetArgValue( intArgItem, strDefault )
    If WScript.Arguments.Count > intArgItem Then
        GetArgValue = WScript.Arguments.Item(intArgItem)
    Else
        GetArgValue = strDefault
    End If
End Function

No comments:

Post a Comment