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

Programs running on Hyper-V with Invoke-Command hang

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

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

如果我运行

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

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

但如果我 运行 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 中详细描述了为什么很难做到这一点。