From e697a58c146cae3cc1affca3e3d0e44e338904ec Mon Sep 17 00:00:00 2001
From: PowerShell Team Bot <69177312+pwshBot@users.noreply.github.com>
Date: Thu, 12 Feb 2026 12:41:20 -0500
Subject: [PATCH] [release/v7.5] Fix up `SSHConnectionInfo` ssh PATH checks
(#26165)
---
PowerShell.Common.props | 2 +-
.../PSVersionInfoGenerator.csproj | 2 +-
.../remoting/common/RunspaceConnectionInfo.cs | 44 ++++++++++++++++++-
test/Test.Common.props | 2 +-
.../ResultsComparer/ResultsComparer.csproj | 2 +-
...soft.PowerShell.NamedPipeConnection.csproj | 2 +-
.../WebListener/Controllers/GetController.cs | 4 +-
.../Controllers/MultipartController.cs | 2 +-
.../Controllers/ResponseHeadersController.cs | 2 +-
...crosoft.PowerShell.Commands.Utility.csproj | 2 +-
.../Microsoft.PowerShell.ConsoleHost.csproj | 2 +-
.../System.Management.Automation.csproj | 2 +-
12 files changed, 55 insertions(+), 13 deletions(-)
diff --git a/PowerShell.Common.props b/PowerShell.Common.props
index cfaddee74e..7436c42158 100644
--- a/PowerShell.Common.props
+++ b/PowerShell.Common.props
@@ -145,7 +145,7 @@
PowerShell 7
net9.0
- 11.0
+ 13.0
true
true
diff --git a/src/System.Management.Automation/SourceGenerators/PSVersionInfoGenerator/PSVersionInfoGenerator.csproj b/src/System.Management.Automation/SourceGenerators/PSVersionInfoGenerator/PSVersionInfoGenerator.csproj
index 7c2fd6a1a2..44449ff15b 100644
--- a/src/System.Management.Automation/SourceGenerators/PSVersionInfoGenerator/PSVersionInfoGenerator.csproj
+++ b/src/System.Management.Automation/SourceGenerators/PSVersionInfoGenerator/PSVersionInfoGenerator.csproj
@@ -7,7 +7,7 @@
netstandard2.0
- 11.0
+ 13.0
true
true
RS1035
diff --git a/src/System.Management.Automation/engine/remoting/common/RunspaceConnectionInfo.cs b/src/System.Management.Automation/engine/remoting/common/RunspaceConnectionInfo.cs
index d18eb249cb..d9a6d0b317 100644
--- a/src/System.Management.Automation/engine/remoting/common/RunspaceConnectionInfo.cs
+++ b/src/System.Management.Automation/engine/remoting/common/RunspaceConnectionInfo.cs
@@ -2206,12 +2206,54 @@ namespace System.Management.Automation.Runspaces
var context = Runspaces.LocalPipeline.GetExecutionContextFromTLS();
if (context != null)
{
- var cmdInfo = context.CommandDiscovery.LookupCommandInfo(sshCommand, CommandOrigin.Internal) as ApplicationInfo;
+ var cmdInfo = CommandDiscovery.LookupCommandInfo(
+ sshCommand,
+ CommandTypes.Application,
+ SearchResolutionOptions.None,
+ CommandOrigin.Internal,
+ context) as ApplicationInfo;
+
if (cmdInfo != null)
{
filePath = cmdInfo.Path;
}
}
+ else
+ {
+ // A Runspace may not be present in the TLS in SDK hosted apps
+ // or if running in another thread without a Runspace. While
+ // 'ProcessStartInfo' can lookup the full path in PATH, it searches
+ // the process' working directory first. 'LookupCommandInfo' does
+ // not search the process' working directory and we want to keep that
+ // behavior. We also get the parent dir of the full path to set as the
+ // new WorkingDirectory. So, we do a manual lookup here only in PATH.
+ string[] entries = Environment.GetEnvironmentVariable("PATH")?.Split(
+ Path.PathSeparator,
+ StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries) ?? [];
+ foreach (var path in entries)
+ {
+ if (!Path.IsPathFullyQualified(path))
+ {
+ continue;
+ }
+
+ var sshCommandPath = Path.Combine(path, sshCommand);
+ if (File.Exists(sshCommandPath))
+ {
+ filePath = sshCommandPath;
+ break;
+ }
+ }
+ }
+
+ if (string.IsNullOrEmpty(filePath))
+ {
+ throw new CommandNotFoundException(
+ sshCommand,
+ null,
+ "CommandNotFoundException",
+ DiscoveryExceptions.CommandNotFoundException);
+ }
// Create a local ssh process (client) that conects to a remote sshd process (server) using a 'powershell' subsystem.
//
diff --git a/test/Test.Common.props b/test/Test.Common.props
index 769b1b5b27..e28b916f73 100644
--- a/test/Test.Common.props
+++ b/test/Test.Common.props
@@ -7,7 +7,7 @@
(c) Microsoft Corporation.
net9.0
- 11.0
+ 13.0
true
true
diff --git a/test/perf/dotnet-tools/ResultsComparer/ResultsComparer.csproj b/test/perf/dotnet-tools/ResultsComparer/ResultsComparer.csproj
index a8e05fbbb9..debfbb0e1e 100644
--- a/test/perf/dotnet-tools/ResultsComparer/ResultsComparer.csproj
+++ b/test/perf/dotnet-tools/ResultsComparer/ResultsComparer.csproj
@@ -3,7 +3,7 @@
Exe
$(PERFLAB_TARGET_FRAMEWORKS)
net5.0
- 11.0
+ 13.0
diff --git a/test/tools/NamedPipeConnection/src/code/Microsoft.PowerShell.NamedPipeConnection.csproj b/test/tools/NamedPipeConnection/src/code/Microsoft.PowerShell.NamedPipeConnection.csproj
index bcd8e6011d..87fab6299e 100644
--- a/test/tools/NamedPipeConnection/src/code/Microsoft.PowerShell.NamedPipeConnection.csproj
+++ b/test/tools/NamedPipeConnection/src/code/Microsoft.PowerShell.NamedPipeConnection.csproj
@@ -10,7 +10,7 @@
1.0.0
net9.0
true
- 11.0
+ 13.0
diff --git a/test/tools/WebListener/Controllers/GetController.cs b/test/tools/WebListener/Controllers/GetController.cs
index 631886bb7e..af563d16c2 100644
--- a/test/tools/WebListener/Controllers/GetController.cs
+++ b/test/tools/WebListener/Controllers/GetController.cs
@@ -17,13 +17,13 @@ namespace mvc.Controllers
Hashtable args = new Hashtable();
foreach (var key in Request.Query.Keys)
{
- args.Add(key, string.Join(Constants.HeaderSeparator, Request.Query[key]));
+ args.Add(key, string.Join(Constants.HeaderSeparator, (string)Request.Query[key]));
}
Hashtable headers = new Hashtable();
foreach (var key in Request.Headers.Keys)
{
- headers.Add(key, string.Join(Constants.HeaderSeparator, Request.Headers[key]));
+ headers.Add(key, string.Join(Constants.HeaderSeparator, (string)Request.Headers[key]));
}
Hashtable output = new Hashtable
diff --git a/test/tools/WebListener/Controllers/MultipartController.cs b/test/tools/WebListener/Controllers/MultipartController.cs
index 56e8c2003d..5f05359779 100644
--- a/test/tools/WebListener/Controllers/MultipartController.cs
+++ b/test/tools/WebListener/Controllers/MultipartController.cs
@@ -75,7 +75,7 @@ namespace mvc.Controllers
Hashtable headers = new Hashtable();
foreach (var key in Request.Headers.Keys)
{
- headers.Add(key, string.Join(Constants.HeaderSeparator, Request.Headers[key]));
+ headers.Add(key, string.Join(Constants.HeaderSeparator, (string)Request.Headers[key]));
}
Hashtable output = new Hashtable
diff --git a/test/tools/WebListener/Controllers/ResponseHeadersController.cs b/test/tools/WebListener/Controllers/ResponseHeadersController.cs
index d5bffaefb7..f869352471 100644
--- a/test/tools/WebListener/Controllers/ResponseHeadersController.cs
+++ b/test/tools/WebListener/Controllers/ResponseHeadersController.cs
@@ -23,7 +23,7 @@ namespace mvc.Controllers
Hashtable headers = new Hashtable();
foreach (var key in Request.Query.Keys)
{
- headers.Add(key, string.Join(Constants.HeaderSeparator, Request.Query[key]));
+ headers.Add(key, string.Join(Constants.HeaderSeparator, (string)Request.Query[key]));
if (string.Equals("Content-Type", key, StringComparison.InvariantCultureIgnoreCase))
{
diff --git a/tools/packaging/projects/reference/Microsoft.PowerShell.Commands.Utility/Microsoft.PowerShell.Commands.Utility.csproj b/tools/packaging/projects/reference/Microsoft.PowerShell.Commands.Utility/Microsoft.PowerShell.Commands.Utility.csproj
index cda0bb8385..eccdcfa947 100644
--- a/tools/packaging/projects/reference/Microsoft.PowerShell.Commands.Utility/Microsoft.PowerShell.Commands.Utility.csproj
+++ b/tools/packaging/projects/reference/Microsoft.PowerShell.Commands.Utility/Microsoft.PowerShell.Commands.Utility.csproj
@@ -5,7 +5,7 @@
true
$(SnkFile)
true
- 11.0
+ 13.0
diff --git a/tools/packaging/projects/reference/Microsoft.PowerShell.ConsoleHost/Microsoft.PowerShell.ConsoleHost.csproj b/tools/packaging/projects/reference/Microsoft.PowerShell.ConsoleHost/Microsoft.PowerShell.ConsoleHost.csproj
index 37ea87be80..7f45926e29 100644
--- a/tools/packaging/projects/reference/Microsoft.PowerShell.ConsoleHost/Microsoft.PowerShell.ConsoleHost.csproj
+++ b/tools/packaging/projects/reference/Microsoft.PowerShell.ConsoleHost/Microsoft.PowerShell.ConsoleHost.csproj
@@ -5,7 +5,7 @@
true
$(SnkFile)
true
- 11.0
+ 13.0
diff --git a/tools/packaging/projects/reference/System.Management.Automation/System.Management.Automation.csproj b/tools/packaging/projects/reference/System.Management.Automation/System.Management.Automation.csproj
index d4e2b460dc..3a021bb551 100644
--- a/tools/packaging/projects/reference/System.Management.Automation/System.Management.Automation.csproj
+++ b/tools/packaging/projects/reference/System.Management.Automation/System.Management.Automation.csproj
@@ -5,7 +5,7 @@
true
$(SnkFile)
true
- 11.0
+ 13.0