Public/Get-UMSProfileDirectory.ps1

function Get-UMSProfileDirectory
{
  [CmdletBinding(DefaultParameterSetName = 'All')]
  param
  (
    [Parameter(Mandatory)]
    [String]
    $Computername,

    [ValidateRange(0, 65535)]
    [Int]
    $TCPPort = 8443,

    [ValidateSet(3)]
    [Int]
    $ApiVersion = 3,

    [ValidateSet('Tls12', 'Tls11', 'Tls', 'Ssl3')]
    [String[]]
    $SecurityProtocol = 'Tls12',

    [Parameter(Mandatory)]
    $WebSession,

    [ValidateSet('children')]
    [String]
    $Filter,

    [Parameter(ValueFromPipeline, ValueFromPipelineByPropertyName, ParameterSetName = 'Id')]
    [Int]
    $Id
  )

  Begin
  {
    $UriArray = @($Computername, $TCPPort, $ApiVersion)
    $BaseURL = ('https://{0}:{1}/umsapi/v{2}/directories/profiledirectories' -f $UriArray)
    if ($Filter)
    {
      $FilterString = New-UMSFilterString -Filter $Filter
    }
  }
  Process
  {
    $Params = @{
      WebSession       = $WebSession
      Method           = 'Get'
      ContentType      = 'application/json'
      Headers          = @{ }
      SecurityProtocol = ($SecurityProtocol -join ',')
    }
    Switch ($PSCmdlet.ParameterSetName)
    {
      'All'
      {
        $Params.Add('Uri', ('{0}{1}' -f $BaseURL, $FilterString))
        $APIObjectColl = (Invoke-UMSRestMethod @Params).SyncRoot
      }
      'Id'
      {
        $Params.Add('Uri', ('{0}/{1}{2}' -f $BaseURL, $Id, $FilterString))
        $APIObjectColl = Invoke-UMSRestMethod @Params
      }
    }
    $Result = foreach ($APIObject in $APIObjectColl)
    {
      $Properties = [ordered]@{
        'Id'         = [Int]$APIObject.id
        'Name'       = [String]$APIObject.name
        'ParentId'   = [Int]$APIObject.parentID
        'MovedToBin' = [System.Convert]::ToBoolean($APIObject.movedToBin)
        'ObjectType' = [String]$APIObject.objectType
      }
      switch ($Filter)
      {
        'children'
        {
          $DirectoryChildren = foreach ($child in $APIObject.DirectoryChildren)
          {
            $ChildProperties = [ordered]@{
              'ObjectType' = [String]$child.objectType
              'Id'         = [Int]$child.id
            }
            New-Object psobject -Property $ChildProperties
          }
          $Properties += [ordered]@{
            'DirectoryChildren' = $DirectoryChildren
          }
        }
      }
      New-Object psobject -Property $Properties
    }
    $Result
  }
  End
  {
  }
}