Запустить программу в активном сеансе пользователя из службы?

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

Как я могу это сделать?

Этот вопрос связан с этим: Запустите программу в активный пользовательский сеанс с удаленным взаимодействием PowerShell

Обновить
Использование только Process.Start здесь не работает, так как оно запускает приложение в текущем сеансе приложения. Он не запускает приложение в активном сеансе рабочего стола определенного пользователя.


person Eric Schoonover    schedule 13.11.2009    source источник
comment
Я не был на 100% уверен, что это сработает, и почти не публиковал ответ.   -  person ChrisF    schedule 13.11.2009
comment
Не беспокойся, Крис, я ценю твое время.   -  person Eric Schoonover    schedule 13.11.2009
comment
1) Что произойдет, если в систему войдут несколько человек? Это может произойти со службами терминалов или с быстрым переключением пользователей. 2) Вы хотите, чтобы оконное приложение запускалось в контексте безопасности пользователя или в контексте безопасности службы?   -  person Ragesh    schedule 13.11.2009
comment
Я хочу иметь возможность нацелить его на конкретного пользователя на определенной машине, и я хочу иметь возможность определять состояние сеанса. На самом деле это не так уж важно, если пользователь не активен или не видит его сразу, если в следующий раз, когда он подключится к серверу, появится диалоговое окно. Если они выходят из системы или их сеанс прерывается, ничего страшного, если сообщение не появится при следующем входе в систему.   -  person Eric Schoonover    schedule 13.11.2009
comment
Я предполагаю, что вы уже нашли решение этой проблемы (поскольку вопросу уже 2 года), если нет, то у меня есть решение этой проблемы, которое я могу опубликовать в качестве ответа...   -  person M.Babcock    schedule 18.03.2012
comment
опубликуйте это, мне больше не нужно решение, но другие могут   -  person Eric Schoonover    schedule 25.03.2012


Ответы (3)


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

person Tom Crowe    schedule 13.11.2009
comment
Определенно возможный подход. Хотя мне не очень интересно. Я просто ищу быстрый способ перезапустить приложение в моем собственном сеансе на нескольких машинах с помощью Windows Remoting (.NET). Если я не могу сделать это легко, то лучше всего просто запустить приложение как службу, и я могу перезапустить службу и не беспокоиться о том, что она будет запущена на рабочем столе определенного сеанса. - person Eric Schoonover; 13.11.2009

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

Кроме того, обратите внимание, что если вы пойдете по этому пути, вам нужно передать структуру STARTUPINFO, чтобы она запускалась на правильном рабочем столе, а не просто оставить ее нулевой.

person Lee Meyers    schedule 13.11.2009
comment
«Запуск от имени» — это не то же самое, что я пытаюсь сделать здесь. Он просто запускает приложение в текущем сеансе, используя учетные данные определенного пользователя. - person Eric Schoonover; 13.11.2009
comment
Извините за это, я сначала не проверил ваш связанный вопрос. Я считаю, что на одной машине можно было бы использовать WTSQueryUserToken для запуска в определенном сеансе, но я не осознавал, что задействовано удаленное взаимодействие. - person Lee Meyers; 13.11.2009

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

person BlueSam    schedule 13.11.2009
comment
Я считаю, что это работает только в сеансе /CONSOLE и не позволяет вам ориентироваться на конкретный активный сеанс пользователя. - person Eric Schoonover; 13.11.2009
comment
Я считаю, что вы не правы, поскольку я видел, как служба Windows раньше взаимодействовала с рабочим столом пользователя. - person BlueSam; 16.11.2009