src/Security/New-XrmSecurityRole.ps1

<#
    .SYNOPSIS
    Create a new security role.

    .DESCRIPTION
    Create a new security role (role) record in Microsoft Dataverse.

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

    .PARAMETER Name
    Security role display name.

    .PARAMETER BusinessUnitReference
    Business unit entity reference. Defaults to root business unit if not provided.

    .PARAMETER Description
    Security role description.

    .OUTPUTS
    Microsoft.Xrm.Sdk.EntityReference. Reference to the created role record.

    .EXAMPLE
    $roleRef = New-XrmSecurityRole -Name "Custom Role";

    .EXAMPLE
    $buRef = New-XrmEntityReference -LogicalName "businessunit" -Id $buId;
    $roleRef = New-XrmSecurityRole -Name "Custom Role" -BusinessUnitReference $buRef -Description "Custom role for testing";
#>

function New-XrmSecurityRole {
    [CmdletBinding()]
    [OutputType([Microsoft.Xrm.Sdk.EntityReference])]
    param
    (
        [Parameter(Mandatory = $false, ValueFromPipeline)]
        [Microsoft.PowerPlatform.Dataverse.Client.ServiceClient]
        $XrmClient = $Global:XrmClient,

        [Parameter(Mandatory = $true)]
        [ValidateNotNullOrEmpty()]
        [string]
        $Name,

        [Parameter(Mandatory = $false)]
        [Microsoft.Xrm.Sdk.EntityReference]
        $BusinessUnitReference,

        [Parameter(Mandatory = $false)]
        [string]
        $Description
    )
    begin {
        $StopWatch = [System.Diagnostics.Stopwatch]::StartNew();
        Trace-XrmFunction -Name $MyInvocation.MyCommand.Name -Stage Start -Parameters ($MyInvocation.MyCommand.Parameters);
    }
    process {
        $attributes = @{
            "name" = $Name;
        };

        if ($PSBoundParameters.ContainsKey('BusinessUnitReference')) {
            $attributes["businessunitid"] = $BusinessUnitReference;
        }
        else {
            $rootBU = Get-XrmRootBusinessUnit -XrmClient $XrmClient;
            $attributes["businessunitid"] = $rootBU.ToEntityReference();
        }

        $record = New-XrmEntity -LogicalName "role" -Attributes $attributes;

        if ($PSBoundParameters.ContainsKey('Description')) {
            $record.Attributes["description"] = $Description;
        }

        $record.Id = Add-XrmRecord -XrmClient $XrmClient -Record $record;
        $record.ToEntityReference();
    }
    end {
        $StopWatch.Stop();
        Trace-XrmFunction -Name $MyInvocation.MyCommand.Name -Stage Stop -StopWatch $StopWatch;
    }
}

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