第三方应用程序从服务运行时失败

我正在尝试构build一个可以自动运行第三方应用程序的Windows服务,我们称之为BlackBox.exe。 BlackBox.exe在从当前用户会话运行时运行正常,但从服务执行时失败。 BlackBox.exe有一个用户界面,但可以通过传递命令行参数来自动执行。 在自动模式下,它显示一些用户界面,读取input文件,写入输出文件,然后退出,没有任何用户交互。 我们只有BlackBox.exe的二进制文件。

该服务被configuration为使用BlackBox.exe安装并注册的相同用户。

我已经比较了Process Monitor交互式会话与服务会话捕获的事件。 没有任何registry或文件操作在服务会话失败并成功进行服务会话。 值得注意的是,在这两种情况下,许可证激活的registry项都被成功读取。

当从服务运行BlackBox.exe是可见的任务pipe理器与0%的CPU,并将保持在那里,直到死亡。

我猜缺less访问桌面导致BlackBox.exe失败 – 也许有一种方法愚弄BlackBox.exe认为它有权访问桌面,而无需用户login?

我如何从服务中运行BlackBox.exe?

更新:如果我:

  • 启动“交互式服务检测”服务,
  • 单击“交互式服务检测”对话框中的“查看消息”
  • 观看BlackBox.exe gui做它的处理,直到我看到Interactive Serivces Detection消息“应用程序不再请求你的注意”
  • 点击“立即返回”

…它工作正常。 所以它可能与会话0隔离有关

你能从本质上运行弹出窗口阻止程序吗? 这里的假设是,CloseMainWindow()将具有与“查看消息”相同的效果,并允许服务与桌面进行交互。 下面的示例代码; 适应您的特定场景,并作为您服务的独立线程运行。

public class Program { public static void Main(string[] args) { while (true) { DestroyAllBobs(); Thread.Sleep(100); } } private static void DestroyAllBobs() { Process[] bobs = Process.GetProcessesByName("robert"); foreach (Process bob in bobs) { if ("Microsoft Visual C++ Runtime Library".Equals(bob.MainWindowTitle)) { bob.WaitForInputIdle(); if ("Microsoft Visual C++ Runtime Library".Equals(bob.MainWindowTitle) && "robert".Equals(bob.ProcessName)) { try { bob.CloseMainWindow(); } catch (Exception) { } } } } } } 

最好的猜测答案是,BlackBox.exe不能没有访问桌面和功能会话0隔离防止服务启动BlackBox.exe访问桌面。 所以它不能从服务运行。

为了完整起见,能够使用诊断工具来确定使用Process Monitor或类似的东西来调用Windows API失败会很好。 但是,我不知道该找什么。