Получить Window Station для неинтерактивного пользователя для процесса, пользователя или сеанса? - PullRequest
1 голос
/ 19 июня 2010

При использовании CreateProcessAsUser мы передаем STARTUPINFO и с lpDesktop NULL, цель - winsta0 / default, интерактивный рабочий стол интерактивного пользователя.

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

Я предполагаю, что это не может быть winsta0, поскольку он зарезервирован для одного интерактивного пользователя.

Я смотрю список функций здесь: http://msdn.microsoft.com/en-us/library/ms687107(v=VS.85).aspx

Я могу перечислить оконные станции на машине, но как определить, какая оконная станция подключена к какому пользователю / процессу / сеансу?

Каждая оконная станция подключена к сеансу КаждыйУ процесса есть целевая оконная станция

Но как, например, если у меня есть процесс или идентификатор сеанса, определить, с какой оконной станцией он связан?

Ответы [ 2 ]

2 голосов
/ 04 сентября 2010

В WinXP / Win2K3 или новее вы можете сделать следующее:

  1. Вызвать WTSEnumerateSessions, чтобы получить список информации об активном сеансе (который также даст вам имя оконной станции, связанной с каждым сеансом).
  2. Передать идентификатор сеанса в WTSQueryUserToken.
  3. Передать токен в GetTokenInformation для получения SID пользователя.
  4. Передать SID пользователя в LsaLookupSids для получения имен пользователей и доменов.

Кроме того, если вы хотите определить, какой сеанс является активным сеансом консоли, вы можете сравнить идентификатор сеанса с возвращаемым значением WTSGetActiveConsoleSessionId.

Однако я бы рекомендовал использоватьтокен вернулся из WTSQueryUserToken, чтобы запустить процесс на целевом рабочем столе через CreateProcessAsUser, как упомянул Фрэнси.Вам нужно будет передать его через DuplicateTokenEx, чтобы преобразовать его из маркера олицетворения в основной токен, но он работает на WinXP или более поздней версии, и Microsoft документирует это как «предпочтительный» способ запуска интерактивных приложений с рабочего стола служб в Vista ивыше.

1 голос
/ 19 июня 2010

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

Что касается поиска оконной станции из процесса: - Получить дескриптор окна верхнего уровня для процесса
- перечислить оконные станции (EnumWindowStations)
- Перечислите рабочие столы для каждой оконной станции (EnumDesktops)
- Перечисляйте окна для каждого рабочего стола (EnumDesktopWindows), пока не найдете совпадение.

Да, это не так просто, но это должно решить вашу проблему.

Примечание : В Vista и Win7 интерактивного пользователя нет в winsta0. Winsta0 зарезервирован только для системы и услуг, интерактивный пользователь получает новую оконную станцию ​​и обрабатывается (главным образом) так же, как пользователи TS.

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