如果我使用远程桌面(终端服务)连接到办公室电脑,我可以在 Powershell 中看到我有一个 RDP 会话:
PS E:\> QWINSTA
SESSIONNAME USERNAME ID STATE TYPE DEVICE
services 0 Disc
>rdp-tcp#13 berndw 2 Active
console 4 Conn
rdp-tcp 65537 Listen
但我可以看到控制台会话可用。我知道这是因为我可以使用 VNC 登录到同一台 PC 并看到我已登录到控制台会话:
PS E:\> QWINSTA
SESSIONNAME USERNAME ID STATE TYPE DEVICE
services 0 Disc
>console berndw 2 Active
rdp-tcp 65537 Listen
什么都没有改变,我的所有窗口仍然打开,甚至是我运行 QWINSTA 的 powershell 窗口,我可以再次移动到 RDP,窗口仍然在那里,我可以移回 VNC,它们仍然在那里,也就是说,用户上下文在从终端服务会话到控制台会话的来回切换中仍然存在。
太棒了。然后呢?
好吧,我想在使用 RDP 登录时在控制台会话中运行 Windows 应用程序!如果需要,我很乐意响应登录提示进行会话切换。这可能吗?如果可以,该怎么做?Powershell 中是否有某种方法可以发出此请求,例如使用Start-Process
启动控制台终端中启动的进程(启动后很乐意切换回来)。
确实有办法做到这一点。它的运行方式如下:
- 关闭我的 RDP 客户端
- 使用 VNC 客户端连接
- 登录
- 再次连接VNC客户端
- 启动进程myapp
- 关闭 VNC
- 与 RDP 客户端连接
为什么这还不够好?因为这样做速度非常慢,而且非常令人沮丧。
步骤 4 很有趣,我应该解释一下,但我也很想学习。显然,在步骤 3 中,当我登录时,Windows(在我的情况下是 Windows 10)注意到终端服务会话 (RDP) 关闭该会话并打开控制台会话,在此切换中,主机上的 Ultra VNC 服务器断开连接。所以我必须重新连接,当我这样做时,我看到我的窗口与原来一样(所有窗口都从 RDP 会话愉快地移动到控制台会话)。然后,当我关闭 VNC 客户端并再次连接 RDP 时,我的所有窗口再次正常运行。
那么为什么要这样做呢?我承认这与如何做的问题无关,但为了满足您的好奇心,原因很简单,涉及我需要使用的一些软件,这些软件只能在控制台会话中正常启动,但 VNC 显然无法使用(它太慢了,而且我相信主机后面的防火墙限制了它,以阻止使用并鼓励使用 RDP - 我无法控制这一点,情况很简单,RDP 就像我在我的 PC 上一样,VNC 需要几秒钟来回显击键,并需要 10 秒来呈现桌面 - 正如我所说的,我无法控制这一点,不在我的影响范围内)。
因此,目前我只能通过一个令人沮丧的耗时过程来启动此应用程序。如果我能以某种方式从 RDP 会话运行它,但是在控制台会话可以让这一切消失。即使这会让我退出 RDP 并且我必须重新登录,但它比当前的 VNC 解决方案更省时,也更省心。而且,我也不能使用 Teamviewer、LogMeIn 或 Nomachine 或连接到控制台会话的任何其他程序 - 再次不受我的控制(仅支持/允许 RDP 和 VNC)
答案1
使用标准管理员权限无法正式实现这一点,但是psexec
可以提升自身权限以拥有 SeTcbPrivilege 并在任何会话中创建属于任何桌面的进程。(如果没有会话附加到控制台并且当前显示 Winlogon,那么您可能也需要该-x
选项。)
psexec -d -e -i -x notepad
还应该可以强制移动你的从 RDP 到控制台的会话使用tscon
:
psexec -e -s tscon 2 /dest:console