Grzzlwmpf Ответов: 1

Запуск процесса из службы windows на языке C#


Привет,

В настоящее время я пишу службу windows на C#, которая должна действовать как "сторожевой пес" для стороннего консольного приложения. Это приложение запускается из командной строки (без графического интерфейса или любого другого вида пользовательской интерактивности), запускает веб-сервер и должно запускаться автоматически после завершения загрузки машины (Windows Server 2019) без какого-либо входа пользователя. Однако я не могу найти способ фактически запустить приложение из моей программы, как только оно работает как служба windows (оно отлично работает при запуске из сеанса пользователя).

До сих пор у нас было приложение, работающее как сервис, использующий sc create без каких – либо проблем, но это делает обновление – то, что мой сервис должен автоматизировать, - довольно утомительным.

Что я уже пробовал:

Сначала я попробовал "наивный" подход, просто используя System.Diagnostics.Process.Start() но это не сработало.
После некоторого копания мне показалось, что виновником была какая-то форма неявного требования интерактивности, поэтому я попробовал их ProcessStartInfo параметры, которые я нашел, были предложены в ответ на старый вопрос, похожий на мой
ProcessStartInfo info = new ProcessStartInfo()
{
  FileName = _configPath,
  Arguments = _configArgs,
  UseShellExecute = false,
  RedirectStandardError = true,
  RedirectStandardInput = true,
  RedirectStandardOutput = true,
  CreateNoWindow = true,
  ErrorDialog = false,
  WindowStyle = ProcessWindowStyle.Hidden
};
_app = Process.Start(info);

но и это не сработало.


В этот момент я уже не в своей тарелке. Это мой первый раз, когда я пишу сервис на C#, и хотя вполне возможно, что я просто пытаюсь сделать невозможное, тот факт, что стороннее приложение, которое я пытаюсь запустить, смогло работать как сервис само по себе без каких-либо проблем, наводит меня на мысль, что должен быть способ сделать это.

Заранее спасибо за любой вклад!

1 Ответов

Рейтинг:
0

OriginalGriff

Ты не можешь.
Служба вообще не работает ни под каким "реальным" пользователем, поэтому она не может запускать какие - либо процессы, которые могут каким - либо образом взаимодействовать с пользователем-ввод или вывод, - поскольку не обязательно будет какой-либо пользователь, входящий в систему во время работы службы.

Это сделано специально: вы не можете "обмануть" и получить пользовательский интерфейс любого типа от сервиса - приложение интерфейса подключается к сервису, а не наоборот.


Grzzlwmpf

Приложение не имеет/не нуждается в интерфейсе (единственный интерфейс-это вход в окно консоли, которое, как я предполагаю, вы могли бы просто перехватить в службе). Есть ли способ сделать это, когда интерактивность пользователя абсолютно не требуется?

Dave Kreskowiak

Перехватить? Нет, не можешь. Такого понятия не существует.

Что касается этого веб-сервера, то если он сам является службой windows, вы не можете запустить его с помощью Process.Начать. Для этого вы должны использовать класс ServiceController.

OriginalGriff

Окно консоли является интерфейс!
Система не "знает", что пользователь не может ее видеть!