C # Запустите приложение Windows Form из службы (и в Vista) - PullRequest
7 голосов
/ 06 января 2009

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

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

System.Diagnostics.Process.Start("ExePath");

но в Vista он запускает новый процесс как локальный / системный процесс, который невидим для пользователя. Кто-нибудь обходит это? Есть ли какой-нибудь способ определить, какой пользователь в данный момент вошел в систему, и запустить новый процесс от имени этого пользователя? Мне не нужно учитывать быстрое переключение пользователей на этом этапе. Достаточно чего-то - чего угодно - базового.

Буду признателен за любую помощь или советы, которые у вас есть по этому вопросу.

Мне нужно уточнить, что я устанавливаю параметр «Разрешить службе взаимодействовать с рабочим столом», когда служба установлена. Это то, что позволяет ему работать на 2000 / XP. Тем не менее, Vista все еще имеет вышеупомянутую проблему.

Ответы [ 8 ]

12 голосов
/ 07 января 2009

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

Вы не должны полагаться на мониторинг приложения форм, что если никто не вошел в систему? Что делать, если в систему вошли несколько человек? Просто так беспорядочно делать такие вещи.

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

3 голосов
/ 07 января 2009

См. Вопрос: Как служба Windows может выполнять приложение с графическим интерфейсом? . Он отвечает на тот же вопрос из C / C ++ (краткий ответ: CreateProcessAsUser), но ответ все еще действителен (с некоторым P / Invoke) для C #.

2 голосов
/ 06 января 2009

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

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

Возможно, вы захотите пересмотреть этот подход.

1 голос
/ 20 апреля 2010

Чтобы ваша служба запускала приложение от имени пользователя (что, похоже, вы пытаетесь сделать), вам нужно сделать следующее:

System.Security.SecureString ss = new System.Security.SecureString();

foreach (char c in password)
  ss.AppendChar(c);

System.Diagnostics.Process proc = Process.Start(path, arguments, username, ss, domain);

Где:

  • путь = полный путь (включая имя файла) исполняемого файла.
  • arguments = строка аргументов (пустая строка отсутствует)
  • username = Имя учетной записи пользователя на вашем сервере / компьютере
  • домен = ваш сетевой домен (если вы используете сетевую учетную запись - пусто, если ее нет)

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

serviceProcessInstaller.Account = ServiceAccount.User;

serviceProcessInstaller.Username = "yourdomain\\yourAccountName"; //Or just "AccountName" for local accounts..            

serviceProcessInstaller.Password = "yourPassword";
1 голос
/ 07 января 2009

Во-первых, быстрый ответ: позволяет ли параметр «Разрешить службе взаимодействовать с рабочим столом» (служба -> Свойства -> LogOn) или указание учетной записи, что вы хотите? Если это так, оба из них могут быть настроены на вашем классе установщика службы.

Как и другие, я подозреваю, что есть лучший подход к этому, и любое из следующего верно: -Код внутри службы может быть включен в приложение winforms (возможно, работает в фоновом потоке), и добавлен в запуск Windows. Оба будут работать -Приложение winforms может просто прослушивать сервис, когда он включен, и его не нужно запускать из сервиса. Или аналогичным образом приложение может быть добавлено в автозагрузку.

1 голос
/ 07 января 2009

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

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

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

0 голосов
/ 07 января 2009

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

0 голосов
/ 07 января 2009

В Windows 2000 и XP на вкладке Вход в окне свойств службы есть опция (флажок), позволяющая службе взаимодействовать с рабочим столом. Я считаю, что это то, что вы ищете. Я только что написал быстрый сервис в VB.NET с Process.Start ("calc.exe") и Windows Calculator открылся просто отлично.

Я не уверен на 100%, что в Vista это работает так же.

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