Подтвердить что ты не робот

Альтернатива "Разрешить услугу взаимодействовать с рабочим столом"?

У меня есть служба Windows (С#), установленная на сервере, которая каждые 10 минут запускает исполняемый файл (С#) для обработки некоторых изображений из одного каталога в другой. Никакого взаимодействия с любым пользователем не требуется. Тем не менее, поскольку исполняемый файл в качестве выходного окна, чтобы запустить службу, я должен включить флажок Разрешить службу для взаимодействия с рабочим столом ", который считается небезопасная и плохая практика. Как мне решить эту проблему? Мне нравится, что исполняемый файл отделен от моей службы 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.

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

Любые мысли?

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

Ответ 3

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

Ответ 4

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

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