source: http://www.craig-tolley.co.uk/2016/01/21/wsus-copy-updates-between-groups/
Run the script below, then call it using the following syntax:
Copy-WsusGroupApprovals -WsusServerFqdn wsus.domain.co.uk -SourceGroupName "OldServers" -TargetGroupName "NewServers"
You can optionally specify a port, the default being 8530. You can also specify to use a secure connection. The group names are both case sensitive though.
# ----------------------------------------------------------------------------------------------------------
# PURPOSE: WSUS - Copy Approvals from one Group to another Group
#
# VERSION DATE USER DETAILS
# 1 21/01/2016 Craig Tolley First Version
#
# ----------------------------------------------------------------------------------------------------------
#.SYNOPSIS
# Copies all approvals from the specified source group to the specified destination group.
# Group names are case sensitive.
# Unless specified the default WSUS port of 8530 will be used to connect.
function Copy-WsusGroupApprovals
{
param
(
[Parameter(Mandatory=$true)]
[ValidateNotNullOrEmpty()]
[String]$WsusServerFqdn,
[Int]$WsusServerPort = 8530,
[Boolean]$WsusServerSecureConnect = $false,
[Parameter(Mandatory=$true)]
[ValidateNotNullOrEmpty()]
[String]$SourceGroupName,
[Parameter(Mandatory=$true)]
[ValidateNotNullOrEmpty()]
[String]$TargetGroupName
)
# Load the assembly required
try
{
[void][reflection.assembly]::LoadWithPartialName("Microsoft.UpdateServices.Administration")
}
catch
{
Write-Error "Unable to load the Microsoft.UpdateServices.Administration assembly: $($_.Exception.Message)"
break
}
# Attempt the connection to the WSUS Server
try
{
$WsusServer = [Microsoft.UpdateServices.Administration.AdminProxy]::getUpdateServer($WsusServerFqdn, $WsusServerSecureConnect, $WsusServerPort)
}
catch
{
Write-Error "Unable to connect to the WSUS Server: $($_.Exception.Message)"
break
}
# Get all of the Wsus Groups, and check that the specified source and destination groups exist
$Groups = $WsusServer.GetComputerTargetGroups()
If ($Groups.Name -notcontains $SourceGroupName -or $Groups.Name -notcontains $TargetGroupName)
{
Write-Error "Source or Destination group names cannot be found in the list of groups on the WSUS Server. Group names are case sensitive. Please check your names."
break
}
$SourceGroupObj = $Groups | Where {$_.Name -eq $SourceGroupName}
$TargetGroupObj = $Groups | Where {$_.Name -eq $TargetGroupName}
# Get all of the updates on the server
Write-Progress -Activity "Getting Details of all updates"
$Updates = $WsusServer.GetUpdates()
# Go through each of the updates. If the update has an approval for the source group, then create an approval for the destination group.
$i = 0
$Approved = 0
ForEach ($Update in $Updates)
{
$i ++
Write-Progress -Activity "Copying update approvals" -PercentComplete (($i/$($Updates.Count))*100) -Status "$i of $($Updates.Count)"
if ($Update.GetUpdateApprovals($SourceGroupObj).Count -ne 0 -and $Update.GetUpdateApprovals($TargetGroupObj).Count -eq 0)
{
Write-Host ("Approving {0} for {1}" -f $Update.Title, $TargetGroupObj.Name)
$Update.Approve('Install',$TargetGroupObj) | Out-Null
$Approved ++
}
}
Write-Progress -Activity "Copying update approvals" -Completed
Write-Output ("Approved {0} updates for target group {1}" -f $Approved, $TargetGroupName)
}