Public/Get-EhRoleAssignment.ps1

function Get-EhRoleAssignment {
    <#
    .SYNOPSIS
        Lista las asignaciones de roles privilegiados, distinguiendo permanentes de
        elegibles (PIM).

    .DESCRIPTION
        En un tenant sano, el acceso privilegiado es ELEGIBLE (se activa por tiempo
        limitado vía PIM), no PERMANENTE. Una asignación permanente a un rol de alto
        privilegio es acceso de pie las 24 horas: si esa cuenta se ve comprometida, el
        atacante ya es administrador, sin activar nada. Esta función las separa para que
        veas cuáles conviene convertir a elegibles.

        SOLO LECTURA. Devuelve objetos.

        Permiso de Graph mínimo: RoleManagement.Read.Directory (solo lectura).

    .PARAMETER InvokeGraph
        Solo para pruebas: inyecta un mock de Invoke-EhGraph.

    .OUTPUTS
        PSCustomObject con: Principal, Rol, Tipo (Permanente/Elegible)
    #>

    [CmdletBinding()]
    [OutputType([pscustomobject])]
    param(
        [scriptblock] $InvokeGraph
    )

    $leer = if ($InvokeGraph) { $InvokeGraph } else { { param($u) Invoke-EhGraph -Uri $u } }

    $emitir = {
        param($items, $tipo)
        foreach ($a in $items) {
            [pscustomobject]@{
                Principal = $a.principal.displayName ?? $a.principalId
                Rol       = $a.roleDefinition.displayName ?? $a.roleDefinitionId
                Tipo      = $tipo
            }
        }
    }

    $expand = '?$expand=principal,roleDefinition'
    $permanentes = & $leer "/roleManagement/directory/roleAssignmentScheduleInstances$expand"
    $elegibles = & $leer "/roleManagement/directory/roleEligibilityScheduleInstances$expand"

    & $emitir $permanentes 'Permanente'
    & $emitir $elegibles 'Elegible'
}