Scripts/Export-WSUSUpdateApprovals.ps1

# Internal function to get updates approval information for exporting.
Function Get-UpdatesApprovals ($Updates, $ComputerTargetGroups, $UpdateInfo) {
    $ExportApprovals = @()

    foreach ($Update in $Updates) {
        Write-Progress -activity "Getting $UpdateInfo updates approval information" -PercentComplete ($pCounter++ * 100 /$Updates.Count) 
        $Approvals = $Update.GetUpdateApprovals()

        if ($Update.IsDeclined -eq $true) {
            $Title = $Update.Title
            $Id = $Update.Id
            $Action = "Decline"
            $Deadline = $null
            $ComputerTargetGroup = $null
            $ExportApprovals += New-Object PSObject -Property @{Title=$Title; ComputerTargetGroup=$ComputerTargetGroup; Id=$Id; Action=$Action; Deadline=$Deadline}    
        } elseif ($Approvals.Count -ne 0) {
            foreach ($Approval in $Approvals) {
                $Title = $Update.Title
                $Id = $Approval.UpdateId
                $Action = $Approval.Action
                $Deadline = $Approval.Deadline
                $ComputerTargetGroup = ($ComputerTargetGroups | Where-Object {$_.Id -eq $Approval.ComputerTargetGroupId}).Name
                $ExportApprovals += New-Object PSObject -Property @{Title=$Title; ComputerTargetGroup=$ComputerTargetGroup; Id=$Id; Action=$Action; Deadline=$Deadline}
            }
        }
    }
    return $ExportApprovals
}

Function Export-WSUSUpdateApprovals {
    <#
    .SYNOPSIS
        Export WSUS update approval infomation to a XML file.
 
    .DESCRIPTION
        Export WSUS update approval infomation to a XML file.
 
    .NOTES
        Name: Export-WSUSUpdateApprovals
        Author: Rei Ikei
 
    .EXAMPLE
        Export-WSUSUpdateApprovals -XmlPath C:\WSUSUpdateApprovals.xml -All
        Export-WSUSUpdateApprovals -XmlPath C:\WSUSUpdateApprovals.xml -TargetComputerGroup "All Computers"
    #>


    Param (
        [parameter(mandatory=$true)][string]$XmlPath,
        [switch]$All,
        [string]$TargetComputerGroupName
    )

    Process {
        if (($All -eq $false) -And ($TargetComputerGroupName -eq "")) {
            Write-Error "You must use -TargetComputerGroupName or -All option."
            return
        } elseif (($All -eq $true) -And ($TargetComputerGroupName -ne "")) {
            Write-Error "You cannot use -TargetComputerGroupName and -All options at same time."
            return
        }

        Write-Host "Try to connect WSUS."
        
        Try {
            $WSUS = [Microsoft.UpdateServices.Administration.AdminProxy]::getUpdateServer()
            $ComputerTargetGroups = $WSUS.GetComputerTargetGroups()
        } Catch {
            Write-Error "$error[0]"
            Return
        }

        Write-Host "Connected WSUS successfully."

        $UpdateScope = New-Object Microsoft.UpdateServices.Administration.UpdateScope

        if ($TargetComputerGroupName -ne "") {
            $ComputerTargetGroup = $ComputerTargetGroups | Where-Object {$_.Name -eq $TargetComputerGroupName}
            if ($null -ne $ComputerTargetGroup) {
                $UpdateScope.ApprovedComputerTargetGroups.AddRange($ComputerTargetGroup)
            } else {
                Write-Error "$TargetComputerGroupName is not existed on this WSUS server."
                return
            }
        }

        $ExportApprovals = @()
        
        Write-Host "Try to get Approved updates from WSUS."

        Try {
            $UpdateScope.ApprovedStates = [Microsoft.UpdateServices.Administration.ApprovedStates]::HasStaleUpdateApprovals, [Microsoft.UpdateServices.Administration.ApprovedStates]::LatestRevisionApproved;
            $Updates = $WSUS.GetUpdates($UpdateScope)
        } Catch {
            Write-Error "$error[0]"
            Return
        }

        Write-Host "Got Approved updates from WSUS successfully."

        $ExportApprovals += Get-UpdatesApprovals $Updates $ComputerTargetGroups "Approved"
        
        Write-Host "Try to get Not Approved updates from WSUS."

        Try {
            $UpdateScope.ApprovedStates = [Microsoft.UpdateServices.Administration.ApprovedStates]::NotApproved
            $Updates = $WSUS.GetUpdates($UpdateScope)
        } Catch {
            Write-Error "$error[0]"
            Return
        }

        Write-Host "Got Not Approved updates from WSUS successfully."

        $ExportApprovals += Get-UpdatesApprovals $Updates $ComputerTargetGroups "Not Approved"

        if ($All -eq $true) {
            Write-Host "Try to get Declined updates from WSUS."

            Try {
                $UpdateScope.ApprovedStates = [Microsoft.UpdateServices.Administration.ApprovedStates]::Declined
                $Updates = $WSUS.GetUpdates($UpdateScope)
            } Catch {
                Write-Error "$error[0]"
                Return
            }

            Write-Host "Got Declined updates from WSUS successfully."

            $ExportApprovals += Get-UpdatesApprovals $Updates $ComputerTargetGroups "Declined"
        }
            
        Write-Host "Try to export WSUS update approval infromation to $XmlPath."

        Try {
            $ExportApprovals | Export-Clixml -Path $XmlPath -Encoding unicode
        } Catch {
            Write-Error "$error[0]"
            Return
        }

        Write-Host "Exported successfully WSUS update approval infromation to $XmlPath."
    }
}