Public/Report/Get-SPCPermissionHealthScore.ps1

function Get-SPCPermissionHealthScore {
    <#
    .SYNOPSIS
        Calculates the Permission Health Score for the tenant.
 
    .DESCRIPTION
        This cmdlet calculates a permission health score from 0 to 100 based on quantified risks.
        It deducts points for orphaned users, high-risk guests, over-permissioned users,
        broken inheritance, and missing site owners.
 
    .PARAMETER OrphanedUserCount
        The number of orphaned users detected.
     
    .PARAMETER HighRiskGuestCount
        The number of high-risk guests detected.
 
    .PARAMETER OverPermissionedUserCount
        The number of over-permissioned users (EAS > 100).
 
    .PARAMETER BrokenInheritanceSiteCount
        The number of sites with more than 1000 broken inheritance scopes.
 
    .PARAMETER MissingOwnerSiteCount
        The number of sites missing an owner or with an inactive owner.
 
    .EXAMPLE
        Get-SPCPermissionHealthScore -OrphanedUserCount 10 -HighRiskGuestCount 5 -OverPermissionedUserCount 2 -BrokenInheritanceSiteCount 0 -MissingOwnerSiteCount 1
    #>

    [CmdletBinding()]
    [OutputType([PSCustomObject])]
    param (
        [Parameter(Mandatory=$true)]
        [int]$OrphanedUserCount,

        [Parameter(Mandatory=$true)]
        [int]$HighRiskGuestCount,

        [Parameter(Mandatory=$true)]
        [int]$OverPermissionedUserCount,

        [Parameter(Mandatory=$true)]
        [int]$BrokenInheritanceSiteCount,

        [Parameter(Mandatory=$true)]
        [int]$MissingOwnerSiteCount
    )

    begin {
        Write-Verbose "Entering Get-SPCPermissionHealthScore"
        try {
            Test-SPCConnection -ErrorAction Stop
        } catch {
            throw "ERR-001: Connection not found. Please connect using Connect-SPCTenant first."
        }
    }

    process {
        Write-Verbose "Calculating score with inputs: Orphans=$OrphanedUserCount, Guests=$HighRiskGuestCount, OverPerm=$OverPermissionedUserCount, BrokenSites=$BrokenInheritanceSiteCount, MissingOwner=$MissingOwnerSiteCount"
        
        $scoreResult = Calculate-SPCScoreInternal -OrphanedUserCount $OrphanedUserCount -HighRiskGuestCount $HighRiskGuestCount -OverPermissionedUserCount $OverPermissionedUserCount -BrokenInheritanceSiteCount $BrokenInheritanceSiteCount -MissingOwnerSiteCount $MissingOwnerSiteCount
        
        Write-Information "Health score calculation completed successfully. Overall Score: $($scoreResult.OverallScore)"
        return $scoreResult
    }

    end {
        Write-Verbose "Health score calculation completed."
    }
}