Запустить программу под пользователем интерактивного входа из .NET WinService - PullRequest
2 голосов
/ 01 марта 2011

В данный момент у нас запущен .NET WinService под пользователем LocalService при запуске windows. Служба запускает другое приложение WinForms с помощью Process.Start ().

Но в этом решении есть несколько проблем:

  1. Мы не ждем интерактивного входа пользователя, и приложение падает, потому что оно пытается и не может инициализировать устройство DirectX.
  2. Приложение, запущенное под LocalService, прекрасно взаимодействует с рабочим столом пользователя в Windows XP. Но это не работает в Windows 7, потому что в win7 есть разные графические станции для каждого пользователя.
  3. Иногда нам нужно запустить приложение с текущими правами пользователя интерактивного входа.

Кто-нибудь знает, как дождаться интерактивного входа пользователя в службу и запустить приложение WinForms с этими правами пользователя?

Я думаю, что это помогает решить все проблемы.

Ответы [ 3 ]

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

Вам понадобится отдельное клиентское приложение. Проверьте этот документ, страница 6: http://msdn.microsoft.com/en-us/windows/hardware/gg463353.aspx.

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

1 голос
/ 30 марта 2011

Возможно ли, что это просто неправильный подход к тому, что вы пытаетесь сделать?Кажется возможным, что вам лучше было бы включить в сервис логику мониторинга или что-то еще с требованиями по времени безотказной работы, чтобы, так сказать, «всегда включен».Тогда у вас останется логика пользовательского интерфейса в приложении WinForms, которое можно открывать или закрывать без вреда для здоровья.

1 голос
/ 28 марта 2011

Я бы попробовал использовать комбинацию ответов выше.

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

Чтобы убедиться, что приложение Winform успешно запущено после входа пользователя в систему: Пусть ваш сервис проверяет, запущено ли приложение в фоновом режиме, как сейчас, но не позволяйте ему выполнить первоначальный запуск. Вместо этого просто дайте ему зарегистрироваться, когда пользователь входит в систему, это можно сделать, прослушивая OnSessionChange. Установите задержку на X секунд, чтобы процесс входа в систему / запуска завершился до того, как он начнет проверять работающее приложение (возможно, не лучшее решение).

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

...