ConfigurationProfiles/Sync-IntuneConfigurationProfileSettings.ps1

# Write the comment-based HELP for Sync-IntuneConfigurationProfileSettings
<#
.SYNOPSIS
    Syncs two Intune configuration profiles.
 
.DESCRIPTION
    Syncs two Intune configuration profiles.
 
.PARAMETER SourceConfigurationId
    The id of the source configuration profile to sync.
 
.PARAMETER DestinationConfigurationId
    The id of the destination configuration profile to sync.
 
.PARAMETER Environment
    The environment to connect to. Valid values are Global, USGov, USGovDoD. Default is Global.
 
.EXAMPLE
    # Sync two configuration profiles.
    Sync-IntuneConfigurationProfileSettings -SourceConfigurationId "00000000-0000-0000-0000-000000000000" -DestinationConfigurationId "00000000-0000-0000-0000-000000000000"
 
.EXAMPLE
    # Sync two configuration profiles in the USGov environment.
    Sync-IntuneConfigurationProfileSettings -SourceConfigurationId "00000000-0000-0000-0000-000000000000" -DestinationConfigurationId "00000000-0000-0000-0000-000000000000" -Environment USGov
#>

function Sync-IntuneConfigurationProfileSettings
{
    param(
        [Parameter(Mandatory, Position=0)]
        [string]$SourceConfigurationId,
        [Parameter(Mandatory, Position=1)]
        [string]$DestinationConfigurationId,
        [ValidateSet("Global", "USGov", "USGovDoD")]
        [string]$Environment="Global"
    )

    begin {
        if($false -eq (Initialize-IntuneAccess -Scopes @("DeviceManagementConfiguration.ReadWrite.All") -Modules @("Microsoft.Graph.Authentication") -Environment $Environment))
        {
            return
        }
        
        switch ($Environment) {
            "USGov" { $uri = "https://graph.microsoft.us" }
            "USGovDoD" { $uri = "https://dod-graph.microsoft.us" }
            Default { $uri = "https://graph.microsoft.com" }
        }

        $graphVersion = "beta"
    }
    process {        
        # Get the settings from the source configuration
        $sourceConfiguration = Get-IntuneConfigurationProfile -Id $SourceConfigurationId -Environment $Environment
        
        # Get the destination configuration
        $destinationConfiguration = Get-IntuneConfigurationProfile -Id $DestinationConfigurationId -Environment $Environment

        # Check that the technologies match
        if($sourceConfiguration.technologies -ne $destinationConfiguration.technologies)
        {
            Write-Host "Technologies do not match. Cannot sync settings"
            return
        }

        # Check that the platforms match
        if($sourceConfiguration.platforms -ne $destinationConfiguration.platforms)
        {
            Write-Host "Platforms do not match. Cannot sync settings"
            return
        }

        $sourceSettings = Get-IntuneConfigurationProfileSettings -Id $SourceConfigurationId -Environment $Environment

        $updatedSettings = @()
        foreach($setting in $sourceSettings)
        {
            
            $newSetting = [PSCustomObject]@{                
                "@odata.type" = "#microsoft.graph.deviceManagementConfigurationSetting"  
                settingInstance = $setting.settingInstance                
            }
            $updatedSettings += $newSetting
        }

        $updatedConfig = @{
            creationSource = $null
            name = $destinationConfiguration.name
            description = $destinationConfiguration.description            
            platforms = $destinationConfiguration.platforms
            technologies = $destinationConfiguration.technologies
            roleScopeTagIds = $destinationConfiguration.roleScopeTagIds
            settings = $updatedSettings
            templateReference = $sourceConfiguration.templateReference
        }

        # /deviceManagement/configurationPolicies/{deviceManagementConfigurationPolicyId}/settings
        Invoke-MgRestMethod -Method PUT -Uri "$uri/$graphVersion/deviceManagement/configurationPolicies('$DestinationConfigurationId')" -Body ($updatedConfig | ConvertTo-Json -Depth 50) -ContentType "application/json"  
    }
}