public/policy-device-control.ps1

function Edit-FalconDeviceControlClass {
<#
.SYNOPSIS
Modify Device Control policy classes
.DESCRIPTION
Requires 'Device control policies: Write'.
.PARAMETER InputObject
One or more policy identifiers and class objects to modify in a single request
.PARAMETER BluetoothClass
Bluetooth class modifications and exceptions
.PARAMETER UsbClass
USB class modifications and exceptions
.PARAMETER Id
Policy identifier
.LINK
https://github.com/crowdstrike/psfalcon/wiki/Edit-FalconDeviceControlClass
#>

  [CmdletBinding(DefaultParameterSetName='/policy/entities/device-control-classes/v1:patch',SupportsShouldProcess)]
  param(
    [Parameter(ParameterSetName='Pipeline',Mandatory,ValueFromPipeline)]
    [ValidateScript({
      Confirm-Parameter $_ 'Edit-FalconDeviceControlClass' '/policy/entities/device-control-classes/v1:patch'
    })]
    [Alias('policies','Array')]
    [object[]]$InputObject,
    [Parameter(ParameterSetName='/policy/entities/device-control-classes/v1:patch',Mandatory,Position=1)]
    [ValidatePattern('^[a-fA-F0-9]{32}$')]
    [string]$Id,
    [Parameter(ParameterSetName='/policy/entities/device-control-classes/v1:patch',Position=2)]
    [Alias('bluetooth_classes')]
    [object]$BluetoothClass,
    [Parameter(ParameterSetName='/policy/entities/device-control-classes/v1:patch',Position=3)]
    [Alias('usb_classes')]
    [object]$UsbClass
  )
  begin {
    $Param = @{
      Command = $MyInvocation.MyCommand.Name
      Endpoint = '/policy/entities/device-control-classes/v1:patch'
    }
    $Param['Format'] = Get-EndpointFormat $Param.Endpoint
    [System.Collections.Generic.List[PSCustomObject]]$List = @()
  }
  process {
    if ($InputObject) {
      @($InputObject).foreach{
        # Filter to defined 'policies' properties and remove empty values
        $i = [PSCustomObject]$_ | Select-Object $Param.Format.Body.policies
        Remove-EmptyValue $i
        $List.Add($i)
      }
    } else {
      Invoke-Falcon @Param -UserInput $PSBoundParameters
    }
  }
  end {
    if ($List) {
      # Modify in groups of 100
      [void]$PSBoundParameters.Remove('InputObject')
      $Param.Format = @{ Body = @{ root = @('policies') } }
      for ($i = 0; $i -lt $List.Count; $i += 100) {
        $PSBoundParameters['policies'] = @($List[$i..($i + 99)])
        Invoke-Falcon @Param -UserInput $PSBoundParameters
      }
    }
  }
}
function Edit-FalconDeviceControlNotification {
<#
.SYNOPSIS
Modify default Device Control notification settings
.DESCRIPTION
Requires 'Device control policies: Write'.
.PARAMETER Bluetooth
Bluetooth custom notification settings ('blocked_notification')
.PARAMETER Usb
USB custom notification settings ('blocked_notification', 'restricted_notification')
.LINK
https://github.com/crowdstrike/psfalcon/wiki/Edit-FalconDeviceControlNotification
#>

  [CmdletBinding(DefaultParameterSetName='/policy/entities/device-control-default-settings/v1:patch',
    SupportsShouldProcess)]
  param(
    [Parameter(ParameterSetName='/policy/entities/device-control-default-settings/v1:patch',Mandatory,
      ValueFromPipelineByPropertyName,Position=1)]
    [Alias('bluetooth_custom_notifications')]
    [object]$Bluetooth,
    [Parameter(ParameterSetName='/policy/entities/device-control-default-settings/v1:patch',Mandatory,
      ValueFromPipelineByPropertyName,Position=2)]
    [Alias('usb_custom_notifications')]
    [object]$Usb
  )
  begin {
    $Param = @{
      Command = $MyInvocation.MyCommand.Name
      Endpoint = $PSCmdlet.ParameterSetName
      Format = @{ Body = @{ root = @('bluetooth_custom_notifications','usb_custom_notifications') }}
    }
  }
  process {
    @('Bluetooth','Usb').foreach{
      # Select required properties for 'bluetooth_custom_notifications' and 'usb_custom_notifications'
      [string[]]$Select = 'use_custom','custom_message'
      if ($_ -eq 'Bluetooth') {
        $PSBoundParameters.$_ = [PSCustomObject]$PSBoundParameters.$_ | Select-Object @{
          l='blocked_notification'
          e={[PSCustomObject]$_.blocked_notification | Select-Object $Select}
        }
      } else {
        $PSBoundParameters.$_ = [PSCustomObject]$PSBoundParameters.$_ | Select-Object @{
          l='blocked_notification'
          e={[PSCustomObject]$_.blocked_notification | Select-Object $Select}
        },
        @{
          l='restricted_notification'
          e={[PSCustomObject]$_.restricted_notification | Select-Object $Select}
        }
      }
    }
    Invoke-Falcon @Param -UserInput $PSBoundParameters
  }
}
function Edit-FalconDeviceControlPolicy {
<#
.SYNOPSIS
Modify Falcon Device Control policies
.DESCRIPTION
Requires 'Device control policies: Write'.
.PARAMETER InputObject
One or more policies to modify in a single request
.PARAMETER Name
Policy name
.PARAMETER Description
Policy description
.PARAMETER UsbSetting
USB settings
.PARAMETER BluetoothSetting
Bluetooth settings
.PARAMETER Propagated
Propagate policy to child environments
.PARAMETER Id
Policy identifier
.LINK
https://github.com/crowdstrike/psfalcon/wiki/Edit-FalconDeviceControlPolicy
#>

  [CmdletBinding(DefaultParameterSetName='/policy/entities/device-control/v2:patch',SupportsShouldProcess)]
  param(
    [Parameter(ParameterSetName='Pipeline',Mandatory,ValueFromPipeline)]
    [ValidateScript({
      Confirm-Parameter $_ 'Edit-FalconDeviceControlPolicy' '/policy/entities/device-control/v2:patch'
    })]
    [Alias('policies','Array')]
    [object[]]$InputObject,
    [Parameter(ParameterSetName='/policy/entities/device-control/v2:patch',Position=1)]
    [string]$Name,
    [Parameter(ParameterSetName='/policy/entities/device-control/v2:patch',Position=2)]
    [string]$Description,
    [Parameter(ParameterSetName='/policy/entities/device-control/v2:patch',Position=3)]
    [Alias('usb_settings')]
    [object]$UsbSetting,
    [Parameter(ParameterSetName='/policy/entities/device-control/v2:patch',Position=4)]
    [Alias('bluetooth_settings')]
    [object]$BluetoothSetting,
    [Parameter(ParameterSetName='/policy/entities/device-control/v2:patch',Position=5)]
    [ValidatePattern('^[a-fA-F0-9]{32}$')]
    [boolean]$Propagated,
    [Parameter(ParameterSetName='/policy/entities/device-control/v2:patch',Mandatory)]
    [ValidatePattern('^[a-fA-F0-9]{32}$')]
    [string]$Id
  )
  begin {
    $Param = @{ Command = $MyInvocation.MyCommand.Name; Endpoint = '/policy/entities/device-control/v2:patch' }
    $Param['Format'] = Get-EndpointFormat $Param.Endpoint
    [System.Collections.Generic.List[PSCustomObject]]$List = @()
  }
  process {
    if ($InputObject) {
      @($InputObject).foreach{
        # Filter to defined 'policies' properties and remove empty values
        $i = [PSCustomObject]$_ | Select-Object $Param.Format.Body.policies
        Remove-EmptyValue $i
        $List.Add($i)
      }
    } else {
      Invoke-Falcon @Param -UserInput $PSBoundParameters
    }
  }
  end {
    if ($List) {
      # Modify in groups of 100
      [void]$PSBoundParameters.Remove('InputObject')
      $Param.Format = @{ Body = @{ root = @('policies') } }
      for ($i = 0; $i -lt $List.Count; $i += 100) {
        $PSBoundParameters['policies'] = @($List[$i..($i + 99)])
        Invoke-Falcon @Param -UserInput $PSBoundParameters
      }
    }
  }
}
function Get-FalconDeviceControlNotification {
<#
.SYNOPSIS
List default Device Control notification settings
.DESCRIPTION
Requires 'Device control policies: Read'.
.LINK
https://github.com/crowdstrike/psfalcon/wiki/Get-FalconDeviceControlNotification
#>

  [CmdletBinding(DefaultParameterSetName='/policy/entities/device-control-default-settings/v1:get',
    SupportsShouldProcess)]
  param()
  process {Invoke-Falcon -Command $MyInvocation.MyCommand.Name -Endpoint $PSCmdlet.ParameterSetName }
}
function Get-FalconDeviceControlPolicy {
<#
.SYNOPSIS
Search for Falcon Device Control policies
.DESCRIPTION
Requires 'Device control policies: Read'.
.PARAMETER Id
Policy identifier
.PARAMETER Filter
Falcon Query Language expression to limit results
.PARAMETER Sort
Property and direction to sort results
.PARAMETER Limit
Maximum number of results per request
.PARAMETER Include
Include additional properties
.PARAMETER Offset
Position to begin retrieving results
.PARAMETER Detailed
Retrieve detailed information
.PARAMETER All
Repeat requests until all available results are retrieved
.PARAMETER Total
Display total result count instead of results
.LINK
https://github.com/crowdstrike/psfalcon/wiki/Get-FalconDeviceControlPolicy
#>

  [CmdletBinding(DefaultParameterSetName='/policy/queries/device-control/v1:get',SupportsShouldProcess)]
  param(
    [Parameter(ParameterSetName='/policy/entities/device-control/v2:get',Mandatory,
      ValueFromPipelineByPropertyName,ValueFromPipeline)]
    [ValidatePattern('^[a-fA-F0-9]{32}$')]
    [Alias('ids')]
    [string[]]$Id,
    [Parameter(ParameterSetName='/policy/queries/device-control/v1:get',Position=1)]
    [ValidateScript({Test-FqlStatement $_})]
    [string]$Filter,
    [Parameter(ParameterSetName='/policy/queries/device-control/v1:get',Position=2)]
    [ValidateSet('created_by.asc','created_by.desc','created_timestamp.asc','created_timestamp.desc',
      'enabled.asc','enabled.desc','modified_by.asc','modified_by.desc','modified_timestamp.asc',
      'modified_timestamp.desc','name.asc','name.desc','platform_name.asc','platform_name.desc',
      'precedence.asc','precedence.desc',IgnoreCase=$false)]
    [string]$Sort,
    [Parameter(ParameterSetName='/policy/queries/device-control/v1:get',Position=3)]
    [ValidateRange(1,5000)]
    [int32]$Limit,
    [Parameter(ParameterSetName='/policy/entities/device-control/v2:get',Position=2)]
    [Parameter(ParameterSetName='/policy/queries/device-control/v1:get',Position=4)]
    [ValidateSet('members',IgnoreCase=$false)]
    [string[]]$Include,
    [Parameter(ParameterSetName='/policy/queries/device-control/v1:get')]
    [int32]$Offset,
    [Parameter(ParameterSetName='/policy/queries/device-control/v1:get')]
    [switch]$Detailed,
    [Parameter(ParameterSetName='/policy/queries/device-control/v1:get')]
    [switch]$All,
    [Parameter(ParameterSetName='/policy/queries/device-control/v1:get')]
    [switch]$Total
  )
  begin {
    $Param = @{ Command = $MyInvocation.MyCommand.Name; Endpoint = $PSCmdlet.ParameterSetName }
    [System.Collections.Generic.List[string]]$List = @()
  }
  process { if ($Id) { @($Id).foreach{ $List.Add($_) }}}
  end {
    if ($List) { $PSBoundParameters['Id'] = @($List) }
    if ($Include) {
      Invoke-Falcon @Param -UserInput $PSBoundParameters | ForEach-Object {
        Add-Include $_ $PSBoundParameters @{ members = 'Get-FalconDeviceControlPolicyMember' }
      }
    } else {
      Invoke-Falcon @Param -UserInput $PSBoundParameters
    }
  }
}
function Get-FalconDeviceControlPolicyMember {
<#
.SYNOPSIS
Search for members of Falcon Device Control policies
.DESCRIPTION
Requires 'Device control policies: Read'.
.PARAMETER Id
Policy identifier
.PARAMETER Filter
Falcon Query Language expression to limit results
.PARAMETER Sort
Property and direction to sort results
.PARAMETER Limit
Maximum number of results per request
.PARAMETER Offset
Position to begin retrieving results
.PARAMETER Detailed
Retrieve detailed information
.PARAMETER All
Repeat requests until all available results are retrieved
.PARAMETER Total
Display total result count instead of results
.LINK
https://github.com/crowdstrike/psfalcon/wiki/Get-FalconDeviceControlPolicyMember
#>

  [CmdletBinding(DefaultParameterSetName='/policy/queries/device-control-members/v1:get',SupportsShouldProcess)]
  param(
    [Parameter(ParameterSetName='/policy/queries/device-control-members/v1:get',
      ValueFromPipelineByPropertyName,ValueFromPipeline,Position=1)]
    [Parameter(ParameterSetName='/policy/combined/device-control-members/v1:get',
      ValueFromPipelineByPropertyName,ValueFromPipeline,Position=1)]
    [ValidatePattern('^[a-fA-F0-9]{32}$')]
    [string]$Id,
    [Parameter(ParameterSetName='/policy/queries/device-control-members/v1:get',Position=2)]
    [Parameter(ParameterSetName='/policy/combined/device-control-members/v1:get',Position=2)]
    [ValidateScript({Test-FqlStatement $_})]
    [string]$Filter,
    [Parameter(ParameterSetName='/policy/queries/device-control-members/v1:get',Position=3)]
    [Parameter(ParameterSetName='/policy/combined/device-control-members/v1:get',Position=3)]
    [string]$Sort,
    [Parameter(ParameterSetName='/policy/queries/device-control-members/v1:get',Position=4)]
    [Parameter(ParameterSetName='/policy/combined/device-control-members/v1:get',Position=4)]
    [ValidateRange(1,5000)]
    [int32]$Limit,
    [Parameter(ParameterSetName='/policy/queries/device-control-members/v1:get')]
    [Parameter(ParameterSetName='/policy/combined/device-control-members/v1:get')]
    [int32]$Offset,
    [Parameter(ParameterSetName='/policy/combined/device-control-members/v1:get',Mandatory)]
    [switch]$Detailed,
    [Parameter(ParameterSetName='/policy/combined/device-control-members/v1:get')]
    [Parameter(ParameterSetName='/policy/queries/device-control-members/v1:get')]
    [switch]$All,
    [Parameter(ParameterSetName='/policy/queries/device-control-members/v1:get')]
    [switch]$Total
  )
  begin { $Param = @{ Command = $MyInvocation.MyCommand.Name; Endpoint = $PSCmdlet.ParameterSetName }}
  process { Invoke-Falcon @Param -UserInput $PSBoundParameters }
}
function Invoke-FalconDeviceControlPolicyAction {
<#
.SYNOPSIS
Perform actions on Falcon Device Control policies
.DESCRIPTION
Requires 'Device control policies: Write'.
.PARAMETER Name
Action to perform
.PARAMETER GroupId
Host group identifier
.PARAMETER Id
Policy identifier
.LINK
https://github.com/crowdstrike/psfalcon/wiki/Invoke-FalconDeviceControlPolicyAction
#>

  [CmdletBinding(DefaultParameterSetName='/policy/entities/device-control-actions/v1:post',
    SupportsShouldProcess)]
  param(
    [Parameter(ParameterSetName='/policy/entities/device-control-actions/v1:post',Mandatory,
       Position=1)]
    [ValidateSet('add-host-group','disable','enable','remove-host-group',IgnoreCase=$false)]
    [Alias('action_name')]
    [string]$Name,
    [Parameter(ParameterSetName='/policy/entities/device-control-actions/v1:post',Position=2)]
    [ValidatePattern('^[a-fA-F0-9]{32}$')]
    [string]$GroupId,
    [Parameter(ParameterSetName='/policy/entities/device-control-actions/v1:post',Mandatory,
      ValueFromPipelineByPropertyName,ValueFromPipeline,Position=3)]
    [ValidatePattern('^[a-fA-F0-9]{32}$')]
    [string]$Id
  )
  begin {
    $Param = @{
      Command = $MyInvocation.MyCommand.Name
      Endpoint = $PSCmdlet.ParameterSetName
      Format = @{ Query = @('action_name'); Body = @{ root = @('ids','action_parameters') }}
    }
  }
  process {
    $PSBoundParameters['ids'] = @($PSBoundParameters.Id)
    [void]$PSBoundParameters.Remove('Id')
    if ($PSBoundParameters.GroupId) {
      $PSBoundParameters['action_parameters'] = @(@{ name = 'group_id'; value = $PSBoundParameters.GroupId })
      [void]$PSBoundParameters.Remove('GroupId')
    }
    Invoke-Falcon @Param -UserInput $PSBoundParameters
  }
}
function New-FalconDeviceControlPolicy {
<#
.SYNOPSIS
Create Falcon Device Control policies
.DESCRIPTION
Requires 'Device control policies: Write'.
.PARAMETER Name
Policy name
.PARAMETER PlatformName
Operating system platform
.PARAMETER Description
Policy description
.PARAMETER UsbSetting
USB settings [default values will be supplied if omitted]
.PARAMETER BluetoothSetting
Bluetooth settings [default values will be supplied if omitted]
.LINK
https://github.com/crowdstrike/psfalcon/wiki/New-FalconDeviceControlPolicy
#>

  [CmdletBinding(DefaultParameterSetName='/policy/entities/device-control/v2:post',SupportsShouldProcess)]
  param(
    [Parameter(ParameterSetName='Pipeline',Mandatory,ValueFromPipeline)]
    [ValidateScript({
      Confirm-Parameter $_ 'New-FalconDeviceControlPolicy' '/policy/entities/device-control/v2:post'
    })]
    [Alias('policies','Array')]
    [object[]]$InputObject,
    [Parameter(ParameterSetName='/policy/entities/device-control/v2:post',Mandatory,Position=1)]
    [string]$Name,
    [Parameter(ParameterSetName='/policy/entities/device-control/v2:post',Mandatory,Position=2)]
    [ValidateSet('Windows','Mac','Linux',IgnoreCase=$false)]
    [Alias('platform_name')]
    [string]$PlatformName,
    [Parameter(ParameterSetName='/policy/entities/device-control/v2:post',Position=3)]
    [string]$Description,
    [Parameter(ParameterSetName='/policy/entities/device-control/v2:post',Position=4)]
    [Alias('usb_settings')]
    [object]$UsbSetting,
    [Parameter(ParameterSetName='/policy/entities/device-control/v2:post',Position=5)]
    [Alias('bluetooth_settings')]
    [object]$BluetoothSetting
  )
  begin {
    $Param = @{ Command = $MyInvocation.MyCommand.Name; Endpoint = '/policy/entities/device-control/v2:post' }
    $Param['Format'] = Get-EndpointFormat $Param.Endpoint
    [System.Collections.Generic.List[PSCustomObject]]$List = @()
  }
  process {
    if ($InputObject) {
      # Filter to defined 'policies' properties
      @($InputObject).foreach{ $List.Add(([PSCustomObject]$_ | Select-Object $Param.Format.Body.policies)) }
    } else {
      Invoke-Falcon @Param -UserInput $PSBoundParameters
    }
  }
  end {
    if ($List) {
      # Create in groups of 100
      [void]$PSBoundParameters.Remove('InputObject')
      $Param.Format = @{ Body = @{ root = @('policies') } }
      for ($i = 0; $i -lt $List.Count; $i += 100) {
        $PSBoundParameters['policies'] = @($List[$i..($i + 99)])
        Invoke-Falcon @Param -UserInput $PSBoundParameters
      }
    }
  }
}
function Remove-FalconDeviceControlPolicy {
<#
.SYNOPSIS
Remove Falcon Device Control policies
.DESCRIPTION
Requires 'Device control policies: Write'.
.PARAMETER Id
Policy identifier
.LINK
https://github.com/crowdstrike/psfalcon/wiki/Remove-FalconDeviceControlPolicy
#>

  [CmdletBinding(DefaultParameterSetName='/policy/entities/device-control/v1:delete',SupportsShouldProcess)]
  param(
    [Parameter(ParameterSetName='/policy/entities/device-control/v1:delete',Mandatory,
      ValueFromPipelineByPropertyName,ValueFromPipeline,Position=1)]
    [ValidatePattern('^[a-fA-F0-9]{32}$')]
    [Alias('ids')]
    [string[]]$Id
  )
  begin {
    $Param = @{ Command = $MyInvocation.MyCommand.Name; Endpoint = $PSCmdlet.ParameterSetName }
    [System.Collections.Generic.List[string]]$List = @()
  }
  process { if ($Id) { @($Id).foreach{ $List.Add($_) }}}
  end {
    if ($List) {
      $PSBoundParameters['Id'] = @($List)
      Invoke-Falcon @Param -UserInput $PSBoundParameters
    }
  }
}
function Set-FalconDeviceControlPrecedence {
<#
.SYNOPSIS
Set Falcon Device Control policy precedence
.DESCRIPTION
All policy identifiers must be supplied in order (with the exception of the 'platform_default' policy) to define
policy precedence.
 
Requires 'Device control policies: Write'.
.PARAMETER PlatformName
Operating system platform
.PARAMETER Id
Policy identifiers in desired precedence order
.LINK
https://github.com/crowdstrike/psfalcon/wiki/Set-FalconDeviceControlPrecedence
#>

  [CmdletBinding(DefaultParameterSetName='/policy/entities/device-control-precedence/v1:post',
    SupportsShouldProcess)]
  param(
    [Parameter(ParameterSetName='/policy/entities/device-control-precedence/v1:post',Mandatory,Position=1)]
    [ValidateSet('Windows','Mac','Linux',IgnoreCase=$false)]
    [Alias('platform_name')]
    [string]$PlatformName,
    [Parameter(ParameterSetName='/policy/entities/device-control-precedence/v1:post',Mandatory,Position=2)]
    [ValidatePattern('^[a-fA-F0-9]{32}$')]
    [Alias('ids')]
    [string[]]$Id
  )
  begin { $Param = @{ Command = $MyInvocation.MyCommand.Name; Endpoint = $PSCmdlet.ParameterSetName }}
  process { Invoke-Falcon @Param -UserInput $PSBoundParameters }
}