首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从服务运行时第三方应用程序失败

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

Stack Overflow用户
提问于 2016-01-25 02:06:24
回答 1查看 208关注 0票数 2

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

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

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

当从服务运行时,BlackBox.exe在任务管理器中是可见的,具有0%的cpu,并且会一直在那里直到被杀死。

我想,缺乏对桌面的访问是导致BlackBox.exe失败的原因--也许有一种方法可以愚弄BlackBox.exe,让它以为自己可以访问桌面,而不需要用户登录?

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

更新:如果我:

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

...it工作得很好。所以它可能与会话0隔离有关

EN

回答 1

Stack Overflow用户

发布于 2016-02-03 01:24:14

你基本上能运行一个弹出拦截器来对付这个问题吗?这里的假设是,CloseMainWindow()将具有与“查看消息”相同的效果,并且允许服务与桌面进行交互。下面的示例代码;适应您的特定场景,并作为一个独立的线程从您的服务运行。

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34984059

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档