src/Security/Get-XrmRolePrivileges.ps1

<#
    .SYNOPSIS
    Retrieve security role privileges.

    .DESCRIPTION
    Get role privileges from given role (RetrieveRolePrivilegesRole): one RolePrivilege per privilege, with its depth.
    Each RolePrivilege also carries EntityLogicalName and AccessRight (see Get-XrmPrivileges), and its PrivilegeName is filled when the platform leaves it empty.

    .PARAMETER XrmClient
    Xrm connector initialized to target instance. Use latest one by default. (Dataverse ServiceClient)

    .PARAMETER RoleId
    Role unique identifier.

    .OUTPUTS
    Microsoft.Crm.Sdk.Messages.RolePrivilege[]. Privileges of the role, with the EntityLogicalName and AccessRight note properties.

    .EXAMPLE
    $privileges = Get-XrmRolePrivileges -XrmClient $xrmClient -RoleId $role.Id;
    $privileges | Where-Object { $_.EntityLogicalName -eq "account" } | Select-Object PrivilegeName, AccessRight, Depth;

    .LINK
    https://github.com/AymericM78/PowerDataOps/blob/main/documentation/commands/Get-XrmRolePrivileges.md
#>

function Get-XrmRolePrivileges {
    [CmdletBinding()]
    [OutputType([Microsoft.Crm.Sdk.Messages.RolePrivilege[]])]
    param
    (
        [Parameter(Mandatory = $false, ValueFromPipeline)]
        [Microsoft.PowerPlatform.Dataverse.Client.ServiceClient]
        $XrmClient = $Global:XrmClient,

        [Parameter(Mandatory = $true)]
        [Guid]
        $RoleId
    )
    begin {
        $StopWatch = [System.Diagnostics.Stopwatch]::StartNew();
        Trace-XrmFunction -Name $MyInvocation.MyCommand.Name -Stage Start -Parameters ($MyInvocation.MyCommand.Parameters);
    }
    process {
        $request = New-XrmRequest -Name "RetrieveRolePrivilegesRole";
        $request = $request | Add-XrmRequestParameter -Name "RoleId" -Value $RoleId;
        $response = Invoke-XrmRequest -XrmClient $XrmClient -Request $request;
        if ($null -eq $response) {
            return;
        }
        $privileges = $response.Results["RolePrivileges"];

        # Names (sometimes empty in the response), tables and access rights
        $privilegeInfos = @{};
        foreach ($privilegeInfo in (Get-XrmPrivileges -XrmClient $XrmClient -RoleId $RoleId)) {
            $privilegeInfos[$privilegeInfo.Id] = $privilegeInfo;
        }
        foreach ($privilege in $privileges) {
            $privilegeInfo = $privilegeInfos[$privilege.PrivilegeId];
            if ($privilegeInfo -and -not $privilege.PrivilegeName) {
                $privilege.PrivilegeName = $privilegeInfo.Name;
            }
            $privilege | Add-Member -MemberType NoteProperty -Name "EntityLogicalName" -Value $privilegeInfo.EntityLogicalName -Force;
            $privilege | Add-Member -MemberType NoteProperty -Name "AccessRight" -Value $privilegeInfo.AccessRight -Force;
        }
        $privileges;
    }
    end {
        $StopWatch.Stop();
        Trace-XrmFunction -Name $MyInvocation.MyCommand.Name -Stage Stop -StopWatch $StopWatch;
    }
}
Export-ModuleMember -Function Get-XrmRolePrivileges -Alias *;