【问题标题】:C# Screenshot winlogon as well as User DesktopC# 截图 winlogon 以及用户桌面
【发布时间】:2018-11-05 05:53:12
【问题描述】:

我正在处理屏幕共享项目。但我在捕获安全桌面时遇到了麻烦。 我已经问过相关问题here 也得到了答案

请通过以上链接

正如 dymanoid 所建议的那样。我正在使用PsExec exe 来捕获安全桌面/winlogon 桌面,如下所示

/x 和 /s 开关在 SYSTEM 帐户和 Winlogon 桌面上运行进程。

PsExec /i /h /x /d /s "path_\screencapture.exe"

现在screencapture exe在winlogon桌面上以SYSTEM帐户运行,我可以在用户登录屏幕上看到screencapture exe,但在用户桌面屏幕上看不到。

现在事情反过来了,我可以捕获用户登录屏幕,但不能捕获用户桌面。

用户桌面给我空屏/黑屏。

如果我从下面的命令中删除 /x,那么我可以得到 userdesktop 不安全的桌面

PsExec /i /h /d /s "path_\screencapture.exe"

我的问题是有没有办法做到这一点

【问题讨论】:

  • 也许你可以设置一个布尔值来查看你是否已经登录,然后你做一个 if 语句来使用一个命令或另一个
  • 我的第一个 exe 与套接字连接,另一台计算机发送捕获的屏幕。在中间安全桌面/UAC 出现。如何启动另一个 exe 实例以连接相同的套接字

标签: c# screenshot psexec


【解决方案1】:

由于我在工作,我无法测试我的理论。 + 我还没有评论的权利……所以如果这不起作用,请多多包涵。

作为系统运行可能与它没有“桌面”目录有关。 所以请创建一个这些目录:

32-bit: %windir%\System32\config\systemprofile\desktop
64-bit: %windir%\SYSWOW64\config\systemprofile\desktop

使用 SYSTEM 帐户重试:

PsExec -i -h -x -d -s "path_\screencapture.exe"

有时工作目录是“只读”的,所以通过指定你可以让它工作

PsExec -i -h -x -d -s -w c:\temp "path_\screencapture.exe"

如果这不起作用,请尝试将其附加到会话,查询可用的用户会话以查看安全桌面是否正在运行自己的会话,我在命令提示符下输入:

查询会话

 SESSIONNAME       USERNAME                 ID  STATE   TYPE        DEVICE
 services                                    0  Disc
>console           xxxx                      2  Active
 rdp-tcp                                 65536  Listen

我在这里唯一可用的会话是 services = 0 和 mylogin = 2。

建议试试

PsExec -i 0 -h -x -d -s -w c:\temp "path_\screencapture.exe"

PsExec -i 2 -h -x -d -s -w c:\temp "path_\screencapture.exe"

并查看捕获是否有任何差异。

我以前从未使用过安全桌面,因此它可能是一个额外的层。在用户情况下,-i 对我来说一直很好。

祝你好运:)

编辑:
我很幸运地对此进行了测试,这就是我所做的:

  1. 用gui下载了一个抓包工具,我试过7capture.com

  2. 然后我像这样启动7capture.exe:

PsExec -i -s -x c:\7capture.exe

  1. 现在我展示了带有“以管理员身份运行”的安全桌面。当弹出窗口出现时,我按下 ALT+TAB 并且有 7capture :)

  2. 按“刷新”按钮查看项目列表。 “桌面”在我的计算机上被称为“$$$Secure UAP 背景窗口”。

  3. 瞧,已捕获并可见

现在获取Screenshot secure desktop上的代码

我会更改桌面 HWND 调用:

Win32Stuff.GetDesktopWindow();

到 Enum 函数并为您在安全桌面中找到的每个 HWND 拍照。

未经测试,但我相信你可以使用这个:

[DllImport("user32.dll")]
private static extern bool EnumWindows(EnumWindowsProc enumProc, IntPtr lParam);

// Delegate to filter which windows to include 
public delegate bool EnumWindowsProc(IntPtr hWnd, IntPtr lParam);

试一试,看看你是否可以让它适用于所有场景。

编辑2:
由于这是 2 个不同的用户范围,因此您需要运行两个 Screencapture.exe 副本。一种用于安全桌面,一种用于交互式会话: UAC:

PsExec -i -h -x -d -s "path_\screencapture.exe"

没有 UAC:

PsExec -i -h -d "path_\screencapture.exe"

【讨论】:

  • 谢谢我已经试过这个选项都不起作用。感谢您的输入
  • 我使用基于 gui 的工具添加了一个测试。如果您在 HWND 函数中实现更改,您可能会得到您想要的屏幕截图。
  • 我试过了,以系统帐户运行的应用程序不允许捕获用户桌面。EnumWindows 在连接多个用户的远程桌面上也是一个不同的挑战。我也尝试安装计算机服务'允许服务与桌面选项交互'。它也没有工作。我无法维护不同的应用程序,因为我的应用程序通过单套接字连接与用户键盘和鼠标交互
  • 在我的 edit2 上,一个应用程序在安全桌面上运行,另一个在每个用户空间中运行。如果您需要单个连接并且只有一个应用程序发送 Mutex / 广播解决方案可以为您工作:codeproject.com/Tips/1017834/… 由于安全桌面只需要运行一次,每个“用户会话”都可以存储数据并将数据发送到该主机-程序
  • 是的,我观察到了团队查看器。它还维护两个应用程序。一个是用户 GUI 应用程序,另一个是 SYSTEM 帐户应用程序。我猜它与 SYSTEM 帐户应用程序通信,只要需要使用管道连接的安全桌面屏幕截图或如您所说的使用广播解决方案。感谢您的努力
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多