Scripts/Get-PSWSUSClientPerUpdate.ps1
function Get-PSWSUSClientPerUpdate { <# .SYNOPSIS Gets collection of clients for specified update based on groupname or defined computer scope .DESCRIPTION Gets collection of clients for specified update based on groupname or defined computer scope .PARAMETER Update Name of the update to collect data on. .PARAMETER GroupName Name of the group to perform query against. Will default to all groups if not used. .PARAMETER IncludeChildGroup Includes child groups if using GroupName parameter .PARAMETER ComputerScope Collection of computers that can be used for query .NOTES Name: Get-PSWSUSClientPerUpdate Author: Boe Prox DateCreated: 23NOV2011 .LINK https://learn-powershell.net .EXAMPLE Get-PSWSUSClientPerUpdate -GroupName Servers -Update 935490 Computername TargetGroup UpdateKB UpdateTitle UpdateInstallationSt ate ------------ ----------- -------- ----------- -------------------- Server.domain.com 935490 Update Rollup 2 for Exchange Server 2... Unknown Server.domain.com 935490 Update Rollup 2 for Exchange Server 2... Unknown Server.domain.com 935490 Update Rollup 2 for Exchange Server 2... Unknown Description ----------- Gets the Installation State of all members of the Servers group for update 935490 .EXAMPLE $scope = New-PSWSUSComputerScope -NameIncludes "V" -FromLastSyncTime (Get-Date).AddDays(-14) Get-PSWSUSClientPerUpdate -ComputerScope $scope -Update 935490 Computername TargetGroup UpdateKB UpdateTitle UpdateInstallationSt ate ------------ ----------- -------- ----------- -------------------- Server.domain.com 935490 Update Rollup 2 for Exchange Server 2... Unknown Server.domain.com 935490 Update Rollup 2 for Exchange Server 2... Unknown Server.domain.com 935490 Update Rollup 2 for Exchange Server 2... Unknown Description ----------- Gets the Installation State of all members of the Servers group for update 935490 #> [cmdletbinding( ConfirmImpact = 'low', DefaultParameterSetName = 'ComputerScope' )] Param( [Parameter(Position = 0, ParameterSetName = '',ValueFromPipeLine = $True)] [Object]$Update, [Parameter(Position = 1, ParameterSetName = 'ComputerScope')] [Microsoft.UpdateServices.Administration.ComputerTargetScope]$ComputerScope, [Parameter(Position = 1, ParameterSetName = 'Group')] [string]$GroupName, [Parameter(Position = 2, ParameterSetName = 'Group')] [Switch]$IncludeChildGroup ) Begin { $ErrorActionPreference = 'stop' $hash = @{} } Process { If ($PSBoundParameters['Update'] -is [string] -OR $PSBoundParameters['Update'] -is [int]) { Write-Verbose "Getting update object from string" $hash['UpdateObject'] = Get-PSWSUSUpdate -Update $Update } ElseIf ($PSBoundParameters['Update'] -is [Microsoft.UpdateServices.Internal.BaseApi.Update]) { Write-Verbose "Getting update object from object" $hash['UpdateObject'] = $Update } Else { Write-Warning "No update specified!" Break } If ($PSBoundParameters['GroupName']) { Write-Verbose "Gathering data from specified group" $hash['GroupObject'] = Get-PSWSUSGroup -Name $GroupName ForEach ($Object in $hash['UpdateObject']) { Try { If ($PSBoundParameters['IncludeChildGroup']) { $Object.GetUpdateInstallationInfoPerComputerTarget($hash['GroupObject'],$True) } Else { $Object.GetUpdateInstallationInfoPerComputerTarget($hash['GroupObject'],$False) } } Catch { Write-Warning ("{0}" -f $_.Exception.Message) } } } ElseIf ($PSBoundParameters['ComputerScope']) { Write-Verbose "Gathering data from all clients" ForEach ($Object in $hash['UpdateObject']) { Try { $Object.GetUpdateInstallationInfoPerComputerTarget($ComputerScope) } Catch { Write-Warning ("{0}" -f $_.Exception.Message) } } } Else { Write-Warning "No Group or ComputerScope object specified!" } } End { $ErrorActionPreference = 'continue' } } |