private/tenantinfo/devices/Add-ZTDeviceCompliancePolicies.ps1


<#
.SYNOPSIS
    Add Device compliance policies.
#>


function Add-ZTDeviceCompliancePolicies {

    function Get-DefenderEndPointLabel($advancedThreatProtectionRequiredSecurityLevel) {
        switch ($advancedThreatProtectionRequiredSecurityLevel) {
            'high' {
                return 'High'
            }
            'medium' {
                return 'Medium'
            }
            'low' {
                return 'Low'
            }
            'secured' {
                return 'Clear'
            }
            'unavailable' {
                return ''
            }
            'notSet' {
                return ''
            }
            default {
                return ''
            }
        }
    }

    function Get-DeviceThreatLevelLabel($deviceThreatProtectionRequiredSecurityLevel) {
        switch ($deviceThreatProtectionRequiredSecurityLevel) {
            'high' {
                return 'High'
            }
            'medium' {
                return 'Medium'
            }
            'low' {
                return 'Low'
            }
            'secured' {
                return 'Secured'
            }
            'unavailable' {
                return ''
            }
            'notSet' {
                return ''
            }
            default {
                return ''
            }
        }
    }

    function Get-GracePeriodDays($scheduledActionConfigurations, $actionType){
        $action = @($scheduledActionConfigurations).where{ $_.actionType -eq $actionType }
        if ($action) {
            $gracePeriod = [TimeSpan]::FromHours($action.gracePeriodHours).TotalDays
            $gracePeriodDays = if( $gracePeriod -eq 0) { 'Immediately' } else { $gracePeriod }
            return $gracePeriodDays
        } else {
            return ''
        }
    }

    function Get-PasswordRequiredType($passwordType) {

        switch ($passwordType) {
            'deviceDefault' {
                return 'Device default'
            }
            'alphanumeric' {
                return 'Alphanumeric'
            }
            'numeric' {
                return 'Numeric'
            }
            'alphabetic' {
                return 'Alphabetic'
            }
            'alphanumericWithSymbols' {
                return 'Alphanumeric with symbols'
            }
            'lowSecurityBiometric' {
                return 'Biometric (low security)'
            }
            'customPassword' {
                return 'Custom password'
            }
            'required' {
                return 'Password required'
            }
            'Any' {
                return 'Any'
            }
            default {
                return $passwordType
            }
        }
    }

    function Get-ActionForNoncomplianceDays ($scheduledActionsForRule, $actionType) {
        $action = $scheduledActionsForRule | Where-Object { $_.actionType -eq $actionType }
        if ($action) {
            return $action.daysAfterComplianceGracePeriodEnd
        } else {
            return ''
        }
    }
    function Get-CompliancePolicyView($Policy, $Platform) {
        return [PSCustomObject]@{
            Platform                                   = $Platform
            PolicyName                                 = $Policy.displayName
            DefenderForEndPoint                        = Get-DefenderEndPointLabel $Policy.AdvancedThreatProtectionRequiredSecurityLevel
            MinOsVersion                               = $Policy.OsMinimumVersion
            MaxOsVersion                               = $Policy.OsMaximumVersion
            RequirePswd                                = $Policy.passwordRequired -eq 'true' ? 'Yes' : ''
            MinPswdLength                              = $Policy.PasswordMinimumLength
            PasswordType                               = Get-PasswordRequiredType $Policy.passwordType
            PswdExpiryDays                             = $Policy.PasswordExpirationDays
            CountOfPreviousPswdToBlock                 = $Policy.PasswordPreviousPasswordBlockCount
            RequireEncryption                          = $Policy.storageRequireEncryption -eq 'true' ? 'Yes' : ''
            RootedJailbrokenDevices                    = $Policy.securityBlockJailbrokenDevices -eq 'true' ? 'Blocked' : ''
            MaxDeviceThreatLevel                       = Get-DeviceThreatLevelLabel $Policy.DeviceThreatProtectionRequiredSecurityLevel
            RequireFirewall                            = ''
            MaxInactivityMin                           = $Policy.PasswordMinutesOfInactivityBeforeLock
            ActionForNoncomplianceDaysPushNotification  = Get-GracePeriodDays -scheduledActionConfigurations $Policy.scheduledActionsForRule.scheduledActionConfigurations -actionType 'pushNotification'
            ActionForNoncomplianceDaysSendEmail        = Get-GracePeriodDays -scheduledActionConfigurations $Policy.scheduledActionsForRule.scheduledActionConfigurations -actionType 'notification'
            ActionForNoncomplianceDaysRemoteLock       = Get-GracePeriodDays -scheduledActionConfigurations $Policy.scheduledActionsForRule.scheduledActionConfigurations -actionType 'remoteLock'
            ActionForNoncomplianceDaysBlock            = Get-GracePeriodDays -scheduledActionConfigurations $Policy.scheduledActionsForRule.scheduledActionConfigurations -actionType 'block'
            ActionForNoncomplianceDaysRetire           = Get-GracePeriodDays -scheduledActionConfigurations $Policy.scheduledActionsForRule.scheduledActionConfigurations -actionType 'retire'
            Scope                                      = Get-ZtRoleScopeTag $Policy.roleScopeTagIds
            IncludedGroups                             = ''
            ExcludedGroups                             = ''
        }
    }

    $activity = "Getting Device compliance policies"
    Write-ZtProgress -Activity $activity -Status "Processing"

    $compliancePolicies = Invoke-ZtGraphRequest -RelativeUri 'deviceManagement/deviceCompliancePolicies' -QueryParameters @{ '$expand' = 'assignments,scheduledActionsForRule($expand=scheduledActionConfigurations)' } -ApiVersion 'beta'

    #$linuxCompliancePolicies = Invoke-ZtGraphRequest -RelativeUri 'deviceManagement/deviceCompliancePolicies' -QueryParameters @{ '$expand' = 'assignments,scheduledActionsForRule($expand=scheduledActionConfigurations)' } -ApiVersion 'beta'

    # Create the table data structure
    $tableData = @()
    foreach ($policy in $compliancePolicies) {

        switch ($policy.'@odata.type') {
            '#microsoft.graph.androidCompliancePolicy' {
                $policyView = Get-CompliancePolicyView -Policy $policy -Platform 'Android device administrator'
                $policyView.RequireFirewall = 'Not Applicable'
            }
            '#microsoft.graph.androidDeviceOwnerCompliancePolicy' {
                $policyView = Get-CompliancePolicyView -Policy $policy -Platform 'Android Enterprise (Corp)'
                $policyView.RequireFirewall = 'Not Applicable'
            }
            '#microsoft.graph.androidWorkProfileCompliancePolicy' {
                $policyView = Get-CompliancePolicyView -Policy $policy -Platform 'Android Enterprise (Personal)'
                $policyView.RequireFirewall = 'Not Applicable'

            }
            '#microsoft.graph.aospDeviceOwnerCompliancePolicy' {
                $policyView = Get-CompliancePolicyView -Policy $policy -Platform 'Android (AOSP)'
                $policyView.DefenderForEndPoint = 'Not Applicable'
                $policyView.PswdExpiryDays = 'Not Applicable'
                $policyView.CountOfPreviousPswdToBlock = 'Not Applicable'
                $policyView.MaxDeviceThreatLevel = 'Not Applicable'
                $policyView.RequireFirewall = 'Not Applicable'
            }
            '#microsoft.graph.iosCompliancePolicy' {
                $policyView = Get-CompliancePolicyView -Policy $policy -Platform 'iOS/iPadOS'
                $policyView.RequireFirewall = 'Not Applicable'
                $policyView.RequirePswd = $policy.PasscodeRequired
                $policyView.MinPswdLength = $policy.PasscodeMinimumLength
                $policyView.PswdExpiryDays = $policy.PasscodeExpirationDays
                $policyView.MaxInactivityMin = $policy.PasscodeMinutesOfInactivityBeforeLock
                $policyView.CountOfPreviousPswdToBlock = $policy.PasscodePreviousPasscodeBlockCount
                $policyView.PasswordType = Get-PasswordRequiredType $Policy.PasscodeRequiredType
                $policyView.RequireEncryption = 'Not Applicable'
            }
            '#microsoft.graph.macOSCompliancePolicy' {
                $policyView = Get-CompliancePolicyView -Policy $policy -Platform 'macOS'
                $policyView.RootedJailbrokenDevices = 'Not Applicable'
                $policyView.RequireFirewall = $policy.FirewallEnabled -eq 'true' ? 'Yes' : ''
            }
            '#microsoft.graph.windows10CompliancePolicy' {
                $policyView = Get-CompliancePolicyView -Policy $policy -Platform 'Windows 10 and later'
                $policyView.DefenderForEndPoint = Get-DefenderEndPointLabel $Policy.DeviceThreatProtectionRequiredSecurityLevel
                $policyView.RequireFirewall = $policy.ActiveFirewallRequired -eq 'true' ? 'Yes' : ''
                $policyView.MaxDeviceThreatLevel = 'Not Applicable'
                $policyView.RootedJailbrokenDevices = 'Not Applicable'



            }
            '#microsoft.graph.windows81CompliancePolicy' {
                $policyView = Get-CompliancePolicyView -Policy $policy -Platform 'Windows 8.1 and later'
                $policyView.DefenderForEndPoint = 'Not Applicable'
                $policyView.MaxDeviceThreatLevel = 'Not Applicable'
                $policyView.RootedJailbrokenDevices = 'Not Applicable'
                $policyView.RequireFirewall = 'Not Applicable'
            }
            default {
                $typeName = $policy.'@odata.type' -replace '#microsoft.graph.', ''
                $policyView = Get-CompliancePolicyView -Policy $policy -Platform $typeName
            }

            # foreach($policy in $linuxCompliancePolicies){
            # $tableData += Get-LinuxCompliancePolicy -Policy $policy
            # }


        }
        $tableData += $policyView
    }


    Add-ZtTenantInfo -Name "ConfigDeviceCompliancePolicies" -Value $tableData

    Write-ZtProgress -Activity $activity -Status "Completed"
}