Public/Get-SMBeatStatus.ps1

#Requires -Version 5.1

function Get-SMBeatStatus {
    <#
    .SYNOPSIS
        Shows whether SMBeat collection is actually running (task + fresh heartbeat).
    #>

    [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,
        [string]$Path
    )

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

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

        $sb = {
            param($P)
            Import-Module SMBeat -ErrorAction Stop
            if ($P) { Get-SMBeatStatus -Path $P } else { Get-SMBeatStatus }
        }
        $invoke = @{ ScriptBlock = $sb; ArgumentList = @($Path); 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 Test-SMBeatCollector {
    <#
    .SYNOPSIS
        Returns $true when collection is healthy (task enabled and heartbeat fresh).
    #>

    [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,
        [string]$Path,
        [switch]$Detailed
    )

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

    process {
        $statuses = @()
        if ($PSCmdlet.ParameterSetName -eq 'Local') {
            $statuses = @(Get-SMBeatStatusInternal -Path $Path)
        }
        elseif ($PSCmdlet.ParameterSetName -eq 'CimSession') {
            foreach ($cs in $CimSession) {
                $statuses += Get-SMBeatStatusInternal -Path $Path -CimSession $cs -ComputerName $cs.ComputerName
            }
        }
        else {
            $sb = {
                param($P)
                Import-Module SMBeat -ErrorAction Stop
                if ($P) { Get-SMBeatStatus -Path $P } else { Get-SMBeatStatus }
            }
            $invoke = @{ ScriptBlock = $sb; ArgumentList = @($Path); 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 }
            }
            $statuses = @(Invoke-SMBeatRemoteCommand @invoke)
        }

        foreach ($status in $statuses) {
            if ($Detailed) {
                $status
            }
            else {
                [PSCustomObject]@{
                    ComputerName = $status.ComputerName
                    Result       = [bool]$status.IsCollecting
                }
            }
        }
    }
}