从 Linux 计算机远程执行 Windows 10 中的命令/脚本

从 Linux 计算机远程执行 Windows 10 中的命令/脚本

我的目标是从同一私有网络内的 Ubuntu 主机在 Windows 10 机器上启动一个简单的 AutoHotKey 脚本。在谷歌搜索后,我发现操作系统,听起来它可以做我想做的事,但经过多次尝试,我还是无法将其连接到 Windows 10(“无法打开连接 - NT_STATUS_CONNECTION_RESET”,进一步谷歌搜索没有帮助)。作为第二个解决方案,我在 Windows 机器上安装了 SSH 服务器(Bitvise SSH 服务器)。现在我可以通过 ssh 从 Ubuntu 登录到 Windows 或只是在 Windows 机器上运行命令:

$ ssh user@windowsmachine command

这适用于常规命令,如 DIR、MKDIR 等,但不适用于 AutoHotKey 脚本。例如,

$ ssh user@windowsmachine 'C:\path\to\script.ahk'

在 Windows 机器上没有任何反应(本地启动,此测试脚本仅显示一个问候消息框)。以下尝试也不起作用:

$ ssh user@windowsmachine '"C:\Program Files\AutoHotkey\AutoHotkey.exe" C:\path\to\script.ahk'
$ ssh user@windowsmachine 'cmd.exe /c C:\path\to\script.ahk'

更新:这个技巧几乎成功了。例如,它确实启动了 calc.exe:

$ ssh user@windowsmachine calc.exe

但是,如果我启动 notepad.exe 或任何其他应用程序,我会看到它们在任务管理器中作为后台进程运行,没有 GUI。(我不知道 calc.exe 为何如此特殊,以至于它运行正常)。我还设法修复了 winexe 的问题,但情况与 ssh 完全相同 - 除了 calc.exe,所有 GUI 应用程序都作为后台进程启动。这个问题正在讨论中这里。因此,最重要的是,从 Linux 主机运行 Windows 10 中的 GUI 应用程序需要付出巨大的努力。因此,我刚刚用 Qt 5 编写了自己的客户端-服务器应用程序,它监听某个端口,并在从另一台主机收到用户定义的命令时运行相应的应用程序/脚本。

答案1

Windows 使用会话向用户显示 GUI 应用程序。您的 ssh 服务器可能是由 SYSTEM 用户在会话 0 中运行的 Windows 服务,该服务没有图形显示。因此,您将看不到正在启动的应用程序的 GUI。

您可以使用Sysinternals 进程浏览器。启动后(以管理员身份),右键单击列栏,单击“选择列”,然后添加“会话”、“UI 访问”、“用户名”和“完整性级别”。这些信息将显示每个进程在哪个上下文中运行该应用程序(“会话”),是否显示窗口(“UI 访问”),在哪个帐户下执行(“用户名”)以及使用什么权限(“完整性级别”,高表示作为管理员)。

现在,如果你想在用户会话中从 ssh 服务器执行应用程序,你可以使用另一个 Sysinternals 实用程序来执行此操作,该实用程序名为执行程序: psexec -i <session number> -accepteula <application to execute>。如果您希望以普通用户身份运行该进程,您也可以使用参数-u,并且如果您愿意,可以使用 剥夺权限-l。查看运行帮助psexec -?

要查找会话数,您也可以运行命令qwinsta。这样,您就不需要 Process Explorer GUI 应用程序了。

例如,要运行计算器,请执行以下操作:从 ssh 会话运行qwinsta,它将为您提供类似以下内容的内容:

C:\>qwinsta
SESSIONNAME       USERNAME                 ID  STATE   TYPE        DEVICE
services                                    0  Disc
console           john.doe                  1  Active

因此,您要使用的会话1在此示例中(对您来说可能有所不同)。然后执行psexec -i 1 -accepteula calc.exe。计算器现在应该显示在您的桌面上。(-accepteula第一次执行应用程序时绝对需要。如果没有这个,应用程序将在 GUI 窗口中向您显示许可协议,当然,由于上述原因,它不会显示。在后续调用中,您可以忽略该参数,因为一旦接受,GUI 窗口将不会再次显示)

如果您在autohotkey.exe命令前加上psexec如上所述的前缀,我希望脚本能够正常工作,但由于我不了解该应用程序,所以我无法自己测试。

相关内容