Public/Get-VenafiTeam.ps1

function Get-VenafiTeam {
    <#
    .SYNOPSIS
    Get Team info

    .DESCRIPTION
    Get info for a VaaS or TPP team including members and owners.
    For VaaS, you can retrieve info on all teams as well.

    .PARAMETER ID
    Team ID.
    For VaaS, this is the team name or guid.
    For TPP, this is the local prefixed universal ID. You can find the group ID with Find-TppIdentity.

    .PARAMETER All
    Provide this switch to get all teams

    .PARAMETER VenafiSession
    Authentication for the function.
    The value defaults to the script session object $VenafiSession created by New-VenafiSession.
    A TPP token or VaaS key can also provided.
    If providing a TPP token, an environment variable named TPP_SERVER must also be set.

    .INPUTS
    ID

    .OUTPUTS
    PSCustomObject

    .EXAMPLE
    Get-VenafiTeam -ID 'MyTeam'

    Get info for a VaaS team by name

    .EXAMPLE
    Get-VenafiTeam -ID 'ca7ff555-88d2-4bfc-9efa-2630ac44c1f2'

    Get info for a VaaS team by id

    .EXAMPLE
    Get-VenafiTeam -ID 'local:{803f332e-7576-4696-a5a2-8ac6be6b14e6}'

    Get info for a TPP team

    .EXAMPLE
    Find-TppIdentity -Name MyTeamName | Get-VenafiTeam

    Search for a team and then get details

    .EXAMPLE
    Get-VenafiTeam -All

    Get info for all teams

    .LINK
    https://api.venafi.cloud/webjars/swagger-ui/index.html?urls.primaryName=account-service#/Teams/get_2

    .LINK
    https://api.venafi.cloud/webjars/swagger-ui/index.html?urls.primaryName=account-service#/Teams/get_1

    .LINK
    https://docs.venafi.com/Docs/current/TopNav/Content/SDK/WebSDK/r-SDK-GET-Teams-prefix-universal.php
    #>


    [CmdletBinding()]
    [Alias('Get-TppTeam', 'Get-VaasTeam')]

    param (

        [Parameter(Mandatory, ParameterSetName = 'ID', ValueFromPipelineByPropertyName)]
        [Alias('PrefixedUniversal', 'Guid', 'PrefixedName')]
        [string] $ID,

        [Parameter(Mandatory, ParameterSetName = 'All')]
        [switch] $All,

        [Parameter()]
        [Alias('Key', 'AccessToken')]
        [psobject] $VenafiSession = $script:VenafiSession
    )

    begin {
        $platform = Test-VenafiSession -VenafiSession $VenafiSession -PassThru

        $params = @{
            VenafiSession = $VenafiSession
            Method        = 'Get'
        }
    }

    process {

        if ( $platform -eq 'VaaS' ) {

            if ( $PSCmdlet.ParameterSetName -eq 'All' ) {
                $params.UriLeaf = 'teams'
            }
            else {
                if ( [guid]::TryParse($ID, $([ref][guid]::Empty)) ) {
                    $guid = [guid] $ID
                    $params.UriLeaf = 'teams/{0}' -f $guid.ToString()
                }
                else {
                    # assume team name
                    $allTeams = Get-VenafiTeam -All -VenafiSession $VenafiSession
                    return $allTeams | Where-Object { $_.name -eq $ID }
                }
            }

            $response = Invoke-VenafiRestMethod @params

            if ( $response.PSObject.Properties.Name -contains 'teams' ) {
                $response | Select-Object -ExpandProperty teams | ConvertTo-VaasTeam
            }
            else {
                $response | ConvertTo-VaasTeam
            }
        }
        else {
            if ( $PSCmdlet.ParameterSetName -eq 'All' ) {

                # no built-in api for this, get group objects and then get details
                Find-TppObject -Path '\VED\Identity' -Class 'Group' -VenafiSession $VenafiSession | Where-Object { $_.Name -ne 'Everyone' } | Get-VenafiTeam -VenafiSession $VenafiSession
            }
            else {

                # not only does -match set $matches, but -notmatch does as well
                if ( $ID -notmatch '(?im)^(local:)?\{?([0-9A-F]{8}[-]?(?:[0-9A-F]{4}[-]?){3}[0-9A-F]{12})\}?$' ) {
                    Write-Error "'$ID' is not the proper format for a Team. Format should either be a guid or local:{guid}."
                    return
                }

                $params.UriLeaf = ('Teams/local/{{{0}}}' -f $matches[2])

                try {

                    $response = Invoke-VenafiRestMethod @params

                    $out = [pscustomobject] ($response.ID | ConvertTo-TppIdentity)
                    $out | Add-Member @{
                        Members = $response.Members | ConvertTo-TppIdentity
                        Owners  = $response.Owners | ConvertTo-TppIdentity
                    }
                    $out
                }
                catch {

                    # handle known errors where the local group is not actually a team
                    if ( $_.ErrorDetails.Message -like '*Failed to read the team identity;*' ) {
                        Write-Verbose "$ID looks to be a local group and not a Team. The server responded with $_"
                    }
                    else {
                        Write-Error "$ID : $_"
                    }
                }
            }
        }
    }
}