Scripts/Get-PSWSUSClient.ps1

function Get-PSWSUSClient {
    <#
    .SYNOPSIS
        Retrieves information about a WSUS client.
         
    .DESCRIPTION
        Retrieves information about a WSUS client.
         
    .PARAMETER Computername
        Name of the client to search for. Accepts a partial name. If left blank, then all clients displayed
 
    .PARAMETER IncludedInstallationState
        Update installation states to search for
 
    .PARAMETER ExcludedInstallState
        Installation states to exclude
 
    .PARAMETER ComputerTargetGroups
        List of target groups to search
 
    .PARAMETER FromLastStatusTime
        Earliest reported status time
 
    .PARAMETER ToLastStatusTime
        Latest last reported status time to search for
 
    .PARAMETER FromLastSyncTime
        Earliest last synchronization time to search for
 
    .PARAMETER ToLastSyncTime
        Latest last synchronization time to search for
 
    .PARAMETER OSFamily
        Operating system family for which to search
 
    .PARAMETER IncludeSubGroups
        List of target groups to search
 
    .PARAMETER IncludeDownstreamComputerTargets
        Clients of a downstream server, not clients of this server, should be included
         
    .NOTES
        Name: Get-PSWSUSClient
        Author: Boe Prox
        Version History:
            1.2 | 18 Feb 2015
                -Renamed to Get-PSWSUSClient
                -Add multiple parameters
            1.0 | 24 Sept 2010
                -Initial Version
                
    .LINK
        https://learn-powershell.net
         
    .EXAMPLE
    Get-PSWSUSClient -Computername "server1"
 
    Description
    -----------
    This command will search for and display all computers matching the given input.
 
    .EXAMPLE
    Get-PSWSUSClient -ToLastSyncTime (Get-Date).AddDays(-30)
 
    Description
    -----------
    This command will search for and display all computers that have not synced since in the past 30 days.
 
    .EXAMPLE
    $Groups = Get-PSWSUSGroup -Name 'Windows Server 2012 R2'
    Get-PSWSUSClient -ComputerTargetGroups $Groups
 
    Description
    -----------
    This command will search for and display all computers that are members of the specified group.
            
    #>
 
    [cmdletbinding(
        DefaultParameterSetName = 'AllComputers'
    )]
        Param(            
            [Parameter(Position=0,ParameterSetName = 'Computer',ValueFromPipeline = $True)]
            [string[]]$Computername,
            [Parameter(ParameterSetName='ComputerScope')]
            [Microsoft.UpdateServices.Administration.UpdateInstallationStates]$IncludedInstallationState,
            [Parameter(ParameterSetName='ComputerScope')]
            [Microsoft.UpdateServices.Administration.UpdateInstallationStates]$ExcludedInstallState,
            [Parameter(ParameterSetName='ComputerScope')]
            [Microsoft.UpdateServices.Internal.BaseApi.ComputerTargetGroup[]]$ComputerTargetGroups,
            [Parameter(ParameterSetName='ComputerScope')]
            [DateTime]$FromLastStatusTime,
            [Parameter(ParameterSetName='ComputerScope')]
            [DateTime]$ToLastStatusTime,
            [Parameter(ParameterSetName='ComputerScope')]
            [DateTime]$FromLastSyncTime,
            [Parameter(ParameterSetName='ComputerScope')]
            [DateTime]$ToLastSyncTime,
            [Parameter(ParameterSetName='ComputerScope')]
            [string]$OSFamily,
            [Parameter(ParameterSetName='ComputerScope')]
            [switch]$IncludeSubGroups,
            [Parameter(ParameterSetName='ComputerScope')]
            [switch]$IncludeDownstreamComputerTargets
        )
    Begin {                
        if($wsus)
        {
            $ErrorActionPreference = 'Stop'  
            If ($PSCmdlet.ParameterSetName -eq 'ComputerScope') {
                $ComputerScope = New-Object Microsoft.UpdateServices.Administration.ComputerTargetScope  
                If ($PSBoundParameters['IncludedInstallationState']) {
                    $ComputerScope.IncludedInstallationStates = $IncludedInstallationState
                }
                If ($PSBoundParameters['ExcludedInstallState']) {
                    $ComputerScope.ExcludedInstallationStates = $ExcludedInstallState
                }
                If ($PSBoundParameters['FromLastStatusTime']) {
                    $ComputerScope.FromLastReportedStatusTime = $FromLastStatusTime
                }
                If ($PSBoundParameters['ToLastStatusTime']) {
                    $ComputerScope.ToLastReportedStatusTime = $ToLastStatusTime
                }
                If ($PSBoundParameters['FromLastSyncTime']) {
                    $ComputerScope.FromLastSyncTime = $FromLastSyncTime
                }
                If ($PSBoundParameters['ToLastSyncTime']) {
                    $ComputerScope.ToLastSyncTime = $ToLastSyncTime
                }
                If ($PSBoundParameters['IncludeSubGroups']) {
                    $ComputerScope.IncludeSubgroups = $IncludeSubGroups
                }
                If ($PSBoundParameters['OSFamily']) {
                    $ComputerScope.OSFamily = $OSFamily
                }
                If ($PSBoundParameters['IncludeDownstreamComputerTargets']) {
                    $ComputerScope.IncludeDownstreamComputerTargets = $IncludeDownstreamComputerTargets
                }
                If ($PSBoundParameters['ComputerTargetGroups']) {
                    [void]$ComputerScope.ComputerTargetGroups.AddRange($ComputerTargetGroups)
                }
            }
        }#endif
        else
        {
            Write-Warning "Use Connect-PSWSUSServer to establish connection with your Windows Update Server"
            Break
        }
    }
    Process {
        Switch ($PSCmdlet.ParameterSetName) {
            'AllComputers' {
                Write-Verbose "Gather all computers in WSUS"
                $wsus.GetComputerTargets()           
            }
            'Computer' {
                ForEach ($Computer in $Computername) {
                    Write-Verbose "Retrieve computer in WSUS"
                    Try {      
                        $wsus.SearchComputerTargets($Computer)
                    } Catch {
                        Write-Warning ("Unable to retrieve {0} from database." -f $Computer)
                    }
                }             
            }
            'ComputerScope' {
                Write-Verbose "Retrieve computers based on computer scope"
                $wsus.GetComputerTargets($ComputerScope)
            }
        } 
    }
    End {
        $ErrorActionPreference = 'Continue'    
    }   
}