提问人:WayneBello 提问时间:10/27/2023 更新时间:10/28/2023 访问量:55
无法使用 Windows PowerShell“invoke-command”在远程系统上启动或执行新窗口或应用程序
Unable to Launch or Execute New Window or Applications on Remote System Using Windows PowerShell "Invoke-Command"
问:
在 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 文件。
我尝试远程执行命令并期望启动新的窗口或应用程序,但这没有发生。
答:
从根本上说,无论是否远程,很少有充分的理由使用
Start-Process
来调用外部程序,尤其是当它们是控制台应用程序时。若要在同一窗口中同步调用后者,并将其标准流连接到 PowerShell 的流,请直接调用它们(例如
& "C:\Path\MyProgram.exe"
)有关何时合适和不合适的指导,请参阅 GitHub 文档问题 #6239
Start-Process
在 PowerShell 远程处理的上下文中,还有其他陷阱:
如果默认情况下会创建一个新窗口,则该窗口在远程处理会话中将不可见。
Start-Process
此外,默认情况下,执行是异步的(在本地调用中也是如此)。
虽然您可以使调用与 同步,但尝试在同一窗口中运行在远程处理中不起作用:您不会看到任何输出(在本地调用中,您将看到输出,但您将无法捕获它;这就是为什么直接调用更可取的原因)。
-Wait
-NoNewWindow
最后,PowerShell 的远程处理不支持交互式控制台应用程序。
结果是:
假设是一个控制台应用程序,请在远程会话中使用直接调用(调用运算符,出于语法原因需要,因为您的可执行文件路径被引用):
"C:\Path\MyProgram.exe"
&
& "C:\Path\MyProgram.exe"
但是,您尝试在没有
/C
和特定命令的情况下运行,即您尝试启动交互式会话是行不通的(该进程将启动并立即悄悄退出)。cmd
cmd.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.exe
cmd /c
- 您甚至可以以这种方式启动交互式 PowerShell 会话 (
- 注意:
或者,您可以下载并使用
psexec
,它也支持交互式控制台应用程序,但使用不同的远程处理机制。它具有许多高级功能。
评论
-NoNewWindow
-Wait -NoNewWindow
-NoNewWindow
cmd.exe
/C