Public/Systems/Get-JCSystemInsights.ps1

<#
.Synopsis
JumpCloud's System Insights feature provides admins with the ability to easily interrogate their
fleet of systems to find important pieces of information. Using this function you
can easily gather heightened levels of information from your fleet of JumpCloud managed
systems.
.Description
Using Get-JCSystemInsights will allow you to easily query JumpCloud's RESTful API to return information from your fleet of JumpCloud managed
systems.
 
.Example
PS C:\> Get-JCSystemInsights -Table:('App');
 
Get all Apps from systems with system insights enabled.
 
.Example
PS C:\> Get-JCSystemInsights -Table:('App') -SystemId:('5d66e0ac51db1e789bb17c77', '5e0e19831bc893319ae068b6');
 
Get all Apps from the specific systems.
 
.Example
PS C:\> Get-JCSystemInsights -Table:('App') -Filter:('system_id:eq:5d66e0ac51db1e789bb17c77', 'bundle_name:eq:storeuid');
 
Get systems that have a specific App on a specific system where the filter is multiple strings.
 
.Example
PS C:\> Get-JCSystemInsights -Table:('App') -Filter:('system_id:eq:5d66e0ac51db1e789bb17c77, bundle_name:eq:storeuid');
 
Get systems that have a specific App on a specific system where the filter is a string.
 
.Link
https://github.com/TheJumpCloud/support/wiki/Get-JCSystemInsights
#>

Function Get-JCSystemInsights
{
    [CmdletBinding(DefaultParameterSetName = 'List', PositionalBinding = $false)]
    Param(
        [Parameter(Mandatory)]
        [System.String]
        # Name of the SystemInsights table to query.
        # See docs.jumpcloud.com for list of available table endpoints.
        $Table,

        [Parameter()]
        [System.String[]]
        [Alias('_id', 'id', 'system_id')]
        # Id of system to filter on.
        $SystemId,

        [Parameter()]
        [System.String[]]
        # Supported values and operators are specified for each table.
        # See docs.jumpcloud.com and search for specific table for a list of available filter options.
        # Use tab complete to see available filters.
        $Filter,

        [Parameter(DontShow)]
        [System.Boolean]
        # Set to $true to return all results. This will overwrite any skip and limit parameter.
        $Paginate = $true
    )
    Begin
    {
        Connect-JCOnline -force | Out-Null
        $CommandTemplate = "JumpCloud.SDK.V2\Get-JcSdkSystemInsight{0} @PSBoundParameters"
        $Results = @()
        If (-not [System.String]::IsNullOrEmpty($PSBoundParameters.Filter))
        {
            $PSBoundParameters.Filter = $PSBoundParameters.Filter -replace (', ', ',') -join ','
        }
        If (-not [System.String]::IsNullOrEmpty($PSBoundParameters.SystemId))
        {
            $SystemIdFilter = $PSBoundParameters.SystemId | ForEach-Object {
                $SystemIdFilterString = "system_id:eq:$($_)"
                If (-not [System.String]::IsNullOrEmpty($PSBoundParameters.Filter))
                {
                    "$($SystemIdFilterString),$($PSBoundParameters.Filter)"
                }
                Else
                {
                    $SystemIdFilterString
                }
            }
        }
        $PSBoundParameters.Remove('Table') | Out-Null
        $PSBoundParameters.Remove('SystemId') | Out-Null
    }
    Process
    {
        $Results = If (-not [System.String]::IsNullOrEmpty($SystemIdFilter))
        {
            $SystemIdFilter | ForEach-Object {
                $PSBoundParameters.Filter = $_
                Invoke-Expression -Command:($CommandTemplate -f $Table)
            }
        }
        Else
        {
            Invoke-Expression -Command:($CommandTemplate -f $Table)
        }
    }
    End
    {
        Return $Results
    }
}