Public/Get-EntraComplianceReport.ps1

function Get-EntraComplianceReport {
    <#
    .SYNOPSIS
        Runs selected compliance checks and returns an aggregated report object.
    .PARAMETER RulesPath
        Optional path to a custom compliance-rules.yaml file.
    .PARAMETER CheckNames
        One or more check categories to run. Defaults to 'All'.
        Valid values: SecurityDefaults, ConditionalAccess, MFAPolicy, PasswordPolicy, All
    .OUTPUTS
        PSCustomObject (type name: EntraComplianceAuditor.ComplianceReport)
    .EXAMPLE
        Get-EntraComplianceReport
    .EXAMPLE
        Get-EntraComplianceReport -CheckNames SecurityDefaults, ConditionalAccess
    #>

    [CmdletBinding()]
    [OutputType([PSCustomObject])]
    param (
        [string]$RulesPath,

        [ValidateSet('SecurityDefaults', 'ConditionalAccess', 'MFAPolicy', 'PasswordPolicy', 'All')]
        [string[]]$CheckNames = @('All')
    )

    $rulesParams = @{}
    if ($RulesPath) { $rulesParams['RulesPath'] = $RulesPath }
    $rules = Get-ComplianceRules @rulesParams

    $allResults = [System.Collections.Generic.List[PSCustomObject]]::new()
    $runAll     = $CheckNames -contains 'All'

    if ($runAll -or $CheckNames -contains 'SecurityDefaults') {
        $allResults.Add((Test-EntraSecurityDefaults -Rules $rules))
    }

    if ($runAll -or $CheckNames -contains 'ConditionalAccess') {
        Test-EntraConditionalAccess -Rules $rules | ForEach-Object { $allResults.Add($_) }
    }

    if ($runAll -or $CheckNames -contains 'MFAPolicy') {
        Test-EntraMFAPolicy -Rules $rules | ForEach-Object { $allResults.Add($_) }
    }

    if ($runAll -or $CheckNames -contains 'PasswordPolicy') {
        Test-EntraPasswordPolicy -Rules $rules | ForEach-Object { $allResults.Add($_) }
    }

    $passCount    = @($allResults | Where-Object { $_.Status -eq 'Pass'    }).Count
    $failCount    = @($allResults | Where-Object { $_.Status -eq 'Fail'    }).Count
    $warningCount = @($allResults | Where-Object { $_.Status -eq 'Warning' }).Count
    $errorCount   = @($allResults | Where-Object { $_.Status -eq 'Error'   }).Count
    $totalCount   = $allResults.Count

    $complianceScore = if ($totalCount -gt 0) {
        [math]::Round(($passCount / $totalCount) * 100, 1)
    } else { 0 }

    $tenantId = try { (Get-MgContext).TenantId } catch { 'Unknown' }

    [PSCustomObject]@{
        PSTypeName      = 'EntraComplianceAuditor.ComplianceReport'
        GeneratedAt     = (Get-Date -Format 'o')
        TenantId        = $tenantId
        ComplianceScore = $complianceScore
        Summary         = [PSCustomObject]@{
            Total   = $totalCount
            Pass    = $passCount
            Fail    = $failCount
            Warning = $warningCount
            Error   = $errorCount
        }
        Results         = $allResults.ToArray()
    }
}