Есть ли способ запустить приложение с графическим интерфейсом из службы Windows на Windows 7?
Я много занимался поиском, чтобы найти способ запустить приложение с графическим интерфейсом из службы Windows в Windows 7. Большинство из того, что я обнаружил, это то, что службы Windows 7 теперь работают в отдельном сеансе пользователя и не могут отображать какой-либо графический интерфейс. текущему пользователю. Мне интересно, есть ли какой-нибудь способ обхода или другой способ сделать что-то подобное? Может ли служба запустить процесс в другом сеансе пользователя?
3 ответа
Это изменение было сделано не просто для того, чтобы раздражать разработчиков. Правильный подход - поместить ваш пользовательский интерфейс в другую программу и обмениваться данными с сеансом через канал или какой-либо другой механизм IPC. Рекомендация о том, что сервисы не предоставляют пользовательский интерфейс, уже более 10 лет.
Вы должны действительно пытаться следовать этим правилам, даже если это может показаться неудобным с самого начала. С положительной стороны вы будете наслаждаться преимуществом разделения вашей сервисной логики и пользовательского интерфейса.
Если ваши службы работают под учетной записью LOCALSYSTEM, вы можете установить флажок "Разрешить службе взаимодействовать с рабочим столом", чтобы использовать устаревшие службы, которые не будут работать, если они не смогут отображать пользовательский интерфейс. Но это все равно не поможет, потому что пользовательский интерфейс покажет в сессии 0, где его никогда не видели!
Я рекомендую вам прочитать официальный документ Microsoft, описывающий изоляцию сеанса 0.
Есть способ сделать это. Если вам нужно показать простое окно сообщения, вы можете использовать процедуру WTSSendMessage. Если вам нужны сложные элементы пользовательского интерфейса, вы можете поместить их в отдельную программу и использовать подпрограмму CreateProcessAsUser. В этом примере, предоставленном Microsoft, вы можете увидеть процесс.
http://blogs.msdn.com/b/codefx/archive/2010/11/26/all-in-one-windows-service-code-samples.aspx
Windows 7 представила так называемую "изоляцию сеанса 0", что на практике означает, что все службы (кроме системных служб) запускаются в отдельном неинтерактивном сеансе. По этой причине вы не можете напрямую создать графический интерфейс из службы, за исключением случаев, когда вы работаете в устаревшем режиме, отмечая опцию Interact With Destop, что не очень хорошо, если вы планируете запустить службу в течение нескольких лет в будущем.
Как сказал Дэвид Хеффернан, лучше всего использовать архитектуру клиент-сервер. WCF позволяет легко общаться с именованными каналами.
Эта страница является хорошей отправной точкой для чтения об Изоляции Сессии 0, и этот технический документ также очень хорош.