Private/Invoke-InfraPulseComputerTarget.ps1

function Invoke-InfraPulseComputerTarget {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory)]
        [AllowEmptyString()]
        [string]$TargetName,

        [Parameter(Mandatory)]
        [System.Collections.IDictionary]$Configuration,

        [Parameter(Mandatory)]
        [AllowEmptyCollection()]
        [string[]]$Checks,

        [string[]]$Tags = @(),

        [string]$RunId = '',

        [string]$ConfigurationFingerprint = '',

        [string]$ConfigurationSource = '',

        [System.Management.Automation.PSCredential]$Credential,

        [string]$Authentication = 'Default',

        [bool]$UseSSL = $false,

        [int]$Port = 0,

        [bool]$FailFast = $false
    )

    $reportParameters = @{
        Tags                     = $Tags
        RunId                    = $RunId
        ConfigurationFingerprint = $ConfigurationFingerprint
        ConfigurationSource      = $ConfigurationSource
    }

    $trimmedName = ([string]$TargetName).Trim()
    if ([string]::IsNullOrWhiteSpace($trimmedName)) {
        $message = 'ComputerName cannot be empty or whitespace.'
        if ($FailFast -or -not [bool]$Configuration.General.ContinueOnError) {
            throw $message
        }
        $invalidTargetName = '<empty>'
        return New-InfraPulseConnectionFailureReport -ComputerName $invalidTargetName -ErrorMessage $message @reportParameters
    }

    $ownedSession = $null
    $context = $null
    $connectionStopwatch = [System.Diagnostics.Stopwatch]::StartNew()

    try {
        if (Test-InfraPulseLocalTarget -ComputerName $trimmedName) {
            $connectionStopwatch.Stop()
            $context = [pscustomobject]@{
                RequestedComputerName = $trimmedName
                ComputerName          = [Environment]::MachineName
                Session               = $null
                OwnsSession           = $false
            }
        }
        else {
            $sessionOptions = New-PSSessionOption -OpenTimeout ([int]$Configuration.General.ConnectionTimeoutSeconds * 1000) -OperationTimeout ([int]$Configuration.General.ConnectionTimeoutSeconds * 4000)
            $sessionParameters = @{
                ComputerName   = $trimmedName
                Authentication = $Authentication
                SessionOption  = $sessionOptions
                ErrorAction    = 'Stop'
            }
            if ($null -ne $Credential) {
                $sessionParameters.Credential = $Credential
            }
            if ($UseSSL) {
                $sessionParameters.UseSSL = $true
            }
            if ($Port -gt 0) {
                $sessionParameters.Port = $Port
            }

            Write-Verbose "[$trimmedName] Opening PowerShell remoting session."
            $ownedSession = New-PSSession @sessionParameters
            $connectionStopwatch.Stop()
            $context = [pscustomobject]@{
                RequestedComputerName = $trimmedName
                ComputerName          = $trimmedName
                Session               = $ownedSession
                OwnsSession           = $true
            }
        }
    }
    catch {
        $connectionStopwatch.Stop()
        if ($FailFast -or -not [bool]$Configuration.General.ContinueOnError) {
            throw
        }
        return New-InfraPulseConnectionFailureReport -ComputerName $trimmedName -ErrorMessage $_.Exception.Message -DurationMs $connectionStopwatch.Elapsed.TotalMilliseconds @reportParameters
    }

    try {
        Invoke-InfraPulseTarget -Context $context -Configuration $Configuration -Checks $Checks -FailFast:$FailFast -Tags $Tags -RunId $RunId -ConfigurationFingerprint $ConfigurationFingerprint -ConfigurationSource $ConfigurationSource
    }
    catch {
        if ($FailFast -or -not [bool]$Configuration.General.ContinueOnError) {
            throw
        }
        New-InfraPulseExecutionFailureReport -RequestedComputerName $trimmedName -ComputerName $context.ComputerName -ErrorMessage $_.Exception.Message @reportParameters
    }
    finally {
        if ($null -ne $ownedSession) {
            Write-Verbose "[$trimmedName] Closing PowerShell remoting session."
            Remove-PSSession -Session $ownedSession -ErrorAction SilentlyContinue
        }
    }
}