![在无人登录时在计算机启动时启动程序,并在有人登录时显示窗口(操作系统:Windows)](https://linux22.com/image/629345/%E5%9C%A8%E6%97%A0%E4%BA%BA%E7%99%BB%E5%BD%95%E6%97%B6%E5%9C%A8%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%90%AF%E5%8A%A8%E6%97%B6%E5%90%AF%E5%8A%A8%E7%A8%8B%E5%BA%8F%EF%BC%8C%E5%B9%B6%E5%9C%A8%E6%9C%89%E4%BA%BA%E7%99%BB%E5%BD%95%E6%97%B6%E6%98%BE%E7%A4%BA%E7%AA%97%E5%8F%A3%EF%BC%88%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%EF%BC%9AWindows%EF%BC%89.png)
我有一个程序,它使用 Windows Server 2012 上的任务计划程序在系统启动时启动。即使计算机自动重启,该程序也必须启动。
Administrator 是用于启动该程序的帐户,该任务的选项为“无论用户是否登录都运行”。
问题在于,当某人最终使用远程桌面连接以管理员身份登录时,界面(程序窗口)被隐藏。
据我了解,没有办法使用任务计划程序来解决这个问题。
我该如何解决这个问题?
这应该是一个相当常见的问题,但我在网上搜索找不到任何东西。我很惊讶微软允许在他们的调度程序中进行这样的限制。我可以制作一个 VBScript 或类似的东西在启动时运行并启动程序,然后在用户实际登录时可见吗?
还有其他想法吗?
(顺便说一下,我不想必须制作一个单独的仅 GUI 程序来连接到原始程序。如果我不必在用户登录时终止已经运行的程序然后再次启动它,我会更喜欢它。)
答案1
自己想出了怎么做。这有点像变通方法,但这正是我期望得到的。
- 好的,第一步是从 Microsoft 获取一个名为 AutoLogon.exe 的程序:
http://technet.microsoft.com/sv-se/sysinternals/bb963905.aspx
停下来!先不要畏缩。继续阅读...
运行它,将其设置为管理员自动登录。
在任务计划程序中创建一个任务。将其设置为仅在用户(管理员)登录时运行。触发器为“登录时”,并指定仅在管理员登录时运行。
创建第二个任务。仅在用户登录时运行,在管理员登录时触发。操作应为“启动程序”,程序为“C:\Windows\System32\rundll32.exe”,参数字段设置为“user32.dll,LockWorkStation”。
现在,如果您重新启动计算机,管理员将自动登录,您要启动的程序将启动,工作站将被锁定。如果我通过远程桌面连接登录,我可以看到程序窗口并使用 GUI。我可以毫无问题地锁定/解锁计算机,并随意断开/重新连接。如果我转到服务器并在实际工作站上登录,也不会出现问题。由于管理员已经登录,因此任务将不会再次运行(它不会创建您无法摆脱的无限登录锁定循环)。
就这么简单。当然,在自动登录后,计算机被锁定前有一秒钟的时间,我猜一个拥有计算机物理访问权限的专业黑客可能会在这段时间内做一些鬼鬼祟祟的事情,但就我而言,我可以忽略这个安全风险。只要我不让任何专业黑客进入我家并向他们展示计算机,系统就应该相对安全。最重要的是,计算机上没有太多需要超级保险库保护的价值,所以我对这个解决方案很满意。
答案2
我有一个程序,它在 Windows Server 2012 上使用任务计划程序在系统启动时启动。即使计算机自动重新启动,该程序也必须启动。
那么为什么不像 Windows 规范所定义的那样将其作为系统服务呢?
我该如何解决这个问题?
你不能。后台程序不应该与 UI 交互。或者:UI 应该运行自己的程序,然后连接到服务。在登录用户的用户空间中运行的 UI 进行演示,Windows 服务进行处理。大约 15 年来,该模型的设计方式就是这样的。
我很惊讶微软在他们的调度程序中允许这样的限制。
更让我惊讶的是,你从来没有问过为什么。
存在多个问题:
- 当多人登录时,谁可以获得 UI?
- 当用户退出时,您会终止该程序吗?哎哟。
- 安全性。后台程序可能在有限的权限下运行 - 向用户公开 UI 意味着用户可以在那里执行代码。Windows 消息传递模型 - 啊 - 充满了问题。
顺便说一句,我不想必须制作一个单独的仅具有 GUI 的程序来连接到原始程序。
目前,我和微软都不在乎你喜欢做什么。有一个既定且受支持的模型可以将后台处理与登录用户 UI 绑定在一起 - 使用它,或者不使用它。但如果不使用,请不要抱怨你提出的安全问题。
答案3
这完全取决于Session
您的程序在其中运行。如果没有人登录,则没有可显示的交互式会话,我相信它是在下运行的Session 0
,它有一个奇怪的用户界面,不会像其他的一样显示。
现在,如果您的程序检测到explorer.exe
启动时间(或以其他方式检测用户登录)并神奇地重塑自身或在新的 sessionid 上生成一些子进程,那么任何登录的人都会很高兴地看到您正在做的事情。