Public/SystemUsers/Get-JCSystemUser.ps1

function Get-JCSystemUser ()
{
    [CmdletBinding()]

    param
    (
        [Parameter(Mandatory,
            ValueFromPipelineByPropertyName,
            Position = 0,
            HelpMessage = 'The _id of the System which you want to query.
To find a JumpCloud SystemID run the command:
PS C:\> Get-JCSystem | Select hostname, _id
The SystemID will be the 24 character string populated for the _id field.
SystemID has an Alias of _id. This means you can leverage the PowerShell pipeline to populate this field automatically using the Get-JCSystem function before calling Get-JCSystemUser. This is shown in EXAMPLES 2 and 3.'
)]
        [Alias('_id', 'id')]
        [String]$SystemID
    )

    begin

    {
        Write-Verbose 'Verifying JCAPI Key'
        if ($JCAPIKEY.length -ne 40) {Connect-JConline}

        Write-Verbose 'Populating API headers'
        $hdrs = @{

            'Content-Type' = 'application/json'
            'Accept'       = 'application/json'
            'X-API-KEY'    = $JCAPIKEY

        }

        if ($JCOrgID)
        {
            $hdrs.Add('x-org-id', "$($JCOrgID)")
        }

        [int]$limit = '100'
        Write-Verbose "Setting limit to $limit"

        Write-Verbose 'Initilizing resultsArrayList and resultsArray'
        $resultsArrayList = New-Object System.Collections.ArrayList
        $resultsArray = @()

        Write-Verbose 'Populating UserIDHash'
        $UserIDHash = Get-Hash_ID_Username

        Write-Verbose 'Populating SystemIDHash'
        $SystemIDHash = Get-Hash_SystemID_HostName

        Write-Verbose 'Populating DisplayNameHash'
        $DisplayNameHash = Get-Hash_SystemID_DisplayName

        Write-Verbose 'Populating SudoHash'
        $SudoHash = Get-Hash_ID_Sudo

    }

    process
    {
        Write-Verbose 'Setting skip to zero'
        [int]$skip = 0 #Do not change!

        while (($resultsArray.results).Count -ge $skip)
        {
            $URI = "$JCUrlBasePath/api/v2/systems/$SystemID/users?sort=type,_id&limit=$limit&skip=$skip"

            Write-Verbose $URI

            $APIresults = Invoke-RestMethod -Method GET -Uri $URI -Body $jsonbody -Headers $hdrs -UserAgent:(Get-JCUserAgent)

            $skip += $limit
            Write-Verbose "Setting skip to $skip"

            $resultsArray += $APIresults

            $count = ($resultsArray).Count
            Write-Verbose "Results count equals $count"
        }


        $Hostname = $SystemIDHash.Get_Item($SystemID)
        $DisplayName = $DisplayNameHash.Get_Item($SystemID)

        foreach ($result in $resultsArray)
        {
            $UserID = $result.id
            $Username = $UserIDHash.Get_Item($UserID)
            $Groups = $result.compiledAttributes.ldapGroups.name

            if (($result.paths.to).Count -eq $null)
            {
                $DirectBind = $true
            }
            elseif ((($result.paths.to).Count % 3 -eq 0))
            {
                $DirectBind = $false
            }
            else
            {
                $DirectBind = $true
            }

            if ($result.compiledAttributes.sudo.enabled -eq $true)
            {

                $Admin = $true
            }
            else
            {

                $Sudo = $SudoHash.Get_Item($UserID)

                if ($Sudo -eq $true)
                {

                    $Admin = $true

                }

                else
                {
                    $Admin = $false
                }

            }

            $SystemUser = [pscustomobject]@{
                'DisplayName'   = $DisplayName
                'HostName'      = $Hostname
                'SystemID'      = $SystemID
                'Username'      = $Username
                'Administrator' = $Admin
                'DirectBind'    = $DirectBind
                'BindGroups'    = @($Groups)
            }

            $resultsArrayList.Add($SystemUser) | Out-Null

        }

        $resultsArray = $null

    }

    end
    {
        return $resultsArrayList
    }
}