Re[8]: Запуск приложения из C# сервиса. Windows 7
От: Forcas Украина  
Дата: 04.03.10 10:54
Оценка:
Здравствуйте, Jolly Roger, Вы писали:

JR>Здравствуйте, Jolly Roger, Вы писали:


F>>> [Flags]

F>>> enum WTS_CONNECTSTATE_CLASS

JR>[Flags] здесь не нужен, это перечисление — напутал


Работает — только что проверил! Приму на вооружение, спасибо!
Re[9]: Запуск приложения из C# сервиса. Windows 7
От: Jolly Roger  
Дата: 04.03.10 12:34
Оценка:
Здравствуйте, Forcas, Вы писали:

Я бы рекомендовал вот это
            unsafe
            {
                state = *(WTS_CONNECTSTATE_CLASS*)(pBuf);
            }

заменить на
            WTS_CONNECTSTATE_CLASS state = 
                (WTS_CONNECTSTATE_CLASS)Marshal.ReadInt32(pBuf);

чтобы избавиться от unsafe
"Нормальные герои всегда идут в обход!"
Re[7]: Запуск приложения из C# сервиса. Windows 7
От: SuhanovSergey  
Дата: 10.03.10 11:13
Оценка:
Здравствуйте, Jolly Roger, Вы писали:

JR>Последний параметр в RunInteractiveProcess определяет, от чьего имени запускать. Если он false, то запуск производится от имени пользователя сессии. Если true — от имени учётки самого сервиса, при этом предполагается, что сервис работает под LocalSystem, при других учётках возни гораздо больше.


Пара комментариев:
— RunInteractiveProcess() запускает процесс от учётной записи пользователя, который присоединён к консоли (WTSGetActiveConsoleSessionId()). Консоль — это либо физические клава и монитор или RDP-сессия, срзданная с флажком "консольная". Но нужно учитывать, что юзер может быть залогинен на компьютер удалённо по RDP без галочки "консольная сессия". Для клиентских операционок это очень редкий случай, но если вам нужно поддерживать серверные сценарии, то нужно понимать, что это очень даже вероятно, что администратор ходит на сервера по RDP.

— Если код выполняется не из под LocalSystem, то задачу в общем случае не решить. WTSQueryUserToken может быть успешно вызвана только из под LocalSystem.
Re[8]: Запуск приложения из C# сервиса. Windows 7
От: Jolly Roger  
Дата: 10.03.10 12:06
Оценка:
Здравствуйте, SuhanovSergey, Вы писали:

SS>- RunInteractiveProcess() запускает процесс от учётной записи пользователя, который присоединён к консоли (WTSGetActiveConsoleSessionId()). Консоль — это либо физические клава и монитор или RDP-сессия, срзданная с флажком "консольная". Но нужно учитывать, что юзер может быть залогинен на компьютер удалённо по RDP без галочки "консольная сессия". Для клиентских операционок это очень редкий случай, но если вам нужно поддерживать серверные сценарии, то нужно понимать, что это очень даже вероятно, что администратор ходит на сервера по RDP.


Вообще-то RunInteractiveProcess делает запуск в той сессии, которую ей указали, для чего у неё есть соответствущий параметр А код, использующий WTSGetActiveConsoleSessionId — только пример её использования. А о самой WTSGetActiveConsoleSessionId в MSDN:

The session identifier of the session that is attached to the physical console

Именно "физической", ни о каких иных сессиях речи не идёт.

SS>- Если код выполняется не из под LocalSystem, то задачу в общем случае не решить. WTSQueryUserToken может быть успешно вызвана только из под LocalSystem.


Об этом прямо сказано в самом конце поста с кодом
"Нормальные герои всегда идут в обход!"
Re[9]: Запуск приложения из C# сервиса. Windows 7
От: SuhanovSergey  
Дата: 10.03.10 12:47
Оценка:
Здравствуйте, Jolly Roger, Вы писали:

JR>Здравствуйте, SuhanovSergey, Вы писали:


SS>>- RunInteractiveProcess() запускает процесс от учётной записи пользователя, который присоединён к консоли (WTSGetActiveConsoleSessionId()). Консоль — это либо физические клава и монитор или RDP-сессия, срзданная с флажком "консольная". Но нужно учитывать, что юзер может быть залогинен на компьютер удалённо по RDP без галочки "консольная сессия". Для клиентских операционок это очень редкий случай, но если вам нужно поддерживать серверные сценарии, то нужно понимать, что это очень даже вероятно, что администратор ходит на сервера по RDP.


JR>Вообще-то RunInteractiveProcess делает запуск в той сессии, которую ей указали, для чего у неё есть соответствущий параметр А код, использующий WTSGetActiveConsoleSessionId — только пример её использования. А о самой WTSGetActiveConsoleSessionId в MSDN:


JR>

JR>The session identifier of the session that is attached to the physical console

JR>Именно "физической", ни о каких иных сессиях речи не идёт.

Да не идёт, но по факту у виндового терминального клиента (mstsc.exe) есть флажок /console, который создаёт консольную сессию на сервере. После создания такой сессии WTSGetActiveConsoleSessionId() начинает возвращать её номер. Проверено на практике.

SS>>- Если код выполняется не из под LocalSystem, то задачу в общем случае не решить. WTSQueryUserToken может быть успешно вызвана только из под LocalSystem.

JR>Об этом прямо сказано в самом конце поста с кодом
Было написано "возни гораздо больше". Я уточняю, что вообще не возможно.
Re[10]: Запуск приложения из C# сервиса. Windows 7
От: Jolly Roger  
Дата: 10.03.10 15:36
Оценка:
Здравствуйте, SuhanovSergey, Вы писали:

SS>Да не идёт, но по факту у виндового терминального клиента (mstsc.exe) есть флажок /console, который создаёт консольную сессию на сервере. После создания такой сессии WTSGetActiveConsoleSessionId() начинает возвращать её номер. Проверено на практике.


Спасибо, не знал.

SS>Было написано "возни гораздо больше". Я уточняю, что вообще не возможно.


Вы ошибаетесь. Для запуска можно использовать классовый моникёр COM. Это не требует вообще каких-то особых прав или привилегий, но нужен дополнительный out-of-process COM-сервер, и для него должна быть правильно настроена система безопасности. Либо сама запускаемая программа должна быть таким сервером. Это требует дополнительных действий по написанию, инсталляции и настройке такого сервера, но задачу запуска произвольного приложения в произвольной сессии от имени пользователя этой сессии оно решает, плюс применимость не ограничена "снизу" WinXP.
"Нормальные герои всегда идут в обход!"
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.