我正在尝试构建一个windows服务,使第三方应用程序的运行自动化,让我们称它为BlackBox.exe。BlackBox.exe在从当前用户会话运行时运行良好,但在从服务执行时失败。BlackBox.exe有一个UI,但是它可以通过传递命令行参数来实现自动化。在自动模式下,它显示一些UI、读取输入文件、写入输出文件,然后在没有任何用户交互的情况下退出。我们只有BlackBox.exe的二进制文件。
该服务被配置为使用与安装和注册BlackBox.exe相同的用户。
我对Process交互式会话与服务会话捕获的事件进行了比较。对于服务会话和服务会话没有失败的注册表或文件操作。特别要注意的是,在这两种情况下都成功地读取了许可证激活的注册表项。
当从服务运行时,BlackBox.exe在任务管理器中是可见的,具有0%的cpu,并且会一直在那里直到被杀死。
我想,缺乏对桌面的访问是导致BlackBox.exe失败的原因--也许有一种方法可以愚弄BlackBox.exe,让它以为自己可以访问桌面,而不需要用户登录?
如何从服务中运行BlackBox.exe?
更新:如果我:
...it工作得很好。所以它可能与会话0隔离有关
发布于 2016-02-03 01:24:14
你基本上能运行一个弹出拦截器来对付这个问题吗?这里的假设是,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)
{
}
}
}
}
}
}https://stackoverflow.com/questions/34984059
复制相似问题