我正在尝试构建一个自动运行第三方应用程序的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?
更新 如果我:
......它运作正常。所以它可能与Session 0 isolation
有关答案 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的调用失败将会很好。但是,我不确定在那里寻找什么。