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

时间:2016-01-25 02:06:25

标签: windows windows-services

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

该服务配置为使用与安装BlackBox.exe相同的用户并在。

下注册

我运行了Process Monitor交互式会话与服务会话捕获的事件的比较。没有针对服务会话失败的注册表或文件操作以及服务会话的成功。值得注意的是,在两种情况下都会成功读取许可证激活的注册表项。

从服务运行时,BlackBox.exe在0%cpu的任务管理器中可见,并将保留在那里直到被杀死。

我想无法访问桌面会导致BlackBox.exe失败 - 也许有一种方法可以让BlackBox.exe认为它可以在没有用户登录的情况下访问桌面?

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

更新 如果我:

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

......它运作正常。所以它可能与Session 0 isolation

有关

2 个答案:

答案 0 :(得分:1)

你能基本上对这个运行一个弹出窗口阻止程序吗?这里的假设是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)
                    {
                    }
                }
            }
        }
    }
}

答案 1 :(得分:0)

最佳猜测答案是,如果不访问桌面,BlackBox.exe将无法运行,会话0隔离会阻止服务启动BlackBox.exe访问桌面。所以它无法从服务中运行。

为了完整起见,能够使用诊断工具来识别使用Process Monitor或类似程序对Windows API的调用失败将会很好。但是,我不确定在那里寻找什么。