Windows 从服务运行时,第三方应用程序失败
我正在尝试构建一个windows服务,它可以自动运行第三方应用程序,我们称之为BlackBox.exe。BlackBox.exe从当前用户的会话运行时运行正常,但从服务执行时失败。BlackBox.exe有一个UI,但可以通过向其传递命令行参数来实现自动化。在自动模式下,它显示一些用户界面,读取输入文件,写入输出文件,然后在没有任何用户交互的情况下退出。我们只有BlackBox.exe的二进制文件 该服务配置为使用与BlackBox.exe在下安装和注册的用户相同的用户 我对Process Monitor交互会话和服务会话捕获的事件进行了比较。没有注册表或文件操作在服务会话中失败,在服务会话中成功。值得注意的是,在这两种情况下都成功读取了许可证激活的注册表项 从服务运行时,BlackBox.exe在cpu为0%的任务管理器中可见,并将一直保留到终止 我猜,缺乏对桌面的访问导致BlackBox.exe失败-也许有一种方法可以愚弄BlackBox.exe,使其认为它可以访问桌面而不需要用户登录 如何从服务运行BlackBox.exe 更新: 如果我:Windows 从服务运行时,第三方应用程序失败,windows,windows-services,Windows,Windows Services,我正在尝试构建一个windows服务,它可以自动运行第三方应用程序,我们称之为BlackBox.exe。BlackBox.exe从当前用户的会话运行时运行正常,但从服务执行时失败。BlackBox.exe有一个UI,但可以通过向其传递命令行参数来实现自动化。在自动模式下,它显示一些用户界面,读取输入文件,写入输出文件,然后在没有任何用户交互的情况下退出。我们只有BlackBox.exe的二进制文件 该服务配置为使用与BlackBox.exe在下安装和注册的用户相同的用户 我对Process Mo
- 启动“交互式服务检测”服务
- 单击“交互式服务检测”对话框中的“查看消息”
- 观看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枚举中可能有一些内容可以挂接,但我现在只是猜测。不幸的是,像这样与第三方二进制文件集成可能有点艺术性。