CompliancePolicies/Backup-IntuneCompliancePolicy.ps1

# Write the comment-based HELP for Backup-IntuneCompliancePolicy
<#
.SYNOPSIS
    Backs up Intune compliance policies.
 
.DESCRIPTION
    Backs up Intune compliance policies.
 
.PARAMETER Name
    The name of the compliance policy to backup. This is case sensitive and uses the startswith filter operator.
 
.PARAMETER Id
    The id of the compliance policy to backup.
 
.PARAMETER Environment
    The environment to connect to. Valid values are Global, USGov, USGovDoD. Default is Global.
 
.PARAMETER All
    Backup all compliance policies.
 
.PARAMETER IncludeTags
    Include role scope tags in the backup.
 
.EXAMPLE
    # Backup all configuration profiles.
    Backup-IntuneCompliancePolicy -All
 
.EXAMPLE
    # Backup a compliance policy by name.
    Backup-IntuneCompliancePolicy -Name "MyCompliancePolicy"
 
.EXAMPLE
    # Backup a compliance policy by id.
    Backup-IntuneCompliancePolicy -Id "12345678-1234-1234-1234-123456789012"
 
.EXAMPLE
    # Backup a compliance policy by name in the USGov environment.
    Backup-IntuneCompliancePolicy -Name "MyConfigurationProfile" -Environment USGov
 
.EXAMPLE
    # Backup a compliance policy by id in the USGov environment.
    Backup-IntuneCompliancePolicy -Id "12345678-1234-1234-1234-123456789012" -Environment USGov
 
#>

function Backup-IntuneCompliancePolicy
{
    param(
        [Parameter(Mandatory, ParameterSetName="Name", Position=0)]
        [string]$Name,
        [Parameter(Mandatory, ParameterSetName="Id", Position=1)]
        [string]$Id,
        [Parameter(ParameterSetName="Name")]
        [Parameter(ParameterSetName="Id")]
        [Parameter(ParameterSetName="All")]
        [ValidateSet("Global", "USGov", "USGovDoD")]
        [string]$Environment="Global",
        [Parameter(ParameterSetName="All")]
        [switch]$All
    )

    begin {
        $scopes = @("DeviceManagementConfiguration.Read.All")
        if($IncludeTags)
        {
            $scopes += "DeviceManagementRBAC.Read.All"
        }
        if($false -eq (Initialize-IntuneAccess -Scopes $scopes -Modules @("Microsoft.Graph.Authentication") -Environment $Environment))
        {
            return
        }
    }
    process {
        $policies = @()
        if($All)
        {
            $policies += Get-IntuneCompliancePolicy -All -Environment $Environment
        }

        if($Name)
        {
            $policies += Get-IntuneCompliancePolicy -Name $Name -Environment $Environment
        }

        if($Id)
        {
            $policies += Get-IntuneCompliancePolicy -Id $Id -Environment $Environment
        }

        $backupPolicies = @()

        foreach($policy in $policies)
        {

            $assignments = Get-IntuneCompliancePolicyAssignments -Id $policy.id -Environment $Environment

            $filters = @()
            foreach($assignment in $assignments)
            {
                if($null -ne $assignment.target.deviceAndAppManagementAssignmentFilterId)
                {
                    $filters += Get-IntuneFilter -Id $assignment.target.deviceAndAppManagementAssignmentFilterId -Environment $Environment
                }
            }

            $policy | Add-Member -MemberType NoteProperty -Name assignments -value $assignments
            $policy | Add-Member -MemberType NoteProperty -Name filters -value $filters

            $backupPolicies += $policy

        }

        # TODO: Add Security Group Names to the backup

        $backup = [PSCustomObject]@{
            configurations = $backupPolicies
            backupDate = Get-Date
        }

        return $backup
    }
}