如何从Windows服务启动非后台进程?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何从Windows服务启动非后台进程?相关的知识,希望对你有一定的参考价值。

我有一个用C#编写的Windows服务,该服务使用PuppeteerSharp启动Google Chrome浏览器的实例。请参阅下面的启动代码:

string[] chromeArgs =  "--remote-debugging-port=9222" ;
Browser browser = await Puppeteer.LaunchAsync(new LaunchOptions()

    ExecutablePath = "C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe",
    DefaultViewport = null,
    Args = chromeArgs,
    Headless = false // <-- this is important!
);

即使我以非无头模式启动浏览器,也没有在计算机上实际启动Chrome浏览器。我确认浏览器确实启动了,因为我看到它显示在任务管理器中。

[我怀疑Chrome浏览器不可见,因为它是从作为后台进程的Windows服务启动的,因此Chrome会自动作为后台进程启动。 是否可以将Chrome作为非后台进程启动,以便可以看到它?如果可以,怎么办?

答案

[我怀疑Chrome浏览器不可见,因为它是从作为后台进程的Windows服务启动的,因此Chrome会自动作为后台进程启动。是否可以将Chrome作为非后台进程启动,以便我可以看到它?如果是这样,怎么办?

Win32 services run in a separate session from user-visible applications。除其他原因外,这可以防止称为shatter attack的安全漏洞。因此,它不仅在不同的桌面上;它在不同的桌面中,在不同的Windows工作站中,在不同的用户会话中。

虽然您可以输入a hack,但它允许显示Win32服务中的UI,但该hack 不应使用。它要求降低整个系统的安全性,尤其是降低该服务的安全性,并且可能会停止使用任何将来的Windows Update。

The proper response to "how do I show a UI from a Win32 service" is "you don't"。有两种选择:

  1. 您真的需要Win32服务吗?也许它应该只是一个可以在登录时自动运行的常规应用程序?通常,使用Win32服务是因为它们可以运行without登录,但是在那种情况下,如果没有用户登录,我将不得不问您将在哪里显示UI?因此,首先,请考虑您的应用程序是否应该真正是Win32服务。
  2. 如果确实需要Win32服务,则需要显示UI,然后适当的体系结构是将现有应用程序拆分为Win32服务和一个在登录时运行的独立可执行文件。当Win32服务想要显示UI时,它使用某种形式的进程间通信来告诉自动运行的应用程序显示实际的UI。
  3. 请注意,使用选项(2),您还需要决定如何处理存在多个登录用户的情况(例如,远程桌面会话),并确定要显示的

    哪个

会话UI。

以上是关于如何从Windows服务启动非后台进程?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Windows 服务启动进程到当前登录的用户会话

linux系统下如何从后台启动进程?

如何从管理员 powershell 启动非管理员进程

如何从 Windows 服务启动具有 UI 的进程?

如何从Windows服务启动进程到当前登录的用户会话

APP非功能测试