1

我一直在互联网上寻找答案,但似乎没有直接回答,所以我想我会问。

案例场景:我想截取当前在计算机屏幕上的内容。如果是 Windows 登录屏幕,我希望它是那样。如果它是活动用户的桌面,我想成为那个。如果用户提升了他们的应用程序,并且出现了 UAC 提示,我希望它就是这样。

根据大量阅读和反复试验,我目前的设置如下:

  • 程序作为 Windows 服务运行
  • 获取活动用户的令牌
  • 使用用户的令牌运行 CreateProcessAsUser 以生成其自身的另一个实例
  • 截取屏幕截图并通过管道传回。

现在这对于登录用户来说非常有用,除了启用 UAC 提示时屏幕截图是黑色的。

此外,这种方法显然不适用于获取登录屏幕。

从根本上说,我想知道 TeamViewer 究竟是如何实现这种目标的?它能够完美地在登录屏幕和用户会话之间切换,同时还捕获 UAC 提示。我非常好奇它是如何做到这一点的。

感谢大家!

4

1 回答 1

0

根据戴维森的建议,我已经想出了如何做到这一点,它涉及多个步骤。

首先,必须使用 CreateProcessAsUser 在控制台会话中创建一个进程(从 WTSGetActiveConsoleSessionId 获得)。需要注意的是,该进程必须具有管理权限,而仅仅获取用户令牌的句柄是行不通的。显然,解决这个问题的方法是获取以管理权限运行的进程的句柄,获取该进程的令牌,复制它,并将其与 CreateProcessAsUser 一起使用。我用于此的过程是 Winlogon。

在此之后,剩下的就很简单了;使用 OpenInputDesktop 获取用户当前看到的桌面的句柄(对于实际桌面,它将是 Default,对于 UAC 提示和登录屏幕,它将是 Winlogon)。在此之后,使用 SetThreadDesktop 将进程的线程设置到适当的桌面,并捕获屏幕。假设您的进程有权创建 Winlogon 桌面的句柄,您将能够捕获登录屏幕/uac 提示和常规用户桌面。

再次感谢戴维森,他为我指明了正确的方向。

于 2018-11-17T18:14:43.850 回答