config/Baseline/PolicyTypeSettings.ps1

New-Variable -Name PolicyTypeSettings -Value @(
    @{
        Type            = "Groups"
        Name            = "Groups"
        Description     = "Add Groups to the tenant required for exclusion policies."
        NameProperty    = "displayName"
        CheckExists     = $true
        Selectable      = $false
        GetCommand      = { Get-MgGroup -All }
        AddCommand      = {
            param($Body)
            $BodyWithoutMembers = $Body | Select-Object -Property * -ExcludeProperty members | ConvertTo-Json -Depth 100
            New-MgGroup -Body $BodyWithoutMembers
        }
        AssignCommand   = {
            param($OriginalPolicy, $NewPolicy)
            foreach ($Member in $OriginalPolicy.members) {
                New-MgGroupMember -GroupId $NewPolicy.id -DirectoryObjectId $Member -ErrorAction SilentlyContinue
            }
        }
        PolicyFilesPath = "$script:ModuleRoot\Public\Configuration\Baseline\Groups"
    },
    @{
        Type            = "NamedLocations"
        Name            = "Named Locations"
        Description     = "Add named locations to the tenant for Conditional Access policies."
        NameProperty    = "displayName"
        CheckExists     = $true
        Selectable      = $true
        GetCommand      = { Get-MgIdentityConditionalAccessNamedLocation -All }
        AddCommand      = { param($Body)
            New-MgIdentityConditionalAccessNamedLocation -Body $Body
        }
        PolicyFilesPath = "$script:ModuleRoot\Public\Configuration\Baseline\NamedLocations"
    },
    @{
        Type            = "ConditionalAccessPolicies"
        Name            = "Conditional Access Policies"
        Description     = "Add conditional access policies to the tenant."
        NameProperty    = "displayName"
        CheckExists     = $true
        Selectable      = $true
        GetCommand      = { Get-MgIdentityConditionalAccessPolicy -All }
        AddCommand      = { param($Body)
            $SecurityDefaults = Get-MgPolicyIdentitySecurityDefaultEnforcementPolicy -ErrorAction Stop
            if($SecurityDefaults.IsEnabled) {
                Update-MgPolicyIdentitySecurityDefaultEnforcementPolicy -IsEnabled:$false -ErrorAction Stop | Out-Null
                Write-Host "Security Defaults has been successfully disabled!" -ForegroundColor Green
            }
            $BodyWithoutDescription = $Body | Select-Object -Property * -ExcludeProperty description | ConvertTo-Json -Depth 100
            New-MgIdentityConditionalAccessPolicy -Body $BodyWithoutDescription
        }
        PolicyFilesPath = "$script:ModuleRoot\Public\Configuration\Baseline\ConditionalAccessPolicies"
    },
    @{
        Type            = "iOSAppProtectionPolicies"
        Name            = "iOS App Protection Policies"
        Description     = "Add iOS app protection policies to the tenant."
        NameProperty    = "displayName"
        CheckExists     = $true
        Selectable      = $true
        GetCommand      = { Get-MgDeviceAppManagementiOSManagedAppProtection -All }
        AddCommand      = {
            param($Body)
            Invoke-MgGraphRequest -Method POST -Uri 'https://graph.microsoft.com/beta/deviceAppmanagement/iosManagedAppProtections' -Body $Body
        }
        PolicyFilesPath = "$script:ModuleRoot\Public\Configuration\Baseline\iOSAppProtectionPolicies"
    },
    @{
        Type            = "AndroidAppProtectionPolicies"
        Name            = "Android App Protection Policies"
        Description     = "Add Android app protection policies to the tenant."
        NameProperty    = "displayName"
        CheckExists     = $true
        Selectable      = $true
        GetCommand      = { Get-MgDeviceAppManagementAndroidManagedAppProtection -All }
        AddCommand      = {
            param($Body)
            Invoke-MgGraphRequest -Method POST -Uri 'https://graph.microsoft.com/beta/deviceAppmanagement/androidManagedAppProtections' -Body $Body
        }
        PolicyFilesPath = "$script:ModuleRoot\Public\Configuration\Baseline\AndroidAppProtectionPolicies"
    },
    @{
        Type            = "CompliancePolicies"
        Name            = "Compliance Policies"
        Description     = "Add device compliance policies to the tenant."
        NameProperty    = "displayName"
        CheckExists     = $true
        Selectable      = $true
        GetCommand      = { Invoke-MgGraphRequest -Method GET -Uri 'https://graph.microsoft.com/beta/deviceManagement/deviceCompliancePolicies' | Select-Object -ExpandProperty value }
        AddCommand      = {
            param($Body)
            Invoke-MgGraphRequest -Method POST -Uri 'https://graph.microsoft.com/beta/deviceManagement/deviceCompliancePolicies' -Body $Body
        }
        AssignCommand   = {
            param($OriginalPolicy, $NewPolicy)
            Invoke-MgGraphRequest -METHOD POST -Uri "https://graph.microsoft.com/beta/deviceManagement/deviceCompliancePolicies/$($NewPolicy.id)/assign" -Body @{
                assignments = $OriginalPolicy.assignments
            }
        }
        PolicyFilesPath = "$script:ModuleRoot\Public\Configuration\Baseline\CompliancePolicies"
    },
    @{
        Type            = "ConfigurationPolicies"
        Name            = "Configuration Policies"
        Description     = "Add device configuration policies to the tenant."
        NameProperty    = "name"
        CheckExists     = $true
        Selectable      = $true
        GetCommand      = { Invoke-MgGraphRequest -Method GET -Uri 'https://graph.microsoft.com/beta/deviceManagement/configurationPolicies?$filter=%28platforms%20eq%20%27windows10%27%20or%20platforms%20eq%20%27macOS%27%20or%20platforms%20eq%20%27iOS%27%29%20and%20%28technologies%20has%20%27mdm%27%20or%20technologies%20has%20%27windows10XManagement%27%20or%20technologies%20has%20%27appleRemoteManagement%27%29' | Select-Object -ExpandProperty value }
        AddCommand      = {
            param($Body)
            if($Body.templateId) {
                #$BodyWithoutTemplateId = $Body | Select-Object -Property * -ExcludeProperty templateId
                Invoke-MgGraphRequest -Method POST -Uri "https://graph.microsoft.com/beta/deviceManagement/templates/$($Body.templateId)/createInstance" -Body $Body
            } elseif($Body."@odata.type" -eq "#microsoft.graph.windows10CustomConfiguration" -or $Body."@odata.type" -eq "#microsoft.graph.windowsIdentityProtectionConfiguration") {
                Invoke-MgGraphRequest -Method POST -Uri 'https://graph.microsoft.com/beta/deviceManagement/deviceConfigurations' -Body $Body
            }
            else {
                Invoke-MgGraphRequest -Method POST -Uri 'https://graph.microsoft.com/beta/deviceManagement/configurationPolicies' -Body $Body
            }
        }
        AssignCommand   = {
            param($OriginalPolicy, $NewPolicy)
            if($OriginalPolicy.templateId) {
                $OriginalPolicy = Invoke-MgGraphRequest -Method POST -Uri "https://graph.microsoft.com/beta/deviceManagement/intents/$($NewPolicy.id)/assign" -Body @{
                    assignments = $OriginalPolicy.assignments
                }
            } elseif($Body."@odata.type" -eq "#microsoft.graph.windows10CustomConfiguration" -or $Body."@odata.type" -eq "#microsoft.graph.windowsIdentityProtectionConfiguration") {
                Invoke-MgGraphRequest -METHOD POST -Uri "https://graph.microsoft.com/beta/deviceManagement/deviceConfigurations/$($NewPolicy.id)/assign" -Body @{
                    assignments = $OriginalPolicy.assignments
                }
            }
            else {
                Invoke-MgGraphRequest -METHOD POST -Uri "https://graph.microsoft.com/beta/deviceManagement/configurationPolicies/$($NewPolicy.id)/assign" -Body @{
                    assignments = $OriginalPolicy.assignments
                }
            }
        }
        PolicyFilesPath = "$script:ModuleRoot\Public\Configuration\Baseline\ConfigurationPolicies"
    },
    @{
        Type            = "AuthenticationMethodPolicy"
        Name            = "Authentication Method Policy"
        Description     = "Add authentication method policies to the tenant."
        NameProperty    = "displayName"
        CheckExists     = $false
        Selectable      = $false
        GetCommand      = { Get-MgPolicyAuthenticationMethodPolicy }
        AddCommand      = {
            param($Body)
            Update-MgPolicyAuthenticationMethodPolicy -Body $Body
        }
        PolicyFilesPath = "$script:ModuleRoot\Public\Configuration\Baseline\AuthenticationMethodsPolicy"
    },
    @{
        Type            = "AuthorizationPolicy"
        Name            = "Authorization Policy"
        Description     = "Add Authorization Policy to the tenant. (Disallows users to accept untrusted OAUTH2 apps)"
        NameProperty    = "displayName"
        CheckExists     = $false
        Selectable      = $false
        GetCommand      = { Get-MgPolicyAuthorizationPolicy }
        AddCommand      = {
            param($Body)
            Update-MgPolicyAuthorizationPolicy -Body $Body
        }
        PolicyFilesPath = "$script:ModuleRoot\Public\Configuration\Baseline\AuthorizationPolicy"
    },
    @{
        Type            = "DeviceRegistrationPolicy"
        Name            = "Device Registration Policy"
        Description     = "Add Device Registration Policy to the tenant. (Allows all users to Intune join devices)"
        NameProperty    = "displayName"
        CheckExists     = $false
        Selectable      = $false
        GetCommand      = { Get-MgPolicyDeviceRegistrationPolicy }
        AddCommand      = {
            param($Body)
            Invoke-GraphRequest -Method PUT -Uri 'https://graph.microsoft.com/beta/policies/deviceRegistrationPolicy' -Body $Body
        }
        PolicyFilesPath = "$script:ModuleRoot\Public\Configuration\Baseline\DeviceRegistrationPolicy"
    },
    @{
        Type            = "MobileDeviceManagementPolicy"
        Name            = "Mobile Device Management Policy"
        Description     = "Add Mobile Device Management Policy to the tenant. (Sets the MDM authority to Intune)"
        NameProperty    = "displayName"
        CheckExists     = $false
        Selectable      = $false
        GetCommand      = { Invoke-MgGraphRequest -Method GET -Uri "https://graph.microsoft.com/beta/policies/mobileDeviceManagementPolicies/0000000a-0000-0000-c000-000000000000" }
        AddCommand      = {
            param($Body)
            Invoke-GraphRequest -Method PATCH -Uri "https://graph.microsoft.com/beta/policies/mobileDeviceManagementPolicies/0000000a-0000-0000-c000-000000000000" -Body @{
                assignments = $OriginalPolicy.assignments
            }
        }
        PolicyFilesPath = "$script:ModuleRoot\Public\Configuration\Baseline\MobileDeviceManagementPolicy"
    },
    @{
        Type            = "DeviceEnrollmentConfigurations"
        Name            = "Device Enrollment Configurations"
        Description     = "Add Device Enrollment Configurations to the tenant. (Enrollment Status Page, Windows Hello for Business enrollment)"
        NameProperty    = "displayName"
        CheckExists     = $true
        Selectable      = $true
        GetCommand      = { Invoke-MgGraphRequest -Method GET -Uri "https://graph.microsoft.com/beta/deviceManagement/deviceEnrollmentConfigurations" }
        AddCommand      = {
            param($Body)
            switch ($Body["@odata.type"]) {
                "#microsoft.graph.deviceEnrollmentWindowsHelloForBusinessConfiguration" {
                    $Id = ((Invoke-MgGraphRequest -Method GET -Uri "https://graph.microsoft.com/beta/deviceManagement/deviceEnrollmentConfigurations").value | Where-Object { $_.Id -like "*_DefaultWindowsHelloForBusiness" }).Id
                    Update-MgDeviceManagementDeviceEnrollmentConfiguration -DeviceEnrollmentConfigurationId $Id -Body $Body
                }
                "#microsoft.graph.windows10EnrollmentCompletionPageConfiguration" {
                    Invoke-MgGraphRequest -Method POST -Uri "https://graph.microsoft.com/beta/deviceManagement/deviceEnrollmentConfigurations" -Body $Body
                }
                "#microsoft.graph.azureADWindowsAutopilotDeploymentProfile" {
                    Invoke-MgGraphRequest -Method POST -Uri "https://graph.microsoft.com/beta/deviceManagement/windowsAutopilotDeploymentProfiles" -Body $Body
                }
            }
        }
        AssignCommand   = {
            param($OriginalPolicy, $NewPolicy)
            switch ($OriginalPolicy["@odata.type"]) {
                "#microsoft.graph.deviceEnrollmentWindowsHelloForBusinessConfiguration" {
                    $AzureADSP = Get-MgServicePrincipal -Filter "appId eq '00000002-0000-0000-c000-000000000000'"
                    $PINResetServicePrincipal = Get-MgServicePrincipal -Filter "displayName eq 'Microsoft Pin Reset Service Production'"
                    if (!$PINResetServicePrincipal) {
                        $PINResetServicePrincipal = New-MgServicePrincipal -AccountEnabled:$true -AppId "b8456c59-1230-44c7-a4a2-99b085333e84" -DisplayName "Microsoft Pin Reset Service Production" -Homepage "https://cred.microsoft.com"
                    }
                    $PINResetServicePermissionGrantEntraID = Get-MgOauth2PermissionGrant -Filter "clientId eq '$($PINResetServicePrincipal.Id)'"
                    if (!$PINResetServicePermissionGrantEntraID) {
                        $PINResetServicePermissionGrantEntraID = New-MgOauth2PermissionGrant -ClientId $PINResetServicePrincipal.Id -ConsentType "AllPrincipals" -Scope "User.Read Directory.Read.All" -ResourceId $AzureADSP.Id
                    }
                    $PINResetClientServicePrincipal = Get-MgServicePrincipal -Filter "displayName eq 'Microsoft Pin Reset Client Production'"
                    if (!$PINResetClientServicePrincipal) {
                        $PINResetClientServicePrincipal = New-MgServicePrincipal -AccountEnabled:$true -Appid "9115dd05-fad5-4f9c-acc7-305d08b1b04e" -DisplayName "Microsoft Pin Reset Client Production"
                    }
                    $PINResetClientPermissionGrantEntraID = Get-MgOauth2PermissionGrant -Filter "clientId eq '$($PINResetClientServicePrincipal.Id)' and resourceId eq '$($AzureADSP.Id)'"
                    if (!$PINResetClientPermissionGrantEntraID) {
                        $PINResetClientPermissionGrantEntraID = New-MgOauth2PermissionGrant -ClientId $PINResetClientServicePrincipal.Id -ConsentType "AllPrincipals" -Scope "User.Read" -ResourceId $AzureADSP.Id
                    }
                    $PINResetClientPermissionGrantResetService = Get-MgOauth2PermissionGrant -Filter "clientId eq '$($PINResetClientServicePrincipal.Id)' and resourceId eq '$($PINResetServicePrincipal.Id)'"
                    if (!$PINResetClientPermissionGrantResetService) {
                        $PINResetClientPermissionGrantResetService = New-MgOauth2PermissionGrant -ClientId $PINResetClientServicePrincipal.Id -ConsentType "AllPrincipals" -Scope "user_impersonation" -ResourceId $PINResetServicePrincipal.Id
                    }
                    Write-Host "Windows Hello for Business PIN Reset configuration created and assigned."
                }
                "#microsoft.graph.windows10EnrollmentCompletionPageConfiguration" {
                    Invoke-MgGraphRequest -Method POST -Uri "https://graph.microsoft.com/beta/deviceManagement/deviceEnrollmentConfigurations/$($NewPolicy.id)/assign" -Body @{
                        enrollmentConfigurationAssignments = $OriginalPolicy.enrollmentConfigurationAssignments
                    }
                }
                "#microsoft.graph.azureADWindowsAutopilotDeploymentProfile" {
                    Invoke-MgGraphRequest -Method POST -Uri "https://graph.microsoft.com/beta/deviceManagement/windowsAutopilotDeploymentProfiles/$($NewPolicy.id)/assignments"-Body @{
                        target = $OriginalPolicy.enrollmentConfigurationAssignments.target
                    } | Out-Null
                }
            }
        }
        PolicyFilesPath = "$script:ModuleRoot\Public\Configuration\Baseline\DeviceEnrollmentConfigurations"
    },
    @{
        Type            = "WindowsAutopilotDeploymentProfiles"
        Name            = "Windows Autopilot Profiles"
        Description     = "Add Windows Autopilot Profiles to the tenant."
        NameProperty    = "displayName"
        CheckExists     = $true
        Selectable      = $true
        GetCommand      = { Invoke-MgGraphRequest -Method GET -Uri "https://graph.microsoft.com/beta/deviceManagement/windowsAutopilotDeploymentProfiles" }
        AddCommand      = {
            param($Body)
            Invoke-MgGraphRequest -Method POST -Uri "https://graph.microsoft.com/beta/deviceManagement/windowsAutopilotDeploymentProfiles" -Body $Body
        }
        AssignCommand   = {
            param($OriginalPolicy, $NewPolicy)
            Invoke-MgGraphRequest -Method POST -Uri "https://graph.microsoft.com/beta/deviceManagement/windowsAutopilotDeploymentProfiles/$($NewPolicy.id)/assignments"-Body @{
                target = $OriginalPolicy.enrollmentConfigurationAssignments.target
            } | Out-Null
        }
        PolicyFilesPath = "$script:ModuleRoot\Public\Configuration\Baseline\WindowsAutopilotDeploymentProfiles"
    },
    @{
        Type            = "WindowsUpdateForBusinessConfigurations"
        Name            = "Windows Update For Business Configurations"
        Description     = "Add Windows Update For Business Configurations to the tenant."
        NameProperty    = "displayName"
        CheckExists     = $true
        Selectable      = $true
        GetCommand      = { Invoke-MgGraphRequest -Method GET -Uri "https://graph.microsoft.com/beta/deviceManagement/deviceConfigurations" | Select-Object -ExpandProperty value }
        AddCommand      = {
            param($Body)
            Invoke-MgGraphRequest -Method POST -Uri 'https://graph.microsoft.com/beta/deviceManagement/deviceConfigurations' -Body $Body
        }
        AssignCommand   = {
            param($OriginalPolicy, $NewPolicy)
            Invoke-MgGraphRequest -METHOD POST -Uri "https://graph.microsoft.com/beta/deviceManagement/deviceConfigurations/$($NewPolicy.id)/assign" -Body @{
                assignments = $OriginalPolicy.assignments
            }
        }
        PolicyFilesPath = "$script:ModuleRoot\Public\Configuration\Baseline\WindowsUpdateForBusinessConfigurations"
    },
    @{
        Type            = "MobileThreatDefenseConnector"
        Name            = "Mobile Threat Defense Connector"
        Description     = "Add Mobile Threat Defense Connector (For enabling Intune management of Defender for Endpoint devices)."
        NameProperty    = "id"
        CheckExists     = $false
        Selectable      = $false
        GetCommand      = { Invoke-GraphRequest -Method GET -Uri "https://graph.microsoft.com/beta/deviceManagement/mobileThreatDefenseConnectors" | Select-Object -ExpandProperty value }
        AddCommand      = {
            param($Body)
            Invoke-GraphRequest -Method PATCH -Uri "https://graph.microsoft.com/beta/deviceManagement/mobileThreatDefenseConnectors/$($Body.id)" -Body $Body
        }
        PolicyFilesPath = "$script:ModuleRoot\Public\Configuration\Baseline\MobileThreatDefenseConnector"
    },
    @{
        Type            = "MobileApps"
        Name            = "Mobile Apps"
        Description     = "Add Mobile Apps to the tenant. (Currently only Microsoft 365 Apps)"
        NameProperty    = "displayName"
        CheckExists     = $true
        Selectable      = $true
        GetCommand      = { Invoke-MgGraphRequest -Method GET -Uri 'https://graph.microsoft.com/beta/deviceAppManagement/mobileApps?$filter=(isof(%27microsoft.graph.win32CatalogApp%27)%20or%20isof(%27microsoft.graph.windowsStoreApp%27)%20or%20isof(%27microsoft.graph.microsoftStoreForBusinessApp%27)%20or%20isof(%27microsoft.graph.officeSuiteApp%27)%20or%20(isof(%27microsoft.graph.win32LobApp%27)%20and%20not(isof(%27microsoft.graph.win32CatalogApp%27)))%20or%20isof(%27microsoft.graph.windowsMicrosoftEdgeApp%27)%20or%20isof(%27microsoft.graph.windowsPhone81AppX%27)%20or%20isof(%27microsoft.graph.windowsPhone81StoreApp%27)%20or%20isof(%27microsoft.graph.windowsPhoneXAP%27)%20or%20isof(%27microsoft.graph.windowsAppX%27)%20or%20isof(%27microsoft.graph.windowsMobileMSI%27)%20or%20isof(%27microsoft.graph.windowsUniversalAppX%27)%20or%20isof(%27microsoft.graph.webApp%27)%20or%20isof(%27microsoft.graph.windowsWebApp%27)%20or%20isof(%27microsoft.graph.winGetApp%27))%20and%20(microsoft.graph.managedApp/appAvailability%20eq%20null%20or%20microsoft.graph.managedApp/appAvailability%20eq%20%27lineOfBusiness%27%20or%20isAssigned%20eq%20true)&$orderby=displayName&' | Select-Object -ExpandProperty value }
        AddCommand      = {
            param($Body)
            Invoke-MgGraphRequest -Method POST -Uri 'https://graph.microsoft.com/beta/deviceAppManagement/mobileApps' -Body $Body
        }
        AssignCommand   = {
            param($OriginalPolicy, $NewPolicy)
            Invoke-MgGraphRequest -METHOD POST -Uri "https://graph.microsoft.com/beta/deviceAppManagement/mobileApps/$($NewPolicy.id)/assign" -Body @{
                mobileAppAssignments = $OriginalPolicy.mobileAppAssignments
            }
        }
        PolicyFilesPath = "$script:ModuleRoot\Public\Configuration\Baseline\MobileApps"
    },
    @{
        Type            = "ExchangeOnlineProtectionPolicies"
        Name            = "Exchange Online Protection Policies"
        Description     = "Adds the baseline Exchange Online Protection Policies to the tenant. (Quarantine Reports, Safe Links, Safe Attachments, Anti-Phishing)"
        NameProperty    = "displayName"
        CheckExists     = $false
        Selectable      = $false
        GetCommand      = {  }
        AddCommand      = {
            param($Body)
        }
        AssignCommand   = {
            param($OriginalPolicy, $NewPolicy)
        }
        PolicyFilesPath = "$script:ModuleRoot\Public\Configuration\Baseline\EOPPolicies"
    }
) -Scope Script -Force