检测系统重启并启动应用程序

Posted

技术标签:

【中文标题】检测系统重启并启动应用程序【英文标题】:Detect System reboot and start an App 【发布时间】:2015-07-28 04:26:36 【问题描述】:

我们有一个实际检查文件夹内容的 exe,然后启动 Windows 服务对该文件夹中的文件进行一些处理。 因此,我们将此 exe 作为系统启动程序的一部分,以便在每次系统重新启动/启动时运行。

现在用户非常恼火,因为他每次重新启动时都会弹出 UAC。但是我们需要拥有这个exe的管理员权限,因为它启动了一个windows服务。因此,我研究并为这个问题找到了几个解决方案。 This 和 This 但无法决定哪个更好,更不易受到安全影响。 另一种可能的解决方案是 .exe 本身的代码检测系统启动,如果我们在目标文件夹中有任何内容,则只向用户询问 UAC 并启动 Windows 服务。否则只是不运行exe。我不确定如何在 C++ 中执行此操作。任何指针都会有所帮助。如果有更好的解决方案,欢迎随时欢迎。

【问题讨论】:

为什么要从应用程序启动服务?为什么不让 windows 启动服务并从应用程序向它发送消息? 你能否详细说明一下.. 您是否意识到,如果您将服务配置为自动启动,Windows 会在每次系统启动时为您启动它?从你的帖子中看不出你为什么想要一个应用程序。为什么不只提供服务而不提供其他服务? 这充当父应用程序和 Windows 服务本身之间的接口......它向用户显示该服务将对文件夹内容进行的处理状态...... 第一个链接(禁用 UAC)比 UAC 警告更让我生气。事实上,关闭安全功能可能会让您对任何后续的安全问题负责。 【参考方案1】:

您可能想在此处使用任务计划程序。 只需在安装过程中创建一个任务,将“计算机启动时”作为触发器,然后设置“以最高权限运行”安全选项。

【讨论】:

这就是我们在这里所做的对吧?但是通过一个可以在系统启动时运行的应用程序 是的,您可以安排一个计划任务在启动时运行您的 exe,并且“以最高权限运行”会抑制 UAC 提示,以便您可以启动服务。 好吧……听起来不错……因为用户只需安装一个工具,通过它我们的 exe 也将被安装/复制……你的意思是在每台用户机器上创建这个任务?或者只是在安装父工具时以编程方式创建此任务?在这两种情况下,您是否有一些示例代码可以让我们开始调整?【参考方案2】:

问题在于您混淆了系统会话和用户会话。

如果这些文件的处理是代表用户完成的,那么它可能不应该由服务完成。如果两个用户想要处理他们的文件怎么办?服务应该为此使用什么安全上下文?显然,您不需要管理员权限来处理某些用户文件。

如果服务正在执行某些系统级任务,它不应该依赖于用户。事实上,在启动时运行表明您需要这种模式。 (用户小程序在登录时启动,而不是在重新启动后)。因此,您设计中的主要问题似乎是您尝试在错误的时刻运行应用程序(带有 UI),这需要太多权限(导致 UAC)。重新设计服务,使其完成所有需要管理员权限的任务,并在安装服务时将其设置为自动启动。这在安装时仍然需要 UAC,但这是需要 UAC 的时候。

【讨论】:

只有一个用户会一直使用系统。他只是登录,完成一个触发这个exe的进程。这将检查文件夹中的文件并启动 Windows 服务,该服务从那时起负责处理它。因此,服务没有执行系统级任务。它只是将这些文件放在文件夹中并将其上传到另一台机器上的另一台服务器的一种手段。这就是它的全部用途。 @Programmerzzz:IMO 这意味着你不应该首先使用服务。常规应用程序也可以。你甚至可以考虑BITS 这是有道理的,但是这个应用程序是在 10 多年前编写的,我排了很长时间的队列。如果我必须更改实施,我不确定需要在多大程度上对其进行修改。再告诉我一件事,我们是否需要强制管理员权限才能通过应用程序启动/停止/查询 Windows 服务的状态? @Programmerzzz:Windows 具有基于用户的安全性,应用程序无关紧要。默认情况下,“本地认证用户”会错过SERVICE_START rights。这是fixable

以上是关于检测系统重启并启动应用程序的主要内容,如果未能解决你的问题,请参考以下文章

将java程序注册成windows服务自启动并异常退出自动重启

如何启动,关闭和重启VMware vCenter Server Appliance服务

win10无限重启解决办法是啥?

浪潮服务器,断电后重启不能正常启动

windows的切换用户、注销和重新启动有啥区别?

debian安装重启时的问题