Public/Get-IntunePolicyTypes.ps1

<#
.SYNOPSIS
Gets available policy types for filtering in New-IntuneMermaidGraph.

.DESCRIPTION
This function retrieves and displays the available policy types that can be used with the -PolicyType parameter
in New-IntuneMermaidGraph when Type is set to "Profiles". It shows both Device Configuration profile types
(mapped friendly names) and Settings Catalog policy template display names from your tenant.

.PARAMETER IncludeCount
When specified, includes the count of each policy type in your tenant.

.PARAMETER Online
When specified, retrieves current data from Microsoft Graph API instead of showing static mapped types.
Requires Microsoft Graph authentication.

.EXAMPLE
Get-IntunePolicyTypes

Shows all available Device Configuration profile types (mapped friendly names) that can be used for filtering.

.EXAMPLE
Get-IntunePolicyTypes -Online

Retrieves and displays current policy types from your Intune tenant, including Settings Catalog template names.

.EXAMPLE
Get-IntunePolicyTypes -Online -IncludeCount

Retrieves current policy types with counts showing how many of each type exist in your tenant.

.NOTES
Author: Your Name
#>


function Get-IntunePolicyTypes {
    [CmdletBinding()]
    param (
        [Parameter(Mandatory = $false)]
        [switch]$IncludeCount,
        
        [Parameter(Mandatory = $false)]
        [switch]$Online
    )
    
    # Static list of Device Configuration mapped friendly names
    $deviceConfigurationTypes = @(
        "Administrative templates", "App configuration", "Custom", "Derived credentials",
        "Device features", "Device firmware", "Device restrictions", "Delivery optimization",
        "Domain join", "Edition upgrade", "Education", "Email", "Endpoint protection",
        "Expedited check-in", "Extensions", "Hardware configurations", "IKEv2 VPN",
        "Identity protection", "Information protection", "Kiosk", "Microsoft Defender for Endpoint",
        "Network boundary", "OMA-CP", "PFX certificate", "PKCS certificate",
        "Policy override", "Preference file", "Presets", "SCEP certificate", 
        "Secure assessment (Education)", "Settings Catalog", "Shared multi-user device", 
        "Teams device restrictions", "Trusted certificate", "Unsupported", 
        "Update Configuration", "Update rings for Windows updates", "VPN", "Wi-Fi", 
        "Wi-Fi import", "Windows health monitoring", "Wired network"
    )
    
    if (-not $Online) {
        Write-Host "Device Configuration Profile Types (Mapped Friendly Names):" -ForegroundColor Green
        Write-Host "These can be used with -PolicyType parameter in New-IntuneMermaidGraph" -ForegroundColor Yellow
        Write-Host ""
        
        $deviceConfigurationTypes | Sort-Object | ForEach-Object {
            Write-Host " • $_" -ForegroundColor Cyan
        }
        
        Write-Host ""
        Write-Host "To see Settings Catalog template names from your tenant, use:" -ForegroundColor Yellow
        Write-Host " Get-IntunePolicyTypes -Online" -ForegroundColor White
        
        return
    }
    
    # Online mode - requires Graph authentication
    if ($null -eq (Get-MgContext)) {
        Write-Error "Microsoft Graph authentication required. Please run 'Connect-MgGraph' first."
        return
    }
    
    try {
        Write-Host "Retrieving policy types from your Intune tenant..." -ForegroundColor Yellow
        
        # Get Device Configuration profiles with pagination
        Write-Host "`nDevice Configuration Profiles:" -ForegroundColor Green
        $allDeviceConfigs = @()
        $uri = "https://graph.microsoft.com/beta/deviceManagement/deviceConfigurations"
        
        do {
            $deviceConfigs = Invoke-MgGraphRequest -Method GET -Uri $uri
            if ($deviceConfigs.value) {
                $allDeviceConfigs += $deviceConfigs.value
            }
            $uri = $deviceConfigs.'@odata.nextLink'
        } while ($uri)
        
        if ($allDeviceConfigs.Count -gt 0) {
            $configTypes = $allDeviceConfigs | Group-Object '@odata.type' | Sort-Object Name
            
            foreach ($type in $configTypes) {
                $odataType = $type.Name
                $count = $type.Count
                
                # Map to friendly name
                $profileTypeMap = @{
                    '#microsoft.graph.androidCustomConfiguration'                                     = "Custom"
                    '#microsoft.graph.androidDeviceOwnerDerivedCredentialAuthenticationConfiguration' = "Derived credentials"
                    '#microsoft.graph.androidDeviceOwnerEnterpriseWiFiConfiguration'                  = "Wi-Fi"
                    '#microsoft.graph.androidDeviceOwnerGeneralDeviceConfiguration'                   = "Device restrictions"
                    '#microsoft.graph.androidDeviceOwnerImportedPFXCertificateProfile'                = "PFX certificate"
                    '#microsoft.graph.androidDeviceOwnerPkcsCertificateProfile'                       = "PKCS certificate"
                    '#microsoft.graph.androidDeviceOwnerScepCertificateProfile'                       = "SCEP certificate"
                    '#microsoft.graph.androidDeviceOwnerTrustedRootCertificate'                       = "Trusted certificate"
                    '#microsoft.graph.androidDeviceOwnerVpnConfiguration'                             = "VPN"
                    '#microsoft.graph.androidDeviceOwnerWiFiConfiguration'                            = "Wi-Fi"
                    '#microsoft.graph.androidEasEmailProfileConfiguration'                            = "Email"
                    '#microsoft.graph.androidEnterpriseWiFiConfiguration'                             = "Wi-Fi"
                    '#microsoft.graph.androidForWorkCustomConfiguration'                              = "Custom"
                    '#microsoft.graph.androidForWorkGmailEasConfiguration'                            = "Email"
                    '#microsoft.graph.androidForWorkGeneralDeviceConfiguration'                       = "Device restrictions"
                    '#microsoft.graph.androidForWorkImportedPFXCertificateProfile'                    = "PFX certificate"
                    '#microsoft.graph.androidForWorkNineWorkEasConfiguration'                         = "Email"
                    '#microsoft.graph.androidForWorkPkcsCertificateProfile'                           = "PKCS certificate"
                    '#microsoft.graph.androidForWorkScepCertificateProfile'                           = "SCEP certificate"
                    '#microsoft.graph.androidForWorkTrustedRootCertificate'                           = "Trusted certificate"
                    '#microsoft.graph.androidForWorkVpnConfiguration'                                 = "VPN"
                    '#microsoft.graph.androidForWorkWiFiConfiguration'                                = "Wi-Fi"
                    '#microsoft.graph.androidGeneralDeviceConfiguration'                              = "Device restrictions"
                    '#microsoft.graph.androidImportedPFXCertificateProfile'                           = "PFX certificate"
                    '#microsoft.graph.androidManagedStoreAppConfiguration'                            = "App configuration"
                    '#microsoft.graph.androidOmaCpConfiguration'                                      = "OMA-CP"
                    '#microsoft.graph.androidPkcsCertificateProfile'                                  = "PKCS certificate"
                    '#microsoft.graph.androidScepCertificateProfile'                                  = "SCEP certificate"
                    '#microsoft.graph.androidTrustedRootCertificate'                                  = "Trusted certificate"
                    '#microsoft.graph.androidVpnConfiguration'                                        = "VPN"
                    '#microsoft.graph.androidWiFiConfiguration'                                       = "Wi-Fi"
                    '#microsoft.graph.androidWorkProfileCustomConfiguration'                          = "Custom"
                    '#microsoft.graph.androidWorkProfileEnterpriseWiFiConfiguration'                  = "Wi-Fi"
                    '#microsoft.graph.androidWorkProfileGeneralDeviceConfiguration'                   = "Device restrictions"
                    '#microsoft.graph.androidWorkProfileGmailEasConfiguration'                        = "Email"
                    '#microsoft.graph.androidWorkProfileNineWorkEasConfiguration'                     = "Email"
                    '#microsoft.graph.androidWorkProfilePkcsCertificateProfile'                       = "PKCS certificate"
                    '#microsoft.graph.androidWorkProfileScepCertificateProfile'                       = "SCEP certificate"
                    '#microsoft.graph.androidWorkProfileTrustedRootCertificate'                       = "Trusted certificate"
                    '#microsoft.graph.androidWorkProfileVpnConfiguration'                             = "VPN"
                    '#microsoft.graph.androidWorkProfileWiFiConfiguration'                            = "Wi-Fi"
                    '#microsoft.graph.aospDeviceOwnerDeviceConfiguration'                             = "Device restrictions"
                    '#microsoft.graph.aospDeviceOwnerEnterpriseWiFiConfiguration'                     = "Wi-Fi"
                    '#microsoft.graph.aospDeviceOwnerPkcsCertificateProfile'                          = "PKCS certificate"
                    '#microsoft.graph.aospDeviceOwnerScepCertificateProfile'                          = "SCEP certificate"
                    '#microsoft.graph.aospDeviceOwnerTrustedRootCertificate'                          = "Trusted certificate"
                    '#microsoft.graph.aospDeviceOwnerWiFiConfiguration'                               = "Wi-Fi"
                    '#microsoft.graph.editionUpgradeConfiguration'                                    = "Edition upgrade"
                    '#microsoft.graph.hardwareConfigurations'                                         = "Hardware configurations"
                    '#microsoft.graph.iosCustomConfiguration'                                         = "Custom"
                    '#microsoft.graph.iosDerivedCredentialAuthenticationConfiguration'                = "Derived credentials"
                    '#microsoft.graph.iosDeviceFeaturesConfiguration'                                 = "Device features"
                    '#microsoft.graph.iosEasEmailProfileConfiguration'                                = "Email"
                    '#microsoft.graph.iosEduDeviceConfiguration'                                      = "Education"
                    '#microsoft.graph.iosEnterpriseWiFiConfiguration'                                 = "Wi-Fi"
                    '#microsoft.graph.iosExpeditedCheckinConfiguration'                               = "Expedited check-in"
                    '#microsoft.graph.iosGeneralDeviceConfiguration'                                  = "Device restrictions"
                    '#microsoft.graph.iosikEv2VpnConfiguration'                                       = "IKEv2 VPN"
                    '#microsoft.graph.iosImportedPFXCertificateProfile'                               = "PFX certificate"
                    '#microsoft.graph.iosPkcsCertificateProfile'                                      = "PKCS certificate"
                    '#microsoft.graph.iosPresetsProfile'                                              = "Presets"
                    '#microsoft.graph.iosScepCertificateProfile'                                      = "SCEP certificate"
                    '#microsoft.graph.iosTrustedRootCertificate'                                      = "Trusted certificate"
                    '#microsoft.graph.iosUpdateConfiguration'                                         = "Update Configuration"
                    '#microsoft.graph.iosVpnConfiguration'                                            = "VPN"
                    '#microsoft.graph.iosWiFiConfiguration'                                           = "Wi-Fi"
                    '#microsoft.graph.macOSCustomAppConfiguration'                                    = "Preference file"
                    '#microsoft.graph.macOSCustomConfiguration'                                       = "Custom"
                    '#microsoft.graph.macOSDeviceFeaturesConfiguration'                               = "Device features"
                    '#microsoft.graph.macOSEndpointProtectionConfiguration'                           = "Endpoint protection"
                    '#microsoft.graph.macOSEnterpriseWiFiConfiguration'                               = "Wi-Fi"
                    '#microsoft.graph.macOSExtensionsConfiguration'                                   = "Extensions"
                    '#microsoft.graph.macOSGeneralDeviceConfiguration'                                = "Device restrictions"
                    '#microsoft.graph.macOSImportedPFXCertificateProfile'                             = "PFX certificate"
                    '#microsoft.graph.macOSPkcsCertificateProfile'                                    = "PKCS certificate"
                    '#microsoft.graph.macOSScepCertificateProfile'                                    = "SCEP certificate"
                    '#microsoft.graph.macOSSoftwareUpdateConfiguration'                               = "Update Configuration"
                    '#microsoft.graph.macOSTrustedRootCertificate'                                    = "Trusted certificate"
                    '#microsoft.graph.macOSVpnConfiguration'                                          = "VPN"
                    '#microsoft.graph.macOSWiFiConfiguration'                                         = "Wi-Fi"
                    '#microsoft.graph.macOSWiredNetworkConfiguration'                                 = "Wired network"
                    '#microsoft.graph.sharedPCConfiguration'                                          = "Shared multi-user device"
                    '#microsoft.graph.unsupportedDeviceConfiguration'                                 = "Unsupported"
                    '#microsoft.graph.windows10AdministrativeTemplate'                                = "Administrative templates"
                    '#microsoft.graph.windows10CustomConfiguration'                                   = "Custom"
                    '#microsoft.graph.windows10DeviceFirmwareConfigurationInterface'                  = "Device firmware"
                    '#microsoft.graph.windows10EasEmailProfileConfiguration'                          = "Email"
                    '#microsoft.graph.windows10EndpointProtectionConfiguration'                       = "Endpoint protection"
                    '#microsoft.graph.windows10GeneralConfiguration'                                  = "Device restrictions"
                    '#microsoft.graph.windows10ImportedPFXCertificateProfile'                         = "PFX certificate"
                    '#microsoft.graph.windows10InformationProtectionConfiguration'                    = "Information protection"
                    '#microsoft.graph.windows10NetworkBoundaryConfiguration'                          = "Network boundary"
                    '#microsoft.graph.windows10PkcsCertificateProfile'                                = "PKCS certificate"
                    '#microsoft.graph.windows10PolicyOverrideConfiguration'                           = "Policy override"
                    '#microsoft.graph.windows10SecureAssessmentConfiguration'                         = "Secure assessment (Education)"
                    '#microsoft.graph.windows10TeamGeneralConfiguration'                              = "Teams device restrictions"
                    '#microsoft.graph.windows10VpnConfiguration'                                      = "VPN"
                    '#microsoft.graph.windows10XSCEPCertificateProfile'                               = "SCEP certificate"
                    '#microsoft.graph.windows10XTrustedRootCertificate'                               = "Trusted certificate"
                    '#microsoft.graph.windows10XVpnConfiguration'                                     = "VPN"
                    '#microsoft.graph.windows10XWifiConfiguration'                                    = "Wi-Fi"
                    '#microsoft.graph.windows81GeneralConfiguration'                                  = "Device restrictions"
                    '#microsoft.graph.windows81SCEPCertificateProfile'                                = "SCEP certificate"
                    '#microsoft.graph.windows81TrustedRootCertificate'                                = "Trusted certificate"
                    '#microsoft.graph.windows81VpnConfiguration'                                      = "VPN"
                    '#microsoft.graph.windows81WifiImportConfiguration'                               = "Wi-Fi import"
                    '#microsoft.graph.windowsDefenderAdvancedThreatProtectionConfiguration'           = "Microsoft Defender for Endpoint"
                    '#microsoft.graph.windowsDeliveryOptimizationConfiguration'                       = "Delivery optimization"
                    '#microsoft.graph.windowsDomainJoinConfiguration'                                 = "Domain join"
                    '#microsoft.graph.windowsHealthMonitoringConfiguration'                           = "Windows health monitoring"
                    '#microsoft.graph.windowsIdentityProtectionConfiguration'                         = "Identity protection"
                    '#microsoft.graph.windowsKioskConfiguration'                                      = "Kiosk"
                    '#microsoft.graph.windowsPhone81CustomConfiguration'                              = "Custom"
                    '#microsoft.graph.windowsPhone81GeneralConfiguration'                             = "Device restrictions"
                    '#microsoft.graph.windowsPhone81ImportedPFXCertificateProfile'                    = "PFX certificate"
                    '#microsoft.graph.windowsPhone81SCEPCertificateProfile'                           = "SCEP certificate"
                    '#microsoft.graph.windowsPhone81TrustedRootCertificate'                           = "Trusted certificate"
                    '#microsoft.graph.windowsPhone81VpnConfiguration'                                 = "VPN"
                    '#microsoft.graph.windowsPhoneEASEmailProfileConfiguration'                       = "Email"
                    '#microsoft.graph.windowsUpdateForBusinessConfiguration'                          = "Update rings for Windows updates"
                    '#microsoft.graph.windowsWifiConfiguration'                                       = "Wi-Fi"
                    '#microsoft.graph.windowsWifiEnterpriseEAPConfiguration'                          = "Wi-Fi"
                    '#microsoft.graph.windowsWiredNetworkConfiguration'                               = "Wired network"
                }
                
                $friendlyName = if ($profileTypeMap.ContainsKey($odataType)) { 
                    $profileTypeMap[$odataType] 
                } else { 
                    $odataType -replace '#microsoft\.graph\.|Configuration$|Profile$', ''
                }
                
                if ($IncludeCount) {
                    Write-Host " • $friendlyName ($count)" -ForegroundColor Cyan
                } else {
                    Write-Host " • $friendlyName" -ForegroundColor Cyan
                }
            }
        }
        
        # Get Settings Catalog policies with pagination
        Write-Host "`nSettings Catalog Policies (Template Display Names):" -ForegroundColor Green
        $allConfigPolicies = @()
        $uri = "https://graph.microsoft.com/beta/deviceManagement/configurationPolicies"
        
        do {
            $configPolicies = Invoke-MgGraphRequest -Method GET -Uri $uri
            if ($configPolicies.value) {
                $allConfigPolicies += $configPolicies.value
            }
            $uri = $configPolicies.'@odata.nextLink'
        } while ($uri)
        
        if ($allConfigPolicies.Count -gt 0) {
            # Show policies with template display names
            $templateNames = $allConfigPolicies | 
                Where-Object { $_.templateReference.templateDisplayName -and $_.templateReference.templateDisplayName.Trim() -ne "" } |
                Group-Object { $_.templateReference.templateDisplayName } | 
                Sort-Object Name
            
            if ($templateNames.Count -gt 0) {
                Write-Host "`n Template-based Policies:" -ForegroundColor Yellow
                foreach ($template in $templateNames) {
                    $templateName = $template.Name
                    $count = $template.Count
                    
                    if ($IncludeCount) {
                        Write-Host " • `"$templateName`" ($count)" -ForegroundColor Magenta
                    } else {
                        Write-Host " • `"$templateName`"" -ForegroundColor Magenta
                    }
                }
            }
            
            # Show policies without template display names (custom Settings Catalog)
            $customPolicies = $allConfigPolicies | 
                Where-Object { -not $_.templateReference.templateDisplayName -or $_.templateReference.templateDisplayName.Trim() -eq "" } |
                Group-Object platforms | 
                Sort-Object Name
            
            if ($customPolicies.Count -gt 0) {
                Write-Host "`n Custom Settings Catalog Policies (by Platform):" -ForegroundColor Yellow
                foreach ($platform in $customPolicies) {
                    $platformName = $platform.Name
                    $count = $platform.Count
                    
                    if ($IncludeCount) {
                        Write-Host " • $platformName ($count)" -ForegroundColor Cyan
                    } else {
                        Write-Host " • $platformName" -ForegroundColor Cyan
                    }
                }
            }
        }   
    }
    catch {
        Write-Error "Failed to retrieve policy types: $($_.Exception.Message)"
    }
}