Resources/CustomDetectionRules-GET.ps1

function Get-S1CustomDetectionRules {
<#
    .SYNOPSIS
        Get a list of Custom Detection Rules for a given scope.
 
    .DESCRIPTION
        The Get-S1CustomDetectionRules cmdlet gets a list of Custom Detection Rules for a given scope.
 
        Note: You can create and see rules only for your highest available scope.
        For example, if your username has an access level of scope Account,
        you cannot see rules created for the Global scope or rules created for a specific Site.
 
    .PARAMETER accountIds
        List of Account IDs to filter by.
 
        Example: "225494730938493804,225494730938493915".
 
    .PARAMETER activeResponse
        Rule active response status
 
    .PARAMETER countOnly
        If true, only total number of items will be returned, without any of the actual objects.
 
    .PARAMETER creator__contains
        Free-text filter by rule creator
 
        Example: "Service Pack 1".
 
    .PARAMETER cursor
        Cursor position returned by the last request. Use to iterate over more than 1000 items.
 
        Found under pagination
 
        Example: "YWdlbnRfaWQ6NTgwMjkzODE=".
 
    .PARAMETER description__contains
        Free-text filter by rule description
 
        Example: "Service Pack 1".
 
    .PARAMETER disablePagination
        If true, all rules for requested scope will be returned
 
    .PARAMETER expirationMode
        Return rules with the filtered expiration mode.
 
        Allowed values:
        'Permanent', 'Temporary'
 
    .PARAMETER expired
        Rule expired or not
 
    .PARAMETER groupIds
        List of Group IDs to filter by.
 
        Example: "225494730938493804,225494730938493915"
 
    .PARAMETER ids
        A list of Rules IDs.
 
        Example: "225494730938493804,225494730938493915".
 
    .PARAMETER limit
        Limit number of returned items (1-1000).
 
    .PARAMETER name__contains
        Free-text filter by rule name
 
        Example: "Service Pack 1".
 
    .PARAMETER query
        Free text search on fields name, description, agent_version, os_type, config
 
    .PARAMETER queryType
        Return rules with the filtered type.
 
        Allowed values:
        'events', 'processes'
 
    .PARAMETER reachedLimit
        Rule reached limit or not
 
    .PARAMETER s1ql__contains
        Free-text filter by S1 query
 
        Example: "Service Pack 1".
 
    .PARAMETER scopes
        Return rules with the filtered expiration mode.
 
        Allowed values:
        'account', 'global', 'group', 'site'
 
    .PARAMETER siteIds
        List of Site IDs to filter by
 
        Example: "225494730938493804,225494730938493915".
 
    .PARAMETER skip
        Skip first number of items (0-1000). To iterate over more than 1000 items, use "cursor".
 
        Example: "150".
 
    .PARAMETER skipCount
        If true, total number of items will not be calculated, which speeds up execution time.
 
    .PARAMETER sortBy
        Sorts the returned results by a defined value
 
        Allowed values:
        'activeResponse', 'createdAt', 'description', 'expiration', 'expirationMode', 'expired', 'generatedAlerts', 'id', 'lastAlertTime',
        'name', 'queryType', 'reachedLimit', 'scope', 'scopeHierarchy', 'severity', 'status', 'statusReason', 'updatedAt'
 
    .PARAMETER sortOrder
        Sort direction
 
        Allowed values:
        'asc', 'desc'
 
    .PARAMETER status
        Included engines.
 
        Allowed values:
        'Activating', 'Active', 'Deleted', 'Deleting', 'Disabled', 'Disabling', 'Draft'
 
    .EXAMPLE
        Get-S1CustomDetectionRules
 
        Returns the first 10 Custom Detection Rules for a given scope
 
    .EXAMPLE
        1234567890,0987654321 | Get-S1CustomDetectionRules
 
        Returns the first 10 Custom Detection Rules for a given scope from the defined sites
 
    .EXAMPLE
        Get-S1CustomDetectionRules -cursor 'YWdlbnRfaWQ6NTgwMjkzODE='
 
        Returns results after the defined cursor
 
        The cursor value can be found under pagination
 
    .NOTES
        As of 2022-11:
            Cannot fully validate due to permissions
 
    .LINK
        https://celerium.github.io/SentinelOne-PowerShellWrapper/site/CustomDetectionRule/Get-S1CustomDetectionRules.html
 
#>


[CmdletBinding( DefaultParameterSetName = 'index' )]
Param (
    [Parameter( Mandatory = $false, ParameterSetName = 'index' )]
    [ValidateRange(1, [Int64]::MaxValue)]
    [Int64[]]$accountIds,

    [Parameter( Mandatory = $false, ParameterSetName = 'index' )]
    [Switch]$activeResponse,

    [Parameter( Mandatory = $false, ParameterSetName = 'index' )]
    [Switch]$countOnly,

    [Parameter( Mandatory = $false, ParameterSetName = 'index' )]
    [ValidateNotNullOrEmpty()]
    [String[]]$creator__contains,

    [Parameter( Mandatory = $false, ParameterSetName = 'index' )]
    [ValidateNotNullOrEmpty()]
    [String]$cursor,

    [Parameter( Mandatory = $false, ParameterSetName = 'index' )]
    [ValidateNotNullOrEmpty()]
    [String[]]$description__contains,

    [Parameter( Mandatory = $false, ParameterSetName = 'index' )]
    [Switch]$disablePagination,

    [Parameter( Mandatory = $false, ParameterSetName = 'index' )]
    [ValidateSet( 'Permanent', 'Temporary' )]
    [String]$expirationMode,

    [Parameter( Mandatory = $false, ParameterSetName = 'index' )]
    [Switch]$expired,

    [Parameter( Mandatory = $false, ParameterSetName = 'index' )]
    [ValidateRange(1, [Int64]::MaxValue)]
    [Int64[]]$groupIds,

    [Parameter( Mandatory = $false, ParameterSetName = 'index' )]
    [ValidateRange(1, [Int64]::MaxValue)]
    [Int64[]]$ids,

    [Parameter( Mandatory = $false, ParameterSetName = 'index' )]
    [ValidateRange(1, 1000)]
    [Int64]$limit,

    [Parameter( Mandatory = $false, ParameterSetName = 'index' )]
    [ValidateNotNullOrEmpty()]
    [String[]]$name__contains,

    [Parameter( Mandatory = $false, ParameterSetName = 'index' )]
    [ValidateNotNullOrEmpty()]
    [String[]]$query,

    [Parameter( Mandatory = $false, ParameterSetName = 'index' )]
    [ValidateSet( 'events', 'processes' )]
    [String]$queryType,

    [Parameter( Mandatory = $false, ParameterSetName = 'index' )]
    [Switch]$reachedLimit,

    [Parameter( Mandatory = $false, ParameterSetName = 'index' )]
    [ValidateNotNullOrEmpty()]
    [String[]]$s1ql__contains,

    [Parameter( Mandatory = $false, ParameterSetName = 'index' )]
    [ValidateSet( 'account', 'global', 'group', 'site' )]
    [String[]]$scopes,

    [Parameter( Mandatory = $false, ValueFromPipeline = $true, ParameterSetName = 'index' )]
    [ValidateRange(1, [Int64]::MaxValue)]
    [Int64[]]$siteIds,

    [Parameter( Mandatory = $false, ParameterSetName = 'index' )]
    [ValidateRange(1, [Int64]::MaxValue)]
    [Int64]$skip,

    [Parameter( Mandatory = $false, ParameterSetName = 'index' )]
    [Switch]$skipCount,

    [Parameter( Mandatory = $false, ParameterSetName = 'index' )]
    [ValidateSet(   'activeResponse', 'createdAt', 'description', 'expiration', 'expirationMode', 'expired',
                    'generatedAlerts', 'id', 'lastAlertTime', 'name', 'queryType', 'reachedLimit', 'scope',
                    'scopeHierarchy', 'severity', 'status', 'statusReason', 'updatedAt'
                )]
    [String]$sortBy,

    [Parameter( Mandatory = $false, ParameterSetName = 'index' )]
    [ValidateSet( 'asc', 'desc' )]
    [String]$sortOrder,

    [Parameter( Mandatory = $false, ParameterSetName = 'index' )]
    [ValidateSet( 'Activating', 'Active', 'Deleted', 'Deleting', 'Disabled', 'Disabling', 'Draft' )]
    [String[]]$status

)

    process{

        Write-Verbose "Running the [ $($PSCmdlet.ParameterSetName) ] parameterSet"

        Switch ($PSCmdlet.ParameterSetName){
            'index' {$resource_uri = "/cloud-detection/rules"}
        }

        $excludedParameters =   'Debug','ErrorAction','ErrorVariable','InformationAction',
                                'InformationVariable','OutBuffer','OutVariable','PipelineVariable',
                                'Verbose','WarningAction','WarningVariable'

        $body = @{}

        if ($PSCmdlet.ParameterSetName -eq 'index') {

            ForEach ( $Key in $PSBoundParameters.GetEnumerator() ){

                if( $excludedParameters -contains $Key.Key ){$null}
                elseif ( $Key.Value.GetType().IsArray ){
                    Write-Verbose "[ $($Key.Key) ] is an array parameter"
                    $body += @{ $Key.Key = $Key.Value -join (',') }
                }
                else{
                    $body += @{ $Key.Key = $Key.Value }
                }

            }

        }

        try {
            $ApiToken = Get-S1APIKey -PlainText
            $S1_Headers.Add('Authorization', "ApiToken $ApiToken")

            $rest_output = Invoke-RestMethod -Method Get -Uri ( $S1_Base_URI + $resource_uri ) -Headers $S1_Headers -Body $body -ErrorAction Stop -ErrorVariable rest_error
        } catch {
            Write-Error $_
        } finally {
            [void] ( $S1_Headers.Remove('Authorization') )
        }

        $data = @{}
        $data = $rest_output
        return $data

    }

}