当没有人登录时在计算机启动时启动程序,并在有人登录时显示窗口(操作系统:Windows)


19

我有一个使用Windows Server 2012上的任务计划程序在系统启动时启动的程序即使计算机自动重新启动,该程序也必须启动。

管理员是用于启动程序的帐户,已为任务选中了选项“无论用户是否登录都运行”。

问题是当某人最终确实使用远程桌面连接以管理员身份登录时,该界面(程序窗口)被隐藏了。

据我了解,无法使用Task Scheduler解决此问题。

我该如何解决?

这应该是一个相当普遍的问题,但我无法通过搜索网络找到任何东西。我很惊讶Microsoft允许其调度程序中有这样的限制。我可以制作一个VBScript或在启动时运行并启动该程序的程序,然后在用户实际登录时可见该程序吗?

还有其他想法吗?

(我不想创建一个单独的仅GUI程序来顺便连接到原始程序。如果我不必在用户登录时终止已运行的程序然后启动,我也希望使用它再来一次。)


2
Firedaemon,使用Firedaemon在RDP切换到“会话0”时将其作为服务安装。查看应用程序。
TheCleaner 2014年

如果您开发自己的服务,从技术上讲可以做到这一点。
Ryan Ries 2014年

1
刚刚回答了我自己的问题。但是我两天都无法接受自己的回答,因为serverfault.com上的系统非常糟糕(大多数人现在不等待两天就放弃此页面,并将问题永远标记为未解决)。
Marcus

2
@Marcus:限制谁可以做什么以及什么时候可以阻止某些滥用行为。不幸的是,它们有时确实给真正做正确的事情带来不便,但是有时需要做出这样的妥协。如果您的建议可能会改善这种情况(至少也要保护该站点,但给真正的用户带来不便),那么最好通过相关的“元”站点(meta.serverfault.commeta)提出想法。 stackoverflow.com)而不是在评论中抱怨网站运行者不太可能看到。
David Spillett 2014年

从投票中可以看出,您要接受的答案不是人们认可的答案,因为您尝试这样做的方法一开始是错误的。
JamesRyan 2014年

Answers:


28

自己弄清楚怎么做。这是一种解决方法,但这是我期望得到的。

停止!暂时不要畏缩。继续阅读...

  • 运行它,进行设置,以便管理员应自动登录。

  • 在任务计划程序中创建一个任务。将其设置为仅在用户(管理员)登录时运行。触发器是“登录时”,并指定只有管理员登录时才触发。

  • 创建第二个任务。仅在用户登录时运行,在管理员登录时触发。操作应为“启动程序”,程序为“ C:\ Windows \ System32 \ rundll32.exe”,并将参数字段设置为“ user32.dll,LockWorkStation”。

现在,如果重新启动计算机,将发生以下情况:管理员自动登录,启动了要启动的程序,并且工作站被锁定。如果我通过远程桌面连接登录,则可以看到程序窗口并使用GUI。我可以毫无问题地锁定/解锁计算机,也可以根据需要断开/重新连接。如果我转到服务器并在实际的工作站上登录也没有问题。由于管理员已经登录,因此该任务将不会再次运行(它不会创建一些您无法打破的无限登录锁循环)。

就那么简单。可以肯定的是,在自动登录后计算机被锁定之前还有一秒钟的时间,我认为可以物理访问计算机的专业黑客可能会在此时间段内偷偷摸摸地做些事情,但就我而言,我可以忽略这种安全风险。只要我不让任何专业黑客进入我的家,并向他们展示计算机,系统就应该相对安全。最重要的是,计算机上需要超级保管保护的价值不高,因此我对该解决方案感到非常满意。


7
马克斯(Marcus),请不要无礼(或低估)。但是,如果这真的是您正在寻找的答案类型,那么这个问题对SuperUser更合适。
Ryan Bolger 2014年

2
决定发布哪个堆栈交换并不容易。
Marcus 2014年

嗨,马库斯,我按照您的回答,但是在用GUI启动两个程序而不是一个时遇到问题。我在中发布了一个问题SuperUser。如果你能回答它有这将是一个很大的帮助- superuser.com/questions/902386/...
user2162550

1
实际上,现在也对此投票,因为这不是问题的答案。该问题明确定义了正午登录-您的“解决方案”将自动登录(因此有人登录)。在这个问题中也许并不是明智的选择,但问题仍然存在。
TomTom

1
@TomTom作为呈现给最终用户的选项,“无论用户是否登录都运行”肯定意味着“您不必在这里照看即可确保它启动。”
Aryeh Leib Taurog

16

我有一个使用Windows Server 2012上的任务计划程序在系统启动时启动的程序。即使计算机自动重新启动,该程序也必须启动。

那为什么不按照Windows规范定义它成为系统服务呢?

我该如何解决?

你不能。后台程序不应与UI交互。或者:UI应该运行它自己的程序,然后连接到服务。在登录用户的用户空间中运行的UI进行演示,Windows服务进行处理。这就是模型设计可能长达15年左右的方式。

我很惊讶Microsoft允许其调度程序中有这样的限制。

更令您惊讶的是,您从来没有刻薄地问为什么。

存在多个问题:

  • 当多个人登录时,谁得到用户界面?
  • 当用户注销时,您杀死程序了吗?哎哟。
  • 安全。后台程序可以在有限的权限下运行-将UI暴露给用户意味着用户可以在那里执行代码。Windows消息传递模型非常-充满问题。

我不想制作一个单独的仅GUI程序,该程序可以顺便连接到原始程序。

在这一点上,我和Microsoft都不在乎您喜欢做什么。有一个已建立并受支持的模型,可以将后台处理与登录的用户界面相关联-是否使用它。但是,如果没有,请不要抱怨您提出的安全问题。


3
阿们 我希望更多的应用程序供应商能够掌握这一概念。
Ryan Bolger 2014年

15
哇,你不是在态度上自大。好吧,猜猜我运气不好。除非您被错误告知,并且有人有某种方法可以解决此问题,否则每个人都不会一无所知,因此您可能对帖子中绝对的“您不能”部分有误。我想将问题开放一段时间,以获取更多答案,以防万一有人共享一个不常见的解决方法。否则,我会接受您的回答。
Marcus

现在,在当前版本的Windows上将UI赋予服务实际上越来越困难,但并非没有可能。
MDMoore313 2014年

由于主要出于安全考虑,因此积极不希望这样做。这里的主要问题是-您确实需要得到它-如果您在我的UI中显示一个窗口,那么我可以在您的流程中执行代码。然后,我可以向您发送Windows消息,其中包含大量可以利用的东西。通常这不是问题-因为如果它是一个用户应用程序,那么我只能做我作为用户可以做的事情....但是,如果该服务具有更高的特权,那么这就是安全性的噩梦。这就是为什么很多年前关闭它的原因,并且所有学习编程并阅读文档的人都应该读过它
TomTom 2014年

1
如果您真的想去那里,可以尝试coretechnologies.com/WindowsServices/FAQ.html#GUIServices中的步骤-不确定它们是否仍可在当前窗口中使用,但是有一些方法可以使用户界面可访问-并打开所有安全问题。
TomTom 2014年

0

一切都与Session您的程序在其中运行有关。如果没有人登录,则没有任何交互式会话可以在下面显示,我相信它在下运行Session 0,它具有一个怪异的UI,不会像其他人一样显示。

现在,如果您的程序检测到explorer.exe启动的时间(或其他检测用户登录的方式)并神奇地改变了自身的形态或在该新的sessionid上生成了一些子进程,那么登录的任何人都将很高兴看到您在做什么。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.