【问题标题】:How to launch a non-background process from a Windows Service?如何从 Windows 服务启动非后台进程?
【发布时间】:2020-02-21 19:31:54
【问题描述】:

我有一个用 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 作为非后台进程启动以便我看到它?如果是,怎么做?

【问题讨论】:

  • 您在屏幕上看到的是用户桌面。默认情况下,服务无法访问用户桌面,因为它不是用户。(它是在后台运行的服务)。为什么后台服务需要启动浏览器(GUI 应用程序)?如果您需要这样做,您的应用首先不应该是服务。

标签: windows-services background-process


【解决方案1】:

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

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

虽然您可以输入a hack,以允许显示来自 Win32 服务的 UI,但 不应使用该 hack。它需要降低整个系统的安全性,尤其是降低该服务的安全性,并且可能会停止与任何未来的 Windows 更新一起工作。

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

  1. 您真的需要 Win32 服务吗?也许它应该只是一个在登录时自动运行的常规应用程序?通常,使用 Win32 服务是因为它们可以在 登录的情况下运行,但在这种情况下,我不得不问如果没有用户登录,你会在哪里显示 UI?因此,首先,请考虑您的应用程序是否真的应该是 Win32 服务。
  2. 如果您确实需要 Win32 服务,并且您需要显示 UI,那么正确的架构是将现有应用程序拆分为 Win32 服务和在登录时运行的单独可执行文件。当 Win32 服务想要显示 UI 时,它使用某种形式的进程间通信来告诉自动运行应用程序显示实际的 UI。

请注意,使用选项 (2),您还需要决定如何处理有多个登录用户的情况(例如,远程桌面会话),并确定 哪个 会话你想在上面显示 UI。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-02
    • 2023-01-30
    • 2013-09-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多