为每个进程,用户或会话获取非交互式用户的Window Station?

时间:2010-06-18 20:52:34

标签: winapi desktop createprocessasuser

当使用CreateProcessAsUser时,我们传递STARTUPINFO并且lpDesktop为NULL,目标是winsta0 / default,交互式用户的交互式桌面。

我希望在第二个非交互式用户(例如远程桌面用户)的另一个会话中定位一个窗口站。

我认为它不能是winsta0,因为它是为单个交互式用户保留的。

我在这里查看功能列表: http://msdn.microsoft.com/en-us/library/ms687107(v=VS.85).aspx

我可以枚举机器上的窗口工作站,但是如何识别哪个窗口工作站连接到哪个用户/进程/会话?

每个窗口站都连接到一个会话 每个进程都有一个目标窗口站

但是,如果我有一个进程或一个会话ID,我如何确定它与哪个Window Station相关联?

2 个答案:

答案 0 :(得分:2)

在WinXP / Win2K3或更高版本上,您可以执行以下操作:

  1. 调用WTSEnumerateSessions以获取活动会话信息列表(这也将为您提供与每个会话关联的窗口站名称)。
  2. 将会话ID传递给WTSQueryUserToken。
  3. 将令牌传递给GetTokenInformation以获取用户的SID。
  4. 将用户的SID传递给LsaLookupSids以获取用户名和域名。
  5. 此外,如果要确定哪个会话是活动控制台会话,则可以将会话ID与WTSGetActiveConsoleSessionId的返回值进行比较。

    但是,我建议使用从WTSQueryUserToken返回的令牌,通过CreateProcessAsUser在目标桌面上启动进程,正如Franci所提到的那样。您必须通过DuplicateTokenEx将其从模拟令牌转换为主令牌,但它适用于WinXP或更高版本,Microsoft将其记录为从Vista上的服务桌面启动交互式应用程序的“首选”方式。更高。

答案 1 :(得分:1)

您可以使用GetUserObjectinformation获取与该窗口站关联的用户的SID。

从进程中查找Window Station:   - 获取流程的顶级窗口句柄
  - 枚举窗口站(EnumWindowStations
  - 枚举每个窗口站的桌面(EnumDesktops
  - 枚举每个桌面的窗口(EnumDesktopWindows),直到找到匹配项。

是的,这不是直截了当的,但它应该可以解决你的问题。

注意:在Vista和Win7上,交互式用户不在winsta0中。 Winsta0仅为系统和服务保留,交互式用户获得一个新的Windows工作站,并且(通常)与TS用户一样对待。