src/Security/New-XrmPrincipalAccess.ps1

<#
    .SYNOPSIS
    Create a PrincipalAccess object.

    .DESCRIPTION
    Instantiate a Microsoft.Crm.Sdk.Messages.PrincipalAccess object with the specified principal and access rights.

    .PARAMETER Principal
    User or team entity reference.

    .PARAMETER AccessRights
    Access rights to grant. Default: ReadAccess + WriteAccess + AppendAccess + AppendToAccess.

    .OUTPUTS
    Microsoft.Crm.Sdk.Messages.PrincipalAccess.

    .EXAMPLE
    $principalAccess = New-XrmPrincipalAccess -Principal $userRef -AccessRights ([Microsoft.Crm.Sdk.Messages.AccessRights]::ReadAccess);
#>

function New-XrmPrincipalAccess {
    [CmdletBinding()]
    [OutputType("Microsoft.Crm.Sdk.Messages.PrincipalAccess")]
    param
    (        
        [Parameter(Mandatory = $true)]
        [Microsoft.Xrm.Sdk.EntityReference]
        $Principal,

        [Parameter(Mandatory = $false)]
        [Microsoft.Crm.Sdk.Messages.AccessRights]
        $AccessRights = ([Microsoft.Crm.Sdk.Messages.AccessRights]::ReadAccess -bor [Microsoft.Crm.Sdk.Messages.AccessRights]::WriteAccess -bor [Microsoft.Crm.Sdk.Messages.AccessRights]::AppendAccess -bor [Microsoft.Crm.Sdk.Messages.AccessRights]::AppendToAccess)
    )
    begin {   
        $StopWatch = [System.Diagnostics.Stopwatch]::StartNew(); 
        Trace-XrmFunction -Name $MyInvocation.MyCommand.Name -Stage Start -Parameters ($MyInvocation.MyCommand.Parameters);
    }    
    process {
        $principalAccess = New-Object "Microsoft.Crm.Sdk.Messages.PrincipalAccess";
        $principalAccess.AccessMask = $AccessRights;
        $principalAccess.Principal = $Principal;
        $principalAccess;
    }
    end {
        $StopWatch.Stop();
        Trace-XrmFunction -Name $MyInvocation.MyCommand.Name -Stage Stop -StopWatch $StopWatch;
    }    
}

Export-ModuleMember -Function New-XrmPrincipalAccess -Alias *;