Почему я не могу использовать компонент пользовательского интерфейса (форму Windows) внутри службы Windows? - PullRequest
1 голос
/ 21 июля 2010

Я видел несколько постов, в которых в основном говорится, что компоненты пользовательского интерфейса не должны запускаться как сервис.Я понимаю, что никто не может реагировать на события пользовательского интерфейса и т. Д. Но факт остается фактом: многие задачи автоматизации выполняются только с помощью форм Windows.

Вот несколько замечательных примеров:

  1. Я хотел бы создать службу сканирования URL, которая создает эскизы веб-страниц.В настоящее время единственный способ добиться этого - попытаться автоматизировать компонент .Net WebBroswer.

  2. Автоматизировать печать документов MS-Word.

До Vista было несколько хитростей, но сейчас их нет.У меня вопрос, почему это так, и какие альтернативы есть на самом деле?

Ответы [ 3 ]

6 голосов
/ 21 июля 2010

Lookup Shatter Attacks и Функция изоляции сеанса 0 .

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

Было много дискуссий о том, была ли это ошибка проектирования или нет, и после Vista Microsoft решила удалить любую поддержку интерактивных рабочих столов для служб, поскольку это было потенциальной дырой в безопасности.

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

1 голос
/ 21 июля 2010

Как сказал Морон, лучше всего не запускать его как службу.

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

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

Вы можете обмениваться данными между двумя, используя WCF по именованным каналам в качестве транспорта, или как угодно.Если это не так, вы можете использовать пустые именованные каналы или tcp / ip на локальном хосте.Судя по вашему сайту в вашем профиле пользователя, вы должны знать все о localhost!

0 голосов
/ 21 июля 2010

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

Но то, о чем вы говорите, это не компоненты пользовательского интерфейса, это компоненты COM, и вы можете использовать его.По крайней мере, MS Office, но это не рекомендуется Microsoft, потому что возможны утечки памяти.Последняя версия MS Office имеет серверную версию, которую можно использовать в приложении без пользовательского интерфейса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...