Как запустить приложение с графическим интерфейсом Windows в качестве службы? - PullRequest
30 голосов
/ 10 сентября 2008

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

Возможно ли это вообще?

РЕДАКТИРОВАТЬ: Уточнение здесь ... У меня нет источника, это не мое приложение.

Ответы [ 11 ]

17 голосов
/ 10 сентября 2008

Службы Windows не могут иметь GUI, поэтому вам нужно будет либо избавиться от GUI, либо разделить ваше приложение на две части - службу без UI и приложение-контроллер. Если у вас есть исходный код, преобразование кода, не относящегося к графическому интерфейсу, в службу очень просто - Visual Studio имеет тип проекта «Служба Windows», который заботится о переносе, и есть простое пошаговое руководство, показывающее, как создать проект развертывания, который позаботится об установке.

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

Если пользовательский интерфейс довольно прост, вам, возможно, удастся использовать файлы конфигурации для входных и файлов журналов или журнал событий Windows для вывода.

6 голосов
/ 10 сентября 2008

Кто-нибудь использовал сторонний продукт, такой как: Always Up ?

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

Они должны связываться с exe вручную и вызывать WinMain или что-то в этом роде.

4 голосов
/ 10 сентября 2008

Вы можете заключить его в srvany , хотя вам может потребоваться назначить ему реальную учетную запись пользователя (в отличие от LocalService или чего-то подобного)

2 голосов
/ 04 февраля 2016

У меня был хороший опыт работы с winsw . Я смог довольно легко конвертировать мои командные файлы в сервисы, использующие его.

Я также использовал его для nginx, за этот ответ .

2 голосов
/ 01 марта 2011

Вам действительно нужно, чтобы он работал как служба, или вам просто нужно, чтобы он продолжал работать, когда вы не подключены? Если последнее, вы можете отключить вместо выхода из системы, и приложение продолжит работу. Опция должна быть в выпадающем списке после выбора Завершение работы или вы можете вызвать tsdiscon.exe.

0 голосов
/ 27 ноября 2016

FireDaemonPro превращает большинство приложений с графическим интерфейсом в службы; это не бесплатно, но, возможно, стоит его получить.

0 голосов
/ 01 мая 2012

Вы можете использовать ServiceMill для выполнения этой операции. В основном вы устанавливаете ServiceMill Server на свой сервер. Затем нажмите правую кнопку над исполняемым файлом и выберите «Установить как сервис ServiceMill». Затем вы настраиваете некоторые вещи (пользователь / пароль, если вы хотите взаимодействовать с рабочим столом или если вы предпочитаете скрыть пользовательский интерфейс ... и установить автоматический режим запуска).

Другим инструментом от Active + Software может быть решение, ServiceMill Exe Builder , которое позволяет создавать службы из командной строки, и это прекрасно, если вы используете сервер непрерывной интеграции или планируете распространять свой Компонент как услуга без необходимости думать об интеграции услуг (плюс это бесплатно).

0 голосов
/ 12 сентября 2008

Что произойдет, если вы создадите сервис. Этот сервис настроен для взаимодействия с рабочим столом. Настройте его для запуска какого-либо пользователя и запуска в автоматическом режиме. Из сервиса CreateProcess на это другое приложение. Я предполагаю, что это быстро попробовать использовать C # (C / C ++ было много кода, даже если я помню, как сервис). Будет ли это работать ??

НО!

Моей первой мыслью было бы создать виртуальный компьютер на виртуальном хосте серверного класса (например, Virtual Server, HyperV, VMWare). Эти виртуальные машины будут работать как службы (или что-то еще, что делает Hyper V). Виртуальная машина всегда будет работать - независимо от того, входите и выходите из нее.

Сделайте этот виртуальный компьютер автоматическим входом в Windows (TweakUI может настроить это), а затем просто запустите приложение с графическим интерфейсом, используя ярлык для папки «Автозагрузка». Вы даже можете использовать удаленный рабочий стол, используя графический интерфейс программы (я уверен, что Always Up не может этого сделать).

0 голосов
/ 10 сентября 2008

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

Поскольку, предположительно, причина для запроса об этом заключается в возможности удаленного мониторинга приложения, способ сделать это будет иметь два приложения. Сторона обслуживания (написанная в основном как консольное приложение) и сторона клиента / мониторинга GUI. Служба будет использовать некоторое удаленное подключение (когда я делал это, я использовал именованные каналы) для связи с клиентом / приложением мониторинга. Любой из них должен быть в состоянии работать без другого, и, безусловно, служба должна быть в состоянии работать без клиента.

0 голосов
/ 10 сентября 2008

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

Сказав, что вы можете установить свойства службы для запуска в качестве пользователя, как это было предложено Марком. Вы также можете указать в свойствах сервиса «Разрешить сервису взаимодействовать с рабочим столом». Делайте это только в том случае, если вы знаете, что пользователь войдет в систему.

...