我通过多个网站搜索了这个问题类似问题,但目前为止,这些措施均未奏效。
我的问题如下:我有两台电脑,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 用户和本地用户。我发现了一些线索:1,2,解决方案似乎是要么对每个收到的 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 是家庭版)。
如果愿意测试,请先创建一个还原点。另外,我建议创建服务条目的副本,禁用原始条目并仅使用副本。
我希望这有帮助。