Запуск приложения из службы Windows - PullRequest
3 голосов
/ 29 сентября 2011

Я создаю службу Windows, которая будет отслеживать конкретные события и активность диска. Когда такое событие происходит, мой план состоит в том, чтобы предупредить пользователя о событии через клиентское приложение и предоставить исправление, если это необходимо. Я (в основном) выполнил как клиентский, так и сервисный компоненты, которые прекрасно работают ... если клиентское приложение не запущено.

Короче говоря, я ищу способ запустить клиентское приложение из службы Windows через CreateProcess для предоставления информации пользователю. Однако, похоже, что служба не может даже увидеть файл / папку клиентского приложения, чтобы выполнить его. Я подозреваю, что это происходит из-за учетных данных, под которыми работает служба, или, возможно, из-за ограничений уровня обслуживания, но хотел обратиться за некоторыми советами, прежде чем углубляться в это.

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

Вопрос № 2, с какими ограничениями я сталкиваюсь с этой моделью? Есть ли учетная запись службы, которая позволит этот уровень доступа?

Я, очевидно, сейчас борюсь с этим, поэтому любые мысли или помощь будут высоко оценены!

Спасибо, Kris

Ответы [ 3 ]

4 голосов
/ 30 сентября 2011

Как уже упоминали другие, вы не можете (легко) запустить приложение непосредственно из службы, поэтому я думаю, что самый простой способ обойти проблему - создать процесс, который запускается при входе в систему и запускается с учетными данными зарегистрированного пользователь, например, приложение, которое находится в системном трее, и открывает именованный канал или сетевой порт для службы. Если службе необходимо предупредить пользователя, она отправляет сообщение по этому каналу, и затем клиентский процесс может либо показать свой собственный пользовательский интерфейс, либо запустить приложение. Межпроцессное взаимодействие с использованием каналов или портов - это самый простой способ справиться с ограничениями процессов сеанса 0.

3 голосов
/ 29 сентября 2011

Начиная с Vista, службы работают в сеансе 0, а рабочий стол пользователя всегда находится в другом сеансе.Поэтому вам нужно много работать, чтобы запустить службу на рабочем столе пользователя.

Это можно сделать, но это довольно сложно.Подробности можно найти здесь: http://blogs.msdn.com/b/winsdk/archive/2009/07/14/launching-an-interactive-process-from-windows-service-in-windows-vista-and-later.aspx?wa=wsignin1.0

3 голосов
/ 29 сентября 2011

Служба Windows не имеет доступа к пользовательскому сеансу в Vista и более поздних версиях, поэтому ей запрещено запускать исполняемый файл в этом сеансе.Вы можете скачать официальный документ от Microsoft, в котором подробно рассматриваются: Влияние изоляции сеанса 0 на службы и драйверы в Windows .

...