Альтернатива «Разрешить службе взаимодействовать с рабочим столом»? - PullRequest
19 голосов
/ 27 февраля 2010

У меня установлена ​​служба Windows (C #) на сервере, который каждые 10 минут запускает исполняемый файл (C #) для обработки некоторых изображений из одного каталога в другой. Никакого взаимодействия не требуется с любым пользователем. Тем не менее, поскольку исполняемый файл является окном вывода, для запуска службы мне нужно установить флажок « Разрешить взаимодействие с рабочим столом » , который считается небезопасным и плохим практика . Как бы я пошел об этой проблеме? Мне нравится отделять исполняемый файл от службы Windows, потому что

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

EDIT:

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

Faulting application myapp.exe, version 1.0.0.0, time stamp 0x4b8304c3, 
faulting module KERNEL32.dll, version 6.0.6002.18005, time stamp 0x49e03821, 
exception code 0xc0000142, fault offset 0x00009eed, process id 0x10ec, 
application start time 0x01cab736950a64b5.

Как только взаимодействие с рабочим столом включено, приложение выполняется нормально.

Есть мысли?

Большое спасибо за ваше время.

Ответы [ 4 ]

11 голосов
/ 27 февраля 2010

Если вы используете Vista и более поздние версии и вам не требуется никакого взаимодействия с пользователем, но у вас есть интерактивный исполняемый файл, функция изоляции Session 0 должна помочь устранить некоторые проблемы, связанные с «плохая практика» взаимодействия службы с рабочим столом (который в сеансе 0 не имеет физической консоли).

Эта изоляция сеанса 0 не позволит непривилегированным пользователям выполнять Shatter Attacks на вашем сервисе, поскольку они получают свои интерактивные рабочие столы в разных сеансах. Shatter-атаки являются основной причиной, по которой это «взаимодействие с рабочим столом» считалось плохой практикой, и если вы используете Vista или более позднюю версию, все будет в порядке, если вы не можете избежать этого (или вам придется потратить слишком много усилий, чтобы сделать это). 1007 *

Итак, если все работает хорошо, как есть, вы, вероятно, в порядке.

Конечно, после обновления ОС все может перестать работать, поэтому, вероятно, лучше подготовиться к удалению зависимости от интерактивности, поскольку она вам на самом деле не нужна.

5 голосов
/ 24 августа 2011

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

2 голосов
/ 27 февраля 2010

Является ли подпроцесс просто консольным приложением? Я не написал Windows Services, но я думаю, что может быть достаточно просто запустить подпроцесс без окна. Используйте перегрузку Process.Start, которая принимает ProcessStartInfo, и установите для ProcessStartInfo.CreateNoWindow значение true.

http://msdn.microsoft.com/en-us/library/system.diagnostics.processstartinfo.createnowindow.aspx

2 голосов
/ 27 февраля 2010

Если вы можете, я бы порекомендовал переписать ваши исполняемые файлы, которые обрабатывают перемещение, чтобы не использовать окно вывода. Если они являются стандартными консольными приложениями без вывода, вы можете выполнять их из службы без необходимости «Разрешить службе взаимодействовать с рабочим столом». Это дает вам все преимущества без каких-либо изменений в вашем обслуживании.

...