Invoke-Command -SSHConnection breaks if the HostName string is [psobject]-wrapped
See original GitHub issueThe 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
Issue Analytics
- State:
- Created 4 years ago
- Reactions:1
- Comments:7 (2 by maintainers)
@iSazonov Yeah I can grab it
@SeeminglyScience Can you grab this? I already have over 15 opened PRs but I’d prefer to get the null reference exception fixed before GA.