C# 屏幕截图 winlogon 以及用户桌面

C# Screenshot winlogon as well as User Desktop

我正在使用屏幕共享 project.But 我在捕获安全桌面时遇到了麻烦。 我已经问过相关问题 也得到了答案

请通过以上link

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

/x 和 /s 切换 运行 SYSTEM 帐户下和 Winlogon 桌面上的进程。

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

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

现在情况正好相反,我可以捕获用户登录屏幕,但不能捕获用户桌面。

用户桌面给我 Empty/black 屏幕。

如果我按如下所示从命令中删除 /x,那么我能够得到 userdesktop not secured desktop

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

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

因为我在工作,所以无法验证我的理论。 + 我还没有发表评论的权利...所以如果这不起作用,请耐心等待。

运行 因为系统可能与它没有 "desktop" 目录有关。 所以请创建这些目录:

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

使用 SYSTEM 帐户重试:

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

有时工作目录是 "read only" 所以通过指定你可以让它工作

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

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

query sessions

 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:capture.exe

  1. 现在我在某些东西上展示了带有 "run as admin" 的安全桌面。当弹出窗口出现时,我按下 ALT+TAB,出现了 7capture :)

  2. 按 "Refresh" 按钮查看项目列表。 "desktop" 在我的电脑上被称为“$$$Secure UAP Background window”。

  3. 瞧,已捕获且可见

现在是

上的代码

我会更改桌面 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"