如何在 Windows 10 上通过 SSH 正常终止应用程序?

如何在 Windows 10 上通过 SSH 正常终止应用程序?

我通过多个网站搜索了这个问题类似问题,但目前为止,这些措施均未奏效。

我的问题如下:我有两台电脑,A 运行 Windows 10,B 运行 Linux。我在 Windows 上运行记事本。如果我进入 cmd 并输入“taskkill /im“notepad.exe”“,一切都运行正常,即使我没有以管理员身份打开 cmd。但是,如果我从 Linux ssh 到 Windows,并执行相同的命令,我会收到错误:

ERROR: The process "notepad.exe" with PID 18756 could not be terminated.
Reason: This process can only be terminated forcefully (with /F option).

请注意,我正在通过 ssh 连接到该机器的唯一用户。

出于某些原因,我需要能够正常终止某个应用程序,因为这样它会自动保存我所做的任何更改。如果我通过“taskkill /f /im“notepad.exe”“,我会丢失我可能忘记保存的所有进度。

我已经进入 Windows 上的计算机管理并尝试将“sshd”用户添加为管理员成员,但是没有用(我甚至不知道它为什么会起作用,因为我正在通过 ssh 进入我自己的用户)。

我尝试通过 ssh 打开 cmd 的管理员会话,但也没有成功。看来问题不在于权限。我还尝试过“wmic 进程,其中 name="processname.exe" 调用终止“,但这也太强制关闭了一切。似乎需要使用“taskkill /im”

有人知道我该怎么做吗?

更新:绝望之下,我无视任何安全常识,自己编写了一个简单的控制台应用程序,该应用程序将使用键盘挂钩向我经常需要保存和/或关闭的应用程序发送“CTRL + S”键盘消息。瞧,Windows 比我想象的要安全。我可以从本地 PC 顺利运行控制台应用程序,但尝试通过 ssh 运行会失败,因为应用程序无法使用 FindWindow() 找到窗口,这肯定是一种安全措施。说实话,我现在感觉有点傻。仍然没有积极的更新。

更新 2:另一个怪异之处是:通过 ssh 打开 GUI 软件不会在机器中打开它们。它显示在任务管理器上,但实际上并没有打开。此外,即使通过 ssh 打开,它仍然无法通过 ssh 正常终止,方法是使用“taskkill/im“。正如 Eduardo Bissi 所评论的那样,这很可能是由于 Windows 为不同的用户管理不同的会话,具体来说,就是 SSH 用户和本地用户。我发现了一些线索:12,解决方案似乎是要么对每个收到的 UDP 包调用 Shellexecute,这听起来非常不安全,要么使用不同的第三方 SSH 服务器。我已经放弃了一半。

更新 3:我创建了一个在我的计算机上运行的 Flask 服务器,当有人向 mymachine:5000/Save 发送 GET 请求时,它会自动运行我之前创建的控制台应用程序,该应用程序使用键盘钩子向应用程序发送“Ctrl + S”键盘消息,从而保存我的所有进度。然后我可以放心地强制退出。由于服务器是由本地用户启动的,而不是通过 SSH 启动的,因此运行它没有任何问题。这是有史以来最愚蠢的事情。

答案1

Windows 在单独的 桌面 并将它们完全隔离。在桌面之间传递消息或命令非常困难,这是一种重要的安全机制,不仅用于用户会话,还用于系统服务。

在我提出的解决方案中,我将使用免费的 自动热键 这样:AutoHotkey 脚本将持续运行,每秒检查文件是否存在C:\Temp\switch。一旦发现文件被删除,它将对所有notepad.exe进程执行菜单项文件 > 保存文件 > 退出,然后下次重新创建该文件。

这样,您在 SSH 会话中需要做的就是删除上述文件。记事本将保存其内容并退出,无需运行taskkill,下次将重新创建该文件。

要使用的 AutoHotkey 脚本是:

#Persistent                                                 ; stay resident

SetTimer, CheckSwitch, 1000                                 ; run every 1000 milliseconds
return

CheckSwitch:                                                ; executing each time this code
if !FileExist("C:\Temp\switch") {                           ; if the file "C:\Temp\switch" was deleted 
    WinMenuSelectItem, ahk_exe notepad.exe, , File, Save    ; press menu File > Save
    Sleep, 500                                              ; wait 500 milliseconds
    WinMenuSelectItem, ahk_exe notepad.exe, , File, Exit    ; press menu File > Exit
    Run, %comspec% /c echo waiting > "C:\Temp\switch"       ; create the file anew
}
return

安装 AutoHotKey 后,将脚本放入.ahk文件中并双击进行测试。您可以通过右键单击托盘栏中的绿色 H 图标并选择退出来停止脚本。要让它在登录时运行,请将其放在 的启动组中 C:\Users\USER-NAME\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup

答案2

我的猜测是,尽管您使用同一个用户进行连接,但如果存在这样的情况,则命令不会在同一个“会话空间”中执行。我能够通过使用第二个用户(不通过 SSH)和runas第一个用户重现此行为。

SSH 服务由用户 执行"NT Service\SSHD",因此是不同的用户。您可能如果让它与用户一起运行,则可以实现所需的结果,但我不知道这样做的含义。不幸的是,我无法在这里测试(我的 Windows 10 是家庭版)。

如果愿意测试,请先创建一个还原点。另外,我建议创建服务条目的副本,禁用原始条目并仅使用副本。

我希望这有帮助。

相关内容