无法使用 Windows PowerShell“invoke-command”在远程系统上启动或执行新窗口或应用程序

Unable to Launch or Execute New Window or Applications on Remote System Using Windows PowerShell "Invoke-Command"

提问人:WayneBello 提问时间:10/27/2023 更新时间:10/28/2023 访问量:55

问:

在 Windows Powershell(管理员)中:

连接到远程 Windows

$session = New-PSSession -ComputerName "xx.xx.xx.xx"

尝试远程执行

Invoke-Command -Session $session -ScriptBlock {
            cd C:\Path
            ls
            Start-Process -FilePath "C:\Path\MyProgram.exe"
            start-Process cmd
        }

cd 和 ls 命令按预期工作,但启动进程 cmd 和 MyProgram.exe 不会启动。不显示任何窗口;它似乎被跳过了。

我还尝试了另一种方法:

PS C:\Jenkins> Enter-PSSession -Session $session
[xx.xx.xx.xx]: PS C:\Users\Administrator\Documents> Start-Process cmd
[xx.xx.xx.xx]: PS C:\Users\Administrator\Documents> (nothing happens)

两种方式都无法启动或执行新窗口或 .exe 文件。

我尝试远程执行命令并期望启动新的窗口或应用程序,但这没有发生。

Windows PowerShell 处理 invoke-command 远程执行

评论

0赞 WayneBello 10/27/2023
我已经尝试过,但仍然不起作用
0赞 Darin 10/27/2023
听起来一切正常,并且,假设文件路径正确,我担心 Start-Process 会创建一个新进程。有没有理由你不能使用 -NoNewWindow?如果你能用,会发生什么?-NoNewWindow
0赞 Darin 10/27/2023
为了进一步解释,我担心当前会话有自己的进程,任何新进程都可能不是当前会话的一部分。这就是其他地方的情况,也可能是这里正在发生的事情。
1赞 mklement0 10/27/2023
@Darin,问题不在于子进程本身的创建:对外部程序的任何调用都需要一个子进程。虽然在本地直接调用的替代方法很差,但在远程调用中,会导致子进程的输出不显示 - 直接调用原则上在远程会话中工作(在同一窗口中同步,标准流连接到 PowerShell 的流),但运行交互式控制台应用程序(例如 没有 ) 从根本上是不支持的。-Wait -NoNewWindow-NoNewWindowcmd.exe/C

答:

2赞 mklement0 10/27/2023 #1
  • 从根本上说,无论是否远程,很少有充分的理由使用 Start-Process 来调用外部程序,尤其是当它们是控制台应用程序时。

    • 若要在同一窗口中同步调用后者,并将其标准流连接到 PowerShell 的流请直接调用它们(例如& "C:\Path\MyProgram.exe")

    • 有关何时合适和不合适的指导,请参阅 GitHub 文档问题 #6239Start-Process

  • 在 PowerShell 远程处理的上下文中,还有其他陷阱:

    • 如果默认情况下会创建一个窗口,则该窗口在远程处理会话中将不可见。Start-Process

    • 此外,默认情况下,执行是异步的(在本地调用中也是如此)。

    • 虽然您可以使调用与 同步,但尝试在同一窗口中运行在远程处理中不起作用:您不会看到任何输出(在本地调用,您将看到输出,但您将无法捕获它;这就是为什么直接调用更可取的原因)。-Wait-NoNewWindow

  • 最后,PowerShell 的远程处理不支持交互式控制台应用程序


结果是

  • 假设是一个控制台应用程序,请在远程会话中使用直接调用(调用运算符,出于语法原因需要,因为您的可执行文件路径被引用):"C:\Path\MyProgram.exe"&

    & "C:\Path\MyProgram.exe"
    
  • 但是,您尝试在没有 /C 和特定命令的情况下运行,即您尝试启动交互式会话是行不通的(该进程将启动并立即悄悄退出)。cmdcmd.exe


用于远程运行交互式控制台应用程序的选项:

  • 您可以通过内置的 winrs.exe CLI 使用 Windows 远程管理,该 CLI 支持交互式控制台应用程序。Windows 远程管理使用与 PowerShell 远程处理相同的基础结构 (WSMan/WinRM),因此它很可能适用于启用了 PowerShell 远程处理的目标计算机;有关设置信息,请参阅文档

    # Enter an interactive session on computer "yourcomputer"
    winrs -r:yourcomputer cmd
    
    • 注意:
      • 您甚至可以以这种方式启动交互式 PowerShell 会话 (winrs -r:yourcomputer cmd)
      • 您传递到的任何可执行文件(如果需要,加上参数)都通过 () 隐式执行。winrs.execmd /c
  • 或者,您可以下载并使用 psexec,它也支持交互式控制台应用程序,但使用不同的远程处理机制。它具有许多高级功能。