Как запустить не фоновый процесс из Windows Сервиса? - PullRequest
0 голосов
/ 21 февраля 2020

У меня есть Windows Сервис, написанный на C#, который запускает экземпляр браузера Google Chrome с помощью PuppeteerSharp. См. Код запуска ниже:

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 как не фоновый процесс, чтобы я мог его увидеть? И если да, то как?

1 Ответ

2 голосов
/ 21 февраля 2020

Я подозреваю, что браузер Chrome не виден, потому что он запускается из службы Windows, которая является фоновым процессом, поэтому Chrome автоматически запускается как фоновый процесс. Можно ли запустить Chrome как не фоновый процесс, чтобы я мог его увидеть? И если да, то как?

Службы Win32 запускаются в отдельном сеансе от видимых пользователем приложений . Среди прочих причин это предотвращает уязвимость системы безопасности, известную как shatter attack . Так что это не только на другом рабочем столе; он находится на другом рабочем столе, который находится на другой Windows станции, которая находится в другом сеансе пользователя.

Пока есть хак , вы можете вставить его, что позволяет отображать пользовательский интерфейс из службы Win32 этот хак не должен использоваться . Это требует понижения безопасности всей системы, дополнительно снижая безопасность этой службы, в частности, и может перестать работать с любым будущим обновлением Windows.

Правильный ответ на вопрос "как мне показать пользовательский интерфейс из службы Win32 "это" вы не ". Есть несколько альтернатив:

  1. Вам действительно нужен сервис Win32? Возможно, это должно быть обычное приложение, которое запускается автоматически при входе в систему? Обычно службы Win32 используются потому, что они могут запускать без входа в систему, но в этом случае мне нужно будет спросить, где именно будет отображаться пользовательский интерфейс, если пользователь не вошел в систему? Итак, во-первых, подумайте, должно ли ваше приложение действительно быть службой Win32 или нет.
  2. Если вам действительно нужна служба Win32, и вам нужно показать пользовательский интерфейс, тогда правильная архитектура разделить существующее приложение на службу Win32 и отдельный исполняемый файл, который запускается при входе в систему. Когда служба Win32 хочет отобразить пользовательский интерфейс, она использует некоторую форму межпроцессного взаимодействия, чтобы сообщить приложению автозапуска об отображении действительного пользовательского интерфейса.

Обратите внимание, что с параметром (2) вы должны также необходимо решить, как справиться с ситуацией, когда существует несколько зарегистрированных пользователей (например, сеансы удаленного рабочего стола), и определить , в каком сеансе вы хотите отобразить пользовательский интерфейс.

...