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

Windows 从服务运行时,第三方应用程序失败,windows,windows-services,Windows,Windows Services,我正在尝试构建一个windows服务,它可以自动运行第三方应用程序,我们称之为BlackBox.exe。BlackBox.exe从当前用户的会话运行时运行正常,但从服务执行时失败。BlackBox.exe有一个UI,但可以通过向其传递命令行参数来实现自动化。在自动模式下,它显示一些用户界面,读取输入文件,写入输出文件,然后在没有任何用户交互的情况下退出。我们只有BlackBox.exe的二进制文件 该服务配置为使用与BlackBox.exe在下安装和注册的用户相同的用户 我对Process Mo

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

该服务配置为使用与BlackBox.exe在下安装和注册的用户相同的用户

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

从服务运行时,BlackBox.exe在cpu为0%的任务管理器中可见,并将一直保留到终止

我猜,缺乏对桌面的访问导致BlackBox.exe失败-也许有一种方法可以愚弄BlackBox.exe,使其认为它可以访问桌面而不需要用户登录

如何从服务运行BlackBox.exe

更新: 如果我:

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

…很好用。因此,它可能与

有关。您是否可以对其运行弹出窗口阻止程序?这里的假设是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的调用失败的原因。但是,我不确定要在那里查找什么。

为什么是服务而不是计划任务(请参阅)?您使用的是什么版本的Windows?因此,请澄清一点,如果交互式服务检测服务停止,它将不起作用?如果ISD服务正在运行,但您没有单击“查看消息”怎么办?您是否在服务属性中选中了“允许服务与桌面交互”?这可能有用()也可能有用()值得一试。你的假设是基于什么?这是我过去在第三方COM automated exe中使用的一种技术,它违反了其“无窗口模式下无弹出窗口”合同。我们从桌面应用程序而不是服务中运行这样的代码(以更严格的方式)。我一直假设您在这里有类似的东西,并且它不像使用.NET的ProcessStartInfo.CreateNoWindow标志那么简单。但是,当我重新阅读您的问题时,我想知道CreateNoWindow是否真的是缺少的全部?使用ProcessStartInfo.CreateNoWindow=true进行了尝试,没有任何更改。在等待30秒后尝试关闭MainWindow,但没有任何影响。MainWindowTitle==“”这是“如果关联的进程没有主窗口”的情况。嗯。进程的组件.Events枚举中可能有一些内容可以挂接,但我现在只是猜测。不幸的是,像这样与第三方二进制文件集成可能有点艺术性。