Public/Publish-UserGroupMembership.ps1

Function Publish-UserGroupMembership {
    [CmdletBinding()]
    param (
        # Source user from which you want to clone group membership.
        [Parameter(Mandatory=$true,
        Position=1)]
        [ValidateNotNullOrEmpty()]
        [string]
        $SourceUser,
        # Destination user to which you want to clone group membership.
        [Parameter(Mandatory=$true,
        Position=2)]
        [ValidateNotNullOrEmpty()]
        [string]
        $DestinationUser
    )
    process {
        $FindSource = (Get-ADUser -filter * | Where-Object {$_.SamAccountName -eq "$SourceUser"})
        $FindDestination = (Get-ADUser -filter * | Where-Object {$_.SamAccountName -eq "$DestinationUser"})
        Find-EmptyString -VariableName $FindSource -ErrorOut "Cannot find an user object that matches name $SourceUser" -Action Stop
        Find-EmptyString -VariableName $FindSource -ErrorOut "Cannot find an user object that matches name $FindDestination" -Action Stop
        $SourceGroups = (Get-ADPrincipalGroupMembership -Identity $($FindSource.SamAccountName)).Name | Sort-Object
        if ($true -eq [string]::IsNullOrWhiteSpace("$SourceGroups")) {
            Write-Output "User is not member of any group." -ErrorAction Stop
        }
        $DestinationGroups = (Get-ADPrincipalGroupMembership -Identity $($FindDestination.SamAccountName)).Name | Sort-Object
        $GroupDifference = (Compare-Object -ReferenceObject $SourceGroups -DifferenceObject $DestinationGroups).inputobject
        foreach ($Group in $GroupDifference) {
            try {
                Add-ADGroupMember -Identity "$Group" -Members $($FindDestination.SamAccountName)
            }
            catch {
                Write-Error "$_" -ErrorAction Continue
            }
        }
    }
}