Public/Invoke-IntuneComplianceAudit.ps1

function Invoke-IntuneComplianceAudit {
    <#
    .SYNOPSIS
        Runs a full Intune compliance audit and generates an HTML dashboard.
    .DESCRIPTION
        Orchestrates all audit functions — device compliance, app inventory, policy assignments,
        and Autopilot status — then compiles results into a single HTML report.
    .PARAMETER OutputPath
        Directory for the HTML report. Defaults to current directory.
    .PARAMETER StaleDays
        Number of days since last check-in before a device is considered stale. Defaults to 30.
    .PARAMETER SkipAutopilot
        Skip Autopilot status check (useful if Autopilot is not in use).
    .EXAMPLE
        Invoke-IntuneComplianceAudit -OutputPath C:\Reports -StaleDays 14
    #>

    [CmdletBinding()]
    param(
        [Parameter()]
        [string]$OutputPath = (Get-Location).Path,

        [Parameter()]
        [ValidateRange(1, 180)]
        [int]$StaleDays = 30,

        [Parameter()]
        [switch]$SkipAutopilot
    )

    begin {
        Test-GraphConnection
        $timestamp = Get-Date -Format 'yyyyMMdd-HHmmss'
        $reportFile = Join-Path $OutputPath "Intune-ComplianceReport-$timestamp.html"
        $sections = @()
    }

    process {
        Write-Host "`n=== Intune Compliance Audit ===" -ForegroundColor Cyan
        Write-Host "Audit started at $(Get-Date -Format 'yyyy-MM-dd HH:mm:ss')`n"

        # --- Device Compliance ---
        Write-Host "[1/4] Auditing device compliance status..." -ForegroundColor Yellow
        $devices = Get-IntuneDeviceComplianceReport -StaleDays $StaleDays
        $sections += @{
            Title   = 'Device Compliance'
            Data    = $devices
            Summary = "$($devices.Count) managed devices evaluated"
        }

        # --- App Inventory ---
        Write-Host "[2/4] Auditing application inventory..." -ForegroundColor Yellow
        $apps = Get-IntuneAppInventory
        $sections += @{
            Title   = 'Application Inventory'
            Data    = $apps
            Summary = "$($apps.Count) managed applications reviewed"
        }

        # --- Policy Assignments ---
        Write-Host "[3/4] Reviewing policy assignments..." -ForegroundColor Yellow
        $policies = Get-IntunePolicyAssignmentReview
        $sections += @{
            Title   = 'Policy Assignment Review'
            Data    = $policies
            Summary = "$($policies.Count) policies reviewed"
        }

        # --- Autopilot ---
        if (-not $SkipAutopilot) {
            Write-Host "[4/4] Checking Autopilot status..." -ForegroundColor Yellow
            $autopilot = Get-IntuneAutopilotStatus
            $sections += @{
                Title   = 'Autopilot Deployment Status'
                Data    = $autopilot
                Summary = "$($autopilot.Count) Autopilot devices reviewed"
            }
        }
        else {
            Write-Host "[4/4] Skipping Autopilot check (SkipAutopilot specified)" -ForegroundColor DarkGray
        }
    }

    end {
        Write-Host "`nGenerating HTML report..." -ForegroundColor Yellow
        New-HtmlDashboard -Sections $sections -OutputFile $reportFile -ReportTitle 'Intune Compliance Audit'

        Write-Host "`n=== Audit Complete ===" -ForegroundColor Green
        Write-Host "Report saved to: $reportFile"
        Write-Host ""

        foreach ($s in $sections) {
            Write-Host " $($s.Title): $($s.Summary)"
        }

        Get-Item $reportFile
    }
}