Private/Get-MsrcCvrfAffectedSoftware.ps1

Function Get-MsrcCvrfAffectedSoftware {
<#
    .SYNOPSIS
        Get details of products affected by a CVRF document
 
    .DESCRIPTION
       CVRF documents next products into several places, including:
       -Vulnerabilities
       -Threats
       -Remediations
       -Product Tree
       This function gathers the details for each product identified in a CVRF document.
 
    .PARAMETER Vulnerability
 
    .PARAMETER ProductTree
     
    .EXAMPLE
        Get-MsrcCvrfDocument -ID 2016-Nov | Get-MsrcCvrfAffectedSoftware
    
        Get product details from a CVRF document using the pipeline.
    
    .EXAMPLE
        $cvrfDocument = Get-MsrcCvrfDocument -ID 2016-Nov
        Get-MsrcCvrfAffectedSoftware -Vulnerability $cvrfDocument.Vulnerability -ProductTree $cvrfDocument.ProductTree
 
        Get product details from a CVRF document using a variable and parameters
#>

[CmdletBinding()]
Param (
    [Parameter(Mandatory,ValueFromPipelineByPropertyName)]
    $Vulnerability,

    [Parameter(Mandatory,ValueFromPipelineByPropertyName)]
    $ProductTree
)
Begin {}
Process {
    $Vulnerability | ForEach-Object {

        $v = $_

        $v.ProductStatuses.ProductID | ForEach-Object {
            $id = $_
            
            [PSCustomObject] @{
                FullProductName = $(
                    $ProductTree.FullProductName  | 
                    Where-Object { $_.ProductID -eq $id} | 
                    Select-Object -ExpandProperty Value
                ) ;
                KBArticle = $(
                    (
                        $v.Remediations | 
                        Where-Object { $_.ProductID -contains $id } |
                        Where-Object { $_.Type -eq 2 }
                    ).Description.Value
                ) ;
                CVE = $v.CVE
                Severity = $(
                    (
                        $v.Threats | 
                        Where-Object {$_.Type -eq 3 } | 
                        Where-Object { $_.ProductID -contains $id }
                    ).Description.Value
                ) ;
                Impact = $(
                    (
                        $v.Threats | 
                        Where-Object {$_.Type -eq 0 } | 
                        Where-Object { $_.ProductID -contains $id }
                    ).Description.Value
                )
                RestartRequired = $(
                    (
                        $v.Remediations | 
                        Where-Object { $_.ProductID -contains $id }
                    ).RestartRequired.Value | ForEach-Object {
                        if(-not($_)){
                            'Maybe'
                        } else {
                            "$($_)"
                        }
                    }
                ) ;
                Supercedence = $(
                    (
                        $v.Remediations | 
                        Where-Object { $_.ProductID -contains $id }
                    ).Supercedence | ForEach-Object {
                        if(-not($_)){
                            'Unknown'
                        } else {
                            "$($_)"
                        }
                    }
                ) ;
            }
        }
    }
}
End {}
}