C#屏幕快照winlogon以及用户桌面

时间:2018-11-01 13:00:20

标签: c# screenshot psexec

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

请通过上面的链接

如类风虫所建议。我正在使用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”

我的问题是是否有任何办法

1 个答案:

答案 0 :(得分:2)

自从我工作以来,我无法检验自己的理论。 +我还没有发表评论的权利...所以,如果这不起作用,请忍受我。

作为系统运行可能与它没有“桌面”目录有关。 因此,请创建以下目录:

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键,然后捕获了7个:)

  2. 按下“刷新”按钮以查看项目列表。我的计算机上的“桌面”称为“ $$$ Secure UAP Background window”。

  3. Voila,拍摄并可见

现在输入Screenshot secure desktop上的代码

我将更改桌面HWND呼叫:

Win32Stuff.GetDesktopWindow();

要使用枚举功能,并为在安全桌面中找到的每个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);

尝试一下,看看是否可以使它适用于所有情况。

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

  

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

没有UAC:

  

PsExec -i -h -d“ path_ \ screencapture.exe”