src/Security/Share-XrmRecord.ps1

<#
    .SYNOPSIS
    Share a record with a user or team.

    .DESCRIPTION
    Grant access rights on a Dataverse record to a specified principal (user or team).

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

    .PARAMETER TargetReference
    Target record entity reference to share.

    .PARAMETER PrincipalAccess
    PrincipalAccess object created via New-XrmPrincipalAccess.

    .EXAMPLE
    $xrmClient = New-XrmClient -ConnectionString $connectionString;
    $userRef = New-XrmEntityReference -LogicalName "systemuser" -Id $userId;
    $accountRef = New-XrmEntityReference -LogicalName "account" -Id $accountId;
    $principalAccess = New-XrmPrincipalAccess -Principal $userRef;
    Share-XrmRecord -XrmClient $xrmClient -TargetReference $accountRef -PrincipalAccess $principalAccess;
#>

function Share-XrmRecord {
    [CmdletBinding()]
    param
    (        
        [Parameter(Mandatory = $false, ValueFromPipeline)]
        [Microsoft.PowerPlatform.Dataverse.Client.ServiceClient]
        $XrmClient = $Global:XrmClient,

        [Parameter(Mandatory = $true)]
        [Microsoft.Xrm.Sdk.EntityReference]
        $TargetReference,

        [Parameter(Mandatory = $true)]
        [Microsoft.Crm.Sdk.Messages.PrincipalAccess]
        $PrincipalAccess
    )
    begin {   
        $StopWatch = [System.Diagnostics.Stopwatch]::StartNew(); 
        Trace-XrmFunction -Name $MyInvocation.MyCommand.Name -Stage Start -Parameters ($MyInvocation.MyCommand.Parameters);
    }    
    process {
        $request = New-XrmRequest -Name "GrantAccess";
        $request | Add-XrmRequestParameter -Name "Target" -Value $TargetReference | Out-Null;
        $request | Add-XrmRequestParameter -Name "PrincipalAccess" -Value $PrincipalAccess | Out-Null;
        $response = Invoke-XrmRequest -XrmClient $XrmClient -Request $request;
        $response;
    }
    end {
        $StopWatch.Stop();
        Trace-XrmFunction -Name $MyInvocation.MyCommand.Name -Stage Stop -StopWatch $StopWatch;
    }    
}

Export-ModuleMember -Function Share-XrmRecord -Alias *;