Scripts/Get-BPAUser.ps1
function Get-BPAUser { <# .SYNOPSIS Gets AutoMate BPA users. .DESCRIPTION Get-BPAUser gets user objects from AutoMate BPA. Get-BPAUser can receive items on the pipeline and return related objects. .PARAMETER InputObject The object(s) to use in search for users. .PARAMETER Name The name of the user (case sensitive). Wildcard characters can be escaped using the ` character. If using escaped wildcards, the string must be wrapped in single quotes. For example: Get-BPAUser -Name '`[Test`]' .PARAMETER ID The ID of the user. .PARAMETER FilterSet The parameters to filter the search on. Supply hashtable(s) with the following properties: Property, Comparator, Value. Valid values for the Comparator are: =, !=, <, >, contains (default - no need to supply Comparator when using 'contains') .PARAMETER FilterSetMode If multiple filter sets are provided, FilterSetMode determines if the filter sets should be evaluated with an AND or an OR .PARAMETER SortProperty The object property to sort results on. Do not use BPAServer or TypeName, since those are custom properties added by this module, and not exposed in the API. .PARAMETER SortDescending If specified, this will sort the output on the specified SortProperty in descending order. Otherwise, ascending order is assumed. .PARAMETER BPAServer The AutoMate BPA management server. .INPUTS Users related to the following objects can be retrieved by this function: UserGroup Folder .EXAMPLE # Get user "MyUsername" Get-BPAUser "MyUsername" .EXAMPLE # Get users in user group "group01" Get-BPAUserGroup "group01" | Get-BPAUser .EXAMPLE # Get users using filter sets Get-BPAAgent -FilterSet @{ Property = "Enabled"; Comparator = "="; Value = "true"} .NOTES Author(s): : David Seibel Contributor(s) : Date Created : 08/24/2016 Date Modified : 05/03/2018 .LINK https://github.com/davidseibel/PoshBPA #> [CmdletBinding(DefaultParameterSetName = "All")] [OutputType([System.Object[]])] param( [Parameter(ValueFromPipeline = $true, ParameterSetName = "ByPipeline")] [ValidateNotNullOrEmpty()] $InputObject, [Parameter(Position = 0)] [ValidateNotNullOrEmpty()] [string]$Name, [Parameter(ParameterSetName = "ByID")] [ValidateNotNullOrEmpty()] [string]$ID, [Hashtable[]]$FilterSet, [ValidateSet("And","Or")] [string]$FilterSetMode = "And", [ValidateNotNullOrEmpty()] [string[]]$SortProperty = "Name", [switch]$SortDescending = $false, [ValidateNotNullOrEmpty()] [string]$BPAServer ) BEGIN { # If the server is specified, or only 1 server is connected, don't show it. Otherwise, show the server. if ($PSCmdlet.ParameterSetName -eq "ByID" -and (-not $PSBoundParameters.ContainsKey("BPAServer")) -and ($global:BPAConnectionInfo.Count -gt 1)) { throw "When searching by ID: 1) BPAServer must be specified, OR 2) only one server can be connected." } $splat = @{ RestMethod = "Get" BPAServer = $BPAServer } $result = @() $userCache = @{} if ($PSBoundParameters.ContainsKey("Name") -and (-not [System.Management.Automation.WildcardPattern]::ContainsWildcardCharacters($Name))) { $FilterSet += @{Property = "Name"; Comparator = "="; Value = [System.Management.Automation.WildcardPattern]::Unescape($Name)} } elseif ($PSBoundParameters.ContainsKey("Name") -and [System.Management.Automation.WildcardPattern]::ContainsWildcardCharacters($Name)) { try { "" -like $Name | Out-Null } # Test wildcard string catch { throw } # Throw error if wildcard invalid $splat += @{ FilterScript = {$_.Name -like $Name} } } } PROCESS { switch($PSCmdlet.ParameterSetName) { "All" { $splat += @{ Resource = Format-BPAUri -Path "users/list" -FilterSet $FilterSet -FilterSetMode $FilterSetMode -SortProperty $SortProperty -SortDescending:$SortDescending.ToBool() } $result = Invoke-BPARestMethod @splat } "ByID" { $splat += @{ Resource = "users/$ID/get" } $result = Invoke-BPARestMethod @splat } "ByPipeline" { foreach ($obj in $InputObject) { $tempSplat = $splat if (-not $tempSplat.ContainsKey("BPAServer")) { $tempSplat += @{ BPAServer = $obj.BPAServer } } else { $tempSplat["BPAServer"] = $obj.BPAServer } if (-not $userCache.ContainsKey($obj.BPAServer)) { Write-Verbose "Caching user objects for server $($obj.BPAServer) for better performance" $userCache.Add($obj.BPAServer, (Get-BPAUser -FilterSet $FilterSet -FilterSetMode $FilterSetMode -SortProperty $SortProperty -SortDescending:$SortDescending.ToBool() -BPAServer $obj.BPAServer)) } switch ($obj.TypeName) { "UserGroup" { # Get users contained within the provided user group(s) foreach ($userID in $obj.UserIDs) { $result += $userCache[$obj.BPAServer] | Where-Object {$_.ID -eq $userID} } } "Folder" { # Get the user for the specified "user" folder if ($obj.Path -like "\WORKFLOWS*") { Write-Verbose "Getting user whose user folder for workflows is $(Join-Path -Path $obj.Path -ChildPath $obj.Name)..." $result += $userCache[$obj.BPAServer] | Where-Object {$_.WorkflowFolderID -eq $obj.ID} } elseif ($obj.Path -like "\TASKS*") { Write-Verbose "Getting user whose user folder for tasks is $(Join-Path -Path $obj.Path -ChildPath $obj.Name)..." $result += $userCache[$obj.BPAServer] | Where-Object {$_.TaskFolderID -eq $obj.ID} } elseif ($obj.Path -like "\CONDITIONS*") { Write-Verbose "Getting user whose user folder for conditions is $(Join-Path -Path $obj.Path -ChildPath $obj.Name)..." $result += $userCache[$obj.BPAServer] | Where-Object {$_.ConditionFolderID -eq $obj.ID} } elseif ($obj.Path -like "\PROCESSES*") { Write-Verbose "Getting user whose user folder for processes is $(Join-Path -Path $obj.Path -ChildPath $obj.Name)..." $result += $userCache[$obj.BPAServer] | Where-Object {$_.ProcessFolderID -eq $obj.ID} } elseif (($obj.Path -like "\USERS*") -or ($obj.Path -eq "\" -and $obj.Name -eq "USERS")) { # Get users contained within the provided folder(s) Write-Verbose "Getting users contained in folder $(Join-Path -Path $obj.Path -ChildPath $obj.Name)..." $result += $userCache[$obj.BPAServer] | Where-Object {$_.ParentID -eq $obj.ID} } else { Write-Warning "Invalid folder type (Path: $(Join-Path -Path $obj.Path -ChildPath $obj.Name))!" } } "SystemPermission" { $result += Get-BPAUser -ID $obj.GroupID } default { $unsupportedType = $obj.GetType().FullName if ($_) { $unsupportedType = $_ } elseif (($null -ne $obj.Type) -and ($obj.Type -ne "")) { $unsupportedType = $obj.Type } Write-Error -Message "Unsupported input type '$unsupportedType' encountered!" -TargetObject $obj } } } } } } END { $SortProperty += "BPAServer", "ID" return $result | Sort-Object $SortProperty -Unique -Descending:$SortDescending.ToBool() } } |