2008-09-10 14 views
28

У меня есть существующее приложение GUI, которое должно было быть реализовано как служба. В принципе, мне нужно иметь возможность удаленно регистрироваться на сервере Windows 2003 и выходить из него и все еще поддерживать эту программу.Как запустить приложение Windows GUI как службу?

Возможно ли это?

EDIT: Дальнейшая уборка здесь ... У меня нет источника, это не мое приложение.

+0

Дальнейшая уточнение здесь ... У меня нет источника, это не мое приложение. – JeffV

+2

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

ответ

4

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

0

У вас есть источник? Во многих случаях разница между автономным приложением и сервисом минимальна.

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

15

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

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

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

+0

Вот почему это сложная проблема. У меня есть существующее графическое приложение (источник sans), который мне нужно запустить как службу. – JeffV

+1

Это неправильно. У служб Windows могут быть графические интерфейсы. Это относится к службе печати, которая может отображать окно. – labilbe

+2

@labilbe - для служб Windows определенно возможно появление процессов с графическим интерфейсом. Возможно, это то, что делает служба принтера. Это не то же самое, что сам сервисный процесс с графическим интерфейсом. Также верно, что части операционной системы Windows иногда могут делать вещи, которые в противном случае не допускаются. – McKenzieG1

0

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

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

0

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

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

6

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

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

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

+0

Я пробовал AlwaysUp, но это не так, t работает слишком хорошо, по крайней мере для приложений командной строки - я продолжал получать уведомления о «Программа, запущенная на этом компьютере, пытается отобразить сообщение». Вместо этого я использую winsw. – VitalyB

0

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

НО!

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

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

2

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

0

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

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

0

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

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

0

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

Смежные вопросы