Public/Start-SMBeatCollector.ps1

#Requires -Version 5.1

function Start-SMBeatCollector {
    <#
    .SYNOPSIS
        Enables and starts the SMBeat collector task.
    #>

    [CmdletBinding(DefaultParameterSetName = 'Local')]
    param(
        [Parameter(ParameterSetName = 'ComputerName', ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true)]
        [string[]]$ComputerName,
        [Parameter(ParameterSetName = 'CimSession')]
        [Microsoft.Management.Infrastructure.CimSession[]]$CimSession,
        [Parameter(ParameterSetName = 'Session')]
        [System.Management.Automation.Runspaces.PSSession[]]$Session,
        [pscredential]$Credential,
        [System.Management.Automation.Runspaces.AuthenticationMechanism]$Authentication,
        [switch]$UseSSL,
        [int]$Port,
        [System.Management.Automation.Remoting.PSSessionOption]$SessionOption,
        [int]$ThrottleLimit = 32,
        [switch]$PassThru
    )

    begin {
        Assert-SMBeatRemotingExclusive -ComputerName $ComputerName -CimSession $CimSession -Session $Session
    }

    process {
        if ($PSCmdlet.ParameterSetName -eq 'Local') {
            Start-SMBeatScheduledTaskInternal
            if ($PassThru) { Get-SMBeatStatusInternal }
            return
        }
        if ($PSCmdlet.ParameterSetName -eq 'CimSession') {
            foreach ($cs in $CimSession) {
                Start-SMBeatScheduledTaskInternal -CimSession $cs
                if ($PassThru) { Get-SMBeatStatusInternal -CimSession $cs }
            }
            return
        }

        $sb = {
            param($Pass)
            Import-Module SMBeat -ErrorAction Stop
            if ($Pass) { Start-SMBeatCollector -PassThru } else { Start-SMBeatCollector }
        }
        $invoke = @{ ScriptBlock = $sb; ArgumentList = @([bool]$PassThru); ThrottleLimit = $ThrottleLimit }
        if ($PSCmdlet.ParameterSetName -eq 'Session') { $invoke['Session'] = $Session }
        else {
            $invoke['ComputerName'] = $ComputerName
            if ($Credential) { $invoke['Credential'] = $Credential }
            if ($PSBoundParameters.ContainsKey('Authentication')) { $invoke['Authentication'] = $Authentication }
            if ($UseSSL) { $invoke['UseSSL'] = $true }
            if ($Port) { $invoke['Port'] = $Port }
            if ($SessionOption) { $invoke['SessionOption'] = $SessionOption }
        }
        Invoke-SMBeatRemoteCommand @invoke
    }
}

function Stop-SMBeatCollector {
    <#
    .SYNOPSIS
        Disables the SMBeat collector task without deleting samples.
    #>

    [CmdletBinding(DefaultParameterSetName = 'Local')]
    param(
        [Parameter(ParameterSetName = 'ComputerName', ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true)]
        [string[]]$ComputerName,
        [Parameter(ParameterSetName = 'CimSession')]
        [Microsoft.Management.Infrastructure.CimSession[]]$CimSession,
        [Parameter(ParameterSetName = 'Session')]
        [System.Management.Automation.Runspaces.PSSession[]]$Session,
        [pscredential]$Credential,
        [System.Management.Automation.Runspaces.AuthenticationMechanism]$Authentication,
        [switch]$UseSSL,
        [int]$Port,
        [System.Management.Automation.Remoting.PSSessionOption]$SessionOption,
        [int]$ThrottleLimit = 32,
        [switch]$PassThru
    )

    begin {
        Assert-SMBeatRemotingExclusive -ComputerName $ComputerName -CimSession $CimSession -Session $Session
    }

    process {
        if ($PSCmdlet.ParameterSetName -eq 'Local') {
            Stop-SMBeatScheduledTaskInternal
            if ($PassThru) { Get-SMBeatStatusInternal }
            return
        }
        if ($PSCmdlet.ParameterSetName -eq 'CimSession') {
            foreach ($cs in $CimSession) {
                Stop-SMBeatScheduledTaskInternal -CimSession $cs
                if ($PassThru) { Get-SMBeatStatusInternal -CimSession $cs }
            }
            return
        }

        $sb = {
            param($Pass)
            Import-Module SMBeat -ErrorAction Stop
            if ($Pass) { Stop-SMBeatCollector -PassThru } else { Stop-SMBeatCollector }
        }
        $invoke = @{ ScriptBlock = $sb; ArgumentList = @([bool]$PassThru); ThrottleLimit = $ThrottleLimit }
        if ($PSCmdlet.ParameterSetName -eq 'Session') { $invoke['Session'] = $Session }
        else {
            $invoke['ComputerName'] = $ComputerName
            if ($Credential) { $invoke['Credential'] = $Credential }
            if ($PSBoundParameters.ContainsKey('Authentication')) { $invoke['Authentication'] = $Authentication }
            if ($UseSSL) { $invoke['UseSSL'] = $true }
            if ($Port) { $invoke['Port'] = $Port }
            if ($SessionOption) { $invoke['SessionOption'] = $SessionOption }
        }
        Invoke-SMBeatRemoteCommand @invoke
    }
}