我知道如何在 Windows 主机启动时自动打开控制台会话(推荐的方法是使用加密密码:https://docs.microsoft.com/en-us/sysinternals/downloads/autologon)。
当服务器运行一个需要 GUI 运行的编写不当的程序时,这很有用,而它应该作为服务运行,或者至少在后台运行。
一旦会话打开,屏幕就可以锁定,程序可以继续工作。管理员甚至可以使用 RDP 与另一个会话通信(这也会锁定控制台会话)。到目前为止,我还没有看到任何例外。
这种方法会导致一些问题。其中一些最大的问题是:
- 控制台上有一个会话处于完全打开状态。服务器前面的任何人都可以完全访问此会话,否则任何点击未监控的键盘/鼠标的行为都可能导致灾难。我们可以通过较短的屏幕超时来缓解这种情况
- 这种方式只能打开一个会话。所以当我们需要它来处理两个不同且非共存的程序时,我们就麻烦了
我想在服务器启动时自动打开几个非控制台会话。就好像打开了几个远程桌面会话然后又断开了一样。然后,相关程序可以在单独的会话中使用 GUI 运行。--
> 知道如何实现吗?
答案1
mstsc.exe
可以在没有 GUI 的情况下运行,这通常没什么用,但在这种情况下非常有用。
您可以创建一个在计算机启动时触发的计划任务。
此任务将启动任意数量的远程桌面会话,然后终止它们,使会话保持活动状态并断开连接。
我个人使用计划任务调用的批处理(.cmd):
start c:\windows\system32\mstsc.exe "c:\path\do_it.rdp"
timeout /nobreak /t 60
taskkill /f /im mstsc.exe
我有一个更复杂的方法来杀死 mstsc.exe,它是针对我的具体需要的,所以我只把一个基本的 taskkill 作为例子。
答案2
为了准确实现您的要求,您至少需要一个带有 GUI 的 Linux 或 Windows Server 来放置脚本。
在 linux/bash 中我编写了一个脚本ping监控脚本在服务器可能重新启动(ping 一段时间)后运行命令。该命令将是一个脚本,在后台运行两次 rdp 客户端,使用预先接受的证书和有效的存储凭据(每个连接一个)连接到您问题的服务器对象。然后我会用
sleep 60 && killall -9 rdpclientname
(因为终止 rdp 客户端不会终止远程会话,这是您想要实现的一部分)。
我相信你可以轻松地做到这一点Windows 批处理如果您希望使用 Windows 作为客户端,则可以使用 而不是 bash。只是我不确定您是否可以从同一个 Windows 客户端到同一个 Windows 服务器建立多个连接。我认为,至少您必须使用两个不同的用户运行该脚本两次。如果不能,您必须将此类脚本放在两台不同的 Windows 客户端计算机上。
如果您选择使用 Windows 客户端,则由 ping 监控脚本激活的第二个脚本调用的二进制文件将是 mstsc.exe,并将具有 rdp-for-your-server-saved-session.rdp 的完整路径,其中包含预先接受的证书和有效凭据。
在 Windows 客户端上,您可以使用 srv2any 运行 mstsc,脚本只会启动和停止这两个服务。在 Windows 上,您将使用任务调度程序,在 Linux 上,则使用 crontab。
为了使此功能按您的意愿工作,您必须禁用 Windows 服务器上的自动登录。然后,您可以按照以下步骤实现延迟本地登录这。
当然,这种解决方案也有一定比例的失败,ping 监控脚本观察到的停机时间不是由于服务器重启造成的。但在这种情况下,两次自动不必要的登录不会造成太大影响。
为了实现这一目标,你必须努力工作和测试。这就是为什么以下内容... 在建立这样的安排之前,我愿意尝试任何可能的事情!
无论如何,正如我在对你的问题的评论中所建议的那样,我会尝试通过服务器上的 srv2any 启动这个编码错误的程序。你在问题中没有提到这个尝试。你试过了吗?