Rules/INT-004.compliance-per-platform.psd1

@{
    Id          = 'INT-004'
    Title       = 'Every managed platform has an assigned compliance policy'
    Area        = 'IntuneCompliance'
    Severity    = 'Medium'
    References  = @(
        'https://learn.microsoft.com/intune/intune-service/protect/device-compliance-get-started'
    )
    Rationale   = 'A single compliance policy for one platform satisfies "a policy exists" while every other managed platform reports compliant by default - platform-level gaps hide behind tenant-level checks.'
    Remediation = 'Create and assign a compliance policy for each platform that has configuration profiles (Windows, iOS, Android, macOS).'
    Test        = {
        param($Snapshot)
        if ($null -eq $Snapshot.PSObject.Properties['IntuneConfiguration']) {
            return New-TLRuleResult -Status Manual -Evidence 'IntuneConfiguration area not collected - managed platforms cannot be derived.'
        }
        function Get-TLPlatformFromText {
            param([string]$Text)
            switch -Regex ($Text) {
                '(?i)windows' { return 'Windows' }
                '(?i)ios' { return 'iOS' }
                '(?i)android' { return 'Android' }
                '(?i)mac' { return 'macOS' }
            }
            return $null
        }
        $managed = [System.Collections.Generic.List[string]]::new()
        foreach ($configurationProfile in @($Snapshot.IntuneConfiguration.deviceConfigurations)) {
            $platform = Get-TLPlatformFromText -Text ([string]$configurationProfile.'@odata.type')
            if ($platform -and ($managed -notcontains $platform)) { $managed.Add($platform) }
        }
        foreach ($policy in @($Snapshot.IntuneConfiguration.settingsCatalogPolicies)) {
            $platform = Get-TLPlatformFromText -Text ([string]$policy.platforms)
            if ($platform -and ($managed -notcontains $platform)) { $managed.Add($platform) }
        }
        if ($managed.Count -eq 0) {
            return New-TLRuleResult -Status Manual -Evidence 'No configuration profiles found - no managed platforms to correlate.'
        }
        $covered = [System.Collections.Generic.List[string]]::new()
        foreach ($policy in @($Snapshot.IntuneCompliance.policies)) {
            if (@($policy.assignments).Count -eq 0) { continue }
            $platform = Get-TLPlatformFromText -Text ([string]$policy.'@odata.type')
            if ($platform -and ($covered -notcontains $platform)) { $covered.Add($platform) }
        }
        $uncovered = @($managed | Where-Object { $covered -notcontains $_ })
        if ($uncovered.Count -gt 0) {
            New-TLRuleResult -Status Fail -Evidence ("Managed platforms without an assigned compliance policy: {0}." -f ($uncovered -join ', '))
        }
        else {
            New-TLRuleResult -Status Pass -Evidence ("All managed platforms covered: {0}." -f (@($managed) -join ', '))
        }
    }
}