当使用CreateProcessAsUser时,我们传递STARTUPINFO并且lpDesktop为NULL,目标是winsta0 / default,交互式用户的交互式桌面。
我希望在第二个非交互式用户(例如远程桌面用户)的另一个会话中定位一个窗口站。
我认为它不能是winsta0,因为它是为单个交互式用户保留的。
我在这里查看功能列表: http://msdn.microsoft.com/en-us/library/ms687107(v=VS.85).aspx
我可以枚举机器上的窗口工作站,但是如何识别哪个窗口工作站连接到哪个用户/进程/会话?
每个窗口站都连接到一个会话 每个进程都有一个目标窗口站
但是,如果我有一个进程或一个会话ID,我如何确定它与哪个Window Station相关联?
答案 0 :(得分:2)
在WinXP / Win2K3或更高版本上,您可以执行以下操作:
此外,如果要确定哪个会话是活动控制台会话,则可以将会话ID与WTSGetActiveConsoleSessionId的返回值进行比较。
但是,我建议使用从WTSQueryUserToken返回的令牌,通过CreateProcessAsUser在目标桌面上启动进程,正如Franci所提到的那样。您必须通过DuplicateTokenEx将其从模拟令牌转换为主令牌,但它适用于WinXP或更高版本,Microsoft将其记录为从Vista上的服务桌面启动交互式应用程序的“首选”方式。更高。
答案 1 :(得分:1)
您可以使用GetUserObjectinformation
获取与该窗口站关联的用户的SID。
从进程中查找Window Station:
- 获取流程的顶级窗口句柄
- 枚举窗口站(EnumWindowStations
)
- 枚举每个窗口站的桌面(EnumDesktops
)
- 枚举每个桌面的窗口(EnumDesktopWindows
),直到找到匹配项。
是的,这不是直截了当的,但它应该可以解决你的问题。
注意:在Vista和Win7上,交互式用户不在winsta0中。 Winsta0仅为系统和服务保留,交互式用户获得一个新的Windows工作站,并且(通常)与TS用户一样对待。