Получить Window Station для неинтерактивного пользователя для каждого процесса, пользователя или сеанса?

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

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

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

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

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

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

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

Ответ 1

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

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

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

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

Ответ 2

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

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

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

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