【发布时间】:2016-01-25 02:06:24
【问题描述】:
我正在尝试构建一个自动运行第 3 方应用程序的 Windows 服务,我们称之为 BlackBox.exe。 BlackBox.exe 从当前用户的会话运行时运行良好,但从服务执行时失败。 BlackBox.exe 有一个 UI,但它可以通过传递命令行参数来自动化。在自动化模式下,它会显示一些 UI,读取输入文件,写入输出文件,然后在没有任何用户交互的情况下退出。我们只有 BlackBox.exe 的二进制文件。
该服务配置为使用与安装并注册 BlackBox.exe 相同的用户。
我比较了 Process Monitor 交互式会话与服务会话捕获的事件。没有注册表或文件操作在服务会话中失败并在服务会话中成功。值得注意的是,在这两种情况下都可以成功读取许可证激活的注册表项。
当从服务运行时,BlackBox.exe 在任务管理器中可见,CPU 为 0%,并且会一直保持在那里直到被杀死。
我猜想无法访问桌面导致 BlackBox.exe 失败 - 也许有一种方法可以让 BlackBox.exe 认为它可以在没有用户登录的情况下访问桌面?
如何从服务运行 BlackBox.exe?
更新: 如果我:
- 启动“交互式服务检测”服务,
- 在交互式服务检测对话框中单击“查看消息”,
- 观看 BlackBox.exe gui 执行其处理,直到我看到交互式服务检测消息“应用程序不再需要您的关注”
- 点击“立即返回”
...它工作正常。所以可能和Session 0 isolation有关
【问题讨论】:
-
为什么是服务,而不是计划任务(参见Task Scheduler)?
-
您使用的是什么版本的 Windows?
-
所以要明确一点——如果交互式服务检测服务停止,它就不起作用?如果 ISD 服务正在运行但您没有点击“查看消息”怎么办?
-
您是否在服务属性中勾选了“允许服务与桌面交互”?
-
也许这可能有用 (stackoverflow.com/questions/3128017/…) 这 (blogs.msdn.com/b/winsdk/archive/2009/07/14/…) 也可以提供帮助。