使用 Invoke-Command 挂起在 Hyper-V 上运行的程序

问题描述

我正在尝试使用 powershell Invoke-Command 在 Hyper-V VM 上运行我的软件,但没有成功。主机操作系统 -Windows 10。来宾操作系统 - 也是 Windows 10。VM Generation 1。

我做了一些简单的实验,发现了这一点:

如果我跑

Invoke-Command -VMName MY_VM -Credential $Cred -ScriptBlock { calc }

然后我就可以通过 UI 在来宾系统上看到启动的 calc.exe。

但如果我运行 mspaint 或任何非 Microsoft 程序,则没有任何反应。程序只是挂在VM TaskManager中,没有任何影响。

我还尝试使用 CLI 以多种方式调用 Invoke-Command 来运行多个不同的程序,但得到了相同的结果。

可能是什么问题?

解决方法

基本答案是 powershell 远程连接(或任何远程连接,如 rdp、ssh 等)发生在单独的登录会话中,并且不能真正相互交互。

有两种合理的方法可以做到这一点:

  1. 使用 PsExec - microsoft sysinternals 工具组的一部分。
# List sessions - note the session ID of the session you want the process to start in
quser /server:$computername
# Run a process remotely,specifying the logon ID
PsExec.exe -s -i $ID notepad.exe
  1. 使用在您登录时运行且可见的计划任务。您可以使用 powershell 的各种 New-ScheduledTask 命令来创建一个命令,或者按照脚本专家的 this guide 进行操作!使用 WMI Win32_ScheduledJob 方法。

请参阅 use powershell to start a gui program on a remote machine 以了解有关这两个选项的更多详细信息,并详细说明为什么在 Windows 中很难做到。