Scripts/Get-PSWSUSUpdatePerClient.ps1

function Get-PSWSUSUpdatePerClient {
    <#
    .SYNOPSIS
        Gets the summary of all updates for a client
         
    .DESCRIPTION
       Gets the summary of all updates for a client
         
    .PARAMETER ComputerName
        Name of the client to query
     
    .PARAMETER ComputerObject
        Collection of computers to query
         
    .PARAMETER UpdateScope
        Specified scope of updates to perform query against
         
    .NOTES
        Name: Get-PSWSUSUpdatePerComputer
        Author: Boe Prox
        DateCreated: 23NOV2011
                
    .LINK
        https://learn-powershell.net
         
    .EXAMPLE
    Get-PSWSUSUpdatePerClient -UpdateScope (New-PSWSUSUpdateScope -IncludedInstallationStates Failed)
     
    Computername TargetGroup UpdateKB UpdateTitle UpdateInstallationSt UpdateApprovalA
                                                                                                       ate ction
    ------------ ----------- -------- ----------- -------------------- ---------------
    TEST1 Servers - Test 979909 Microsoft .NET Framework 3.5 SP1 and ... Failed Install
    TEST2 Servers - Test 983583 Security Update for .NET Framework 2.... Failed Install
    TEST2 Servers - Test 2418241 Security Update for Microsoft .NET Fr... Failed Install
    TEST3 Servers - Test 2446704 Security Update for .NET Framework 2.... Failed Install
    TEST5 Servers - Test 2478658 Security Update for .NET Framework 2.... Failed Install
    ...
         
    Descripton
    ----------
    This example will gather all failed updates from all of the clients on the WSUS server using the UpdateScope.
     
    .EXAMPLE
    Get-PSWSUSUpdatePerClient -Computername Test1 -UpdateScope (New-PSWSUSUpdateScope -IsWsusInfrastructureUpdate)
     
    Computername TargetGroup UpdateKB UpdateTitle UpdateInstallationSt UpdateApprovalA
                                                                                                       ate ction
    ------------ ----------- -------- ----------- -------------------- ---------------
    TEST1 Servers - Test 842773 Update for Background Intelligent Tra... NotApplicable Install
    TEST1 Servers - Test 898461 Update for Windows XP (KB898461) NotApplicable Install
    TEST1 Servers - Test 938759 Update for Windows Server 2003 (KB938... Installed Install
    TEST1 Servers - Test 938759 Update for Windows Server 2003 for It... NotApplicable Install
    TEST1 Servers - Test 938759 Update for Windows Server 2003 x64 Ed... NotApplicable Install
     
    Description
    -----------
    This example gets all updates from TEST1 that are WSUS infrastructure related updates.
     
    #>
 
    [cmdletbinding(
        ConfirmImpact = 'low',
        DefaultParameterSetName = 'ComputerName'
    )]
    Param(
        [Parameter(Position = 0, ParameterSetName = 'ComputerName')]
        [string]$ComputerName, 
        [Parameter(Position = 0, ParameterSetName = 'ComputerObject',ValueFromPipeline = $True)]
        [Microsoft.UpdateServices.Internal.BaseApi.ComputerTarget]$ComputerObject,
        [Parameter(Position = 1, ParameterSetName = '')]
        [Microsoft.UpdateServices.Administration.UpdateScope]$UpdateScope                                                                                          
    )
    Begin {                
        $ErrorActionPreference = 'stop'
        $hash = @{}
    }
    Process {
        If ($PSBoundParameters['ComputerName']) {
            $hash['ComputerObject'] = Get-PSWSUSClient -Computername $Computername
        } ElseIf ($PSBoundParameters['ComputerObject']) {
            $hash['ComputerObject'] = $ComputerObject
        } Else {
            $hash['ComputerObject'] = Get-PSWSUSClient
        }
        ForEach ($object in $hash['ComputerObject']) {
            Try {
                If ($PSBoundParameters['UpdateScope']) {
                    $object.GetUpdateInstallationInfoPerUpdate($UpdateScope)
                } Else {
                    $object.GetUpdateInstallationInfoPerUpdate()
                }
            } Catch {
                Write-Warning ("{0}" -f $_.Exception.Message)
            }
        }        
    }  
    End {
        $ErrorActionPreference = 'continue'    
    } 
}