1

当使用 CreateProcessAsUser 时,我们通过 STARTUPINFO 和 lpDesktop NULL,目标是 winsta0/default,交互式用户的交互式桌面。

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

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

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

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

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

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

4

2 回答 2

2

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

  1. 调用 WTSEnumerateSessions 以获取活动会话信息的列表(这也将为您提供与每个会话关联的窗口站名称)。
  2. 将会话 ID 传递给 WTSQueryUserToken。
  3. 将令牌传递给 GetTokenInformation 以获取用户的 SID。
  4. 将用户的 SID 传递给 LsaLookupSids 以获取用户和域名。

此外,如果您想确定哪个会话是活动控制台会话,您可以将会话 id 与 WTSGetActiveConsoleSessionId 的返回值进行比较。

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

于 2010-09-04T07:40:07.413 回答
1

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

至于从进程中查找窗口站: - 获取进程的顶级窗口句柄
- 枚举窗口站(EnumWindowStations
- 枚举每个窗口站的桌面(EnumDesktops
- 枚举每个桌面的窗口(EnumDesktopWindows),直到找到一场比赛。

是的,这不是一个简单的方法,但它应该可以解决您的问题。

注意:在 Vista 和 Win7 上,交互式用户不在 winsta0 中。Winsta0 仅为系统和服务保留,交互式用户获得一个新的 Windows 站,并被视为(大部分)与 TS 用户相同的方式。

于 2010-06-18T21:10:28.860 回答