modules/Devolutions.CIEM.EffectivePermissions/Public/Get-CIEMEffectivePermission.ps1

function Get-CIEMEffectivePermission {
    [CmdletBinding()]
    [OutputType([CIEMEffectivePermission[]])]
    param(
        [Parameter()]
        [CIEMEffectivePermissionProvider[]]$Provider,

        [Parameter()]
        [string]$PrincipalId,

        [Parameter()]
        [CIEMPrincipalType[]]$PrincipalType,

        [Parameter()]
        [string]$ResourceId,

        [Parameter()]
        [string]$ResourceType,

        [Parameter()]
        [CIEMAccessLevel[]]$AccessLevel,

        [Parameter()]
        [CIEMEntitlementType[]]$EntitlementType,

        [Parameter()]
        [switch]$PrivilegedOnly,

        [Parameter()]
        [bool]$IncludeInherited = $true,

        [Parameter()]
        [switch]$IncludeDenied,

        [Parameter()]
        [switch]$IncludeRaw
    )

    $ErrorActionPreference = 'Stop'

    $selectedProviders = if ($Provider) {
        @($Provider)
    } else {
        @([CIEMEffectivePermissionProvider]::Azure)
    }

    $results = [System.Collections.Generic.List[object]]::new()

    foreach ($providerName in $selectedProviders) {
        switch ($providerName) {
            ([CIEMEffectivePermissionProvider]::Azure) {
                $results.AddRange(@(ResolveCIEMAzureEffectivePermission -IncludeInherited:$IncludeInherited))
            }
            ([CIEMEffectivePermissionProvider]::AWS) {
                $results.AddRange(@(ResolveCIEMAwsEffectivePermission))
            }
            default {
                throw "Provider '$providerName' is not supported by Get-CIEMEffectivePermission."
            }
        }
    }

    $filtered = @($results)

    if ($PrincipalId) {
        $filtered = @($filtered | Where-Object { $_.Principal.Id -eq $PrincipalId })
    }
    if ($PrincipalType) {
        $filtered = @($filtered | Where-Object { $_.Principal.Type -in $PrincipalType })
    }
    if ($ResourceId) {
        $filtered = @($filtered | Where-Object { $_.Target.Id -eq $ResourceId })
    }
    if ($ResourceType) {
        $filtered = @($filtered | Where-Object { $_.Target.Type -eq $ResourceType })
    }
    if ($AccessLevel) {
        $filtered = @($filtered | Where-Object {
            @($_.Actions | Where-Object { $_.AccessLevel -in $AccessLevel }).Count -gt 0
        })
    }
    if ($EntitlementType) {
        $filtered = @($filtered | Where-Object { $_.Entitlement.Type -in $EntitlementType })
    }
    if ($PrivilegedOnly) {
        $filtered = @($filtered | Where-Object { $_.Privileged })
    }
    if (-not $IncludeDenied) {
        $filtered = @($filtered | Where-Object {
            @($_.Actions | Where-Object { $_.Effect -in @([CIEMPermissionEffect]::Deny, [CIEMPermissionEffect]::ConditionalDeny) }).Count -eq 0
        })
    }
    if (-not $IncludeRaw) {
        foreach ($item in $filtered) {
            foreach ($evidence in @($item.Evidence)) {
                $evidence.DataJson = $null
            }
        }
    }

    @($filtered)
}