Scripts/New-BPAPermission.ps1

function New-BPAPermission {
    <#
        .SYNOPSIS
            Assigns security to a BPA object.
 
        .DESCRIPTION
            New-BPAPermission assigns security to an object.
 
        .PARAMETER InputObject
            The name of the new object.
 
        .PARAMETER Principal
            The user or group to assign security to.
 
        .EXAMPLE
            # Denies user 'John' access to task 'Test'
            Get-BPATask -Name "Test" | New-BPAPermission -Principal 'John'
 
        .NOTES
            Author(s): : David Seibel
            Contributor(s) :
            Date Created : 07/10/2017
            Date Modified : 05/01/2018
 
        .LINK
            https://github.com/davidseibel/PoshBPA
    #>

    [CmdletBinding()]
    param(
        [Parameter(Mandatory = $true, ValueFromPipeline = $true)]
        $InputObject,        

        [ValidateNotNullOrEmpty()]
        $Principal,

        [bool]$FullControl = $false,
        [bool]$Create = $false,
        [bool]$Read = $false,
        [bool]$Edit = $false,
        [bool]$Delete = $false,
        [bool]$Move = $false,
        [bool]$ToggleEnable = $false,
        [bool]$ManualRun = $false,
        [bool]$Stop = $false,
        [bool]$Import = $false,
        [bool]$Export = $false,
        [bool]$Staging = $false,
        [bool]$Assign = $false,
        [bool]$ChangeSecurity = $false,
        [bool]$CanEdit = $false,
        [bool]$ManualResume = $false,
        [bool]$ManualRunFromHere = $false,
        [bool]$ToggleLock = $false,
        [bool]$Upgrade = $false
    )

    BEGIN {
        $tempPrincipal = @()
        foreach ($obj in $Principal) {
            if ($obj.PSObject.Properties | Where-Object {$_.Name -eq "TypeName"}) {
                if ($obj.TypeName -notin @("User","UserGroup")) {
                    throw "Unsupported input type '$($obj.TypeName)' encountered!"
                }
                $tempPrincipal += $obj
            } elseif ($obj -is [string]) {
                $temp = Get-BPAUserGroup -Name $obj
                if ($temp) {
                    $tempPrincipal += $temp
                } else {
                    $temp = Get-BPAUser -Name $obj
                    if ($temp) {
                        $tempPrincipal += $temp
                    } else {
                        throw "Principal '$obj' not found!"
                    }
                }
            }
        }
        $Principal = $tempPrincipal

        if ($FullControl) {
            $Create = $true
            $Read = $true
            $Edit = $true
            $Delete = $true
            $Move = $true
            $ToggleEnable = $true
            $ManualRun = $true
            $Stop = $true
            $Import = $true
            $Export = $true
            $Staging = $true
            $Assign = $true
            $ChangeSecurity = $true
            $CanEdit = $true
            $ManualResume = $true
            $ManualRunFromHere = $true
            $ToggleLock = $true
            $Upgrade = $true
        }
    }

    PROCESS {
        foreach ($obj in $InputObject) {
            if ($obj.TypeName -in @("Folder","Workflow","Task","Condition","Process","Agent","AgentGroup","User","UserGroup")) {
                $currentPermissions = $obj | Get-BPAPermission
                foreach ($p in $Principal) {
                    if ($null -eq ($currentPermissions | Where-Object {$_.GroupID -eq $p.ID})) {
                        # Get the template object from the PoshBPA\ObjectTemplates folder, and configure the object
                        $newObject = Get-BPAObjectTemplate -Type "Permission" -BPAServer $BPAServer
                        $newObject.ID                    = $guid
                        $newObject.Name                  = $Name
                        $newObject.ParentID              = $Folder.ID
                        $newObject.Path                  = Join-Path -Path $Folder.Path -ChildPath $Folder.Name
                        $newObject.AssignPermission      = $Assign
                        $newObject.CreatePermission      = $Create
                        $newObject.DeletePermission      = $Delete
                        $newObject.EditPermission        = $Edit
                        $newObject.EnablePermission      = $ToggleEnable
                        $newObject.ExportPermission      = $Export
                        $newObject.ImportPermission      = $Import
                        $newObject.LockPermission        = $ToggleLock
                        $newObject.MovePermission        = $Move
                        $newObject.ReadPermission        = $Read
                        $newObject.ResumePermission      = $ManualResume
                        $newObject.RunFromHerePermission = $ManualRunFromHere
                        $newObject.RunPermission         = $ManualRun
                        $newObject.SecurityPermission    = $ChangeSecurity
                        $newObject.StagingPermission     = $Staging
                        $newObject.StopPermission        = $Stop
                        $newObject.UpgradePermission     = $Upgrade
                        
                        $json = ConvertTo-BPAJson -InputObject $newObjectProps
                        $splat += @{
                            Resource = "$(([BPATypeDictionary]::($obj.TypeName)).RestResource)/$($obj.ID)/permissions/create"
                            RestMethod = "Post"
                            Body = $json
                            BPAServer = $obj.BPAServer
                        }
                        Invoke-BPARestMethod @splat | Out-Null
                        Write-Verbose "Assigned permissions to $($p.TypeName) '$($p.Name)' for $($obj.TypeName) '$($obj.Name)'!"
                    } else {
                        Write-Warning "$($p.TypeName) '$($p.Name)' already has permissions for $($obj.TypeName) '$($obj.Name)'!"
                    }
                }
            } else {
                Write-Error -Message "Unsupported input type '$($obj.TypeName)' encountered!" -TargetObject $obj
            }
        }
    }
}