Skip to content

Invoke-Command -SSHConnection breaks if the HostName string is [psobject]-wrapped  #10687

@mklement0

Description

@mklement0

The root cause is that a string returned from a cmdlet call or external program has an invisible extra [psobject] wrapper, and the Invoke-Command cmdlet fails to take that possibility into account.

In short: The command below breaks, because (hostname) has such an invisible wrapper, as evidenced by (hostname) -is [psobject] being $true.

This is yet another manifestation of our old friend #5579.

The specific problem in Invoke-Command is here.

Steps to reproduce

{ icm -SSHConnection @{ Hostname = (hostname) } -ScriptBlock { 'hi' }  } | 
  Should -not -Throw

Expected behavior

The test should succeed, if the local computer is set up for being a SSH remoting target.

Actual behavior

The test fails:

Expected no exception to be thrown, but an exception 
"The provided SSHConnection hashtable parameter name or element is null or empty." was thrown from line:1 char:3

Note that using (hostname).psobject.BaseObject or "$(hostname)" or (hostname).ToString() makes the problem go away.

As an aside: if the host name were truly invalid due not being a string, the error message would be misleading, because the problem is that the entry is of the wrong type, not that it is null or empty.

A further aside: The comment above the SSHConnection parameter definition is incomplete: keys Port and Subsystem are missing.

Environment data

PowerShell Core v7.0.0-preview.4

Metadata

Metadata

Assignees

No one assigned

    Labels

    HacktoberfestPotential candidate to participate in HacktoberfestIssue-BugIssue has been identified as a bug in the productResolution-FixedThe issue is fixed.WG-Cmdlets-Corecmdlets in the Microsoft.PowerShell.Core module

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions