使用“本地系统帐户”在“Windows服务”下运行时,Windows Windows 7截屏不起作用

时间:2014-02-16 13:25:22

标签: c# .net windows windows-7 screenshot

在Windows 7 x64上运行时,我将以下代码作为独立应用程序(例如ConsoleApplication1)运行时工作正常:

var screen = Screen.PrimaryScreen;

using (var bitmap = new Bitmap(screen.Bounds.Width, screen.Bounds.Height))
using (var graphics = Graphics.FromImage(bitmap))
{
    graphics.CopyFromScreen(new Point(screen.Bounds.Left, screen.Bounds.Top), new Point(0, 0),
    screen.Bounds.Size);
    bitmap.Save(@"c:\\Test.png", ImageFormat.Png);
}

我需要将此代码放在带有“本地系统帐户”和“允许服务与桌面交互”的“Windows服务”中,但是当我在那里运行时,它会捕获黑屏。

据我所知,在Win7中,服务是隔离的,没有与桌面交互,但我需要以某种方式截取屏幕截图,或传递一些管理员凭据。

Windows服务必须作为“本地系统帐户”运行,我无法将其更改为以管理员身份运行

我怎样才能截屏?

2 个答案:

答案 0 :(得分:1)

截图与GUI有关,但Windows服务无法使用GUI。这个msdn article给出了解决方法,但是它说:在提升的安全上下文中运行的服务(例如LocalSystem帐户)不应该在交互式桌面上创建窗口,因为在交互式桌面上运行的任何其他应用程序都可以与此窗口交互。这会将服务公开给登录用户执行的任何应用程序。此外,作为LocalSystem运行的服务不应通过调用OpenWindowStation或GetThreadDesktop函数来访问交互式桌面。

另外,这些帖子讨论了更多这个问题: 1. windows service screen capture returns black screen 2. How can I run a Windows GUI application on as a service?

答案 1 :(得分:0)

您正在拍摄的屏幕截图是会话0桌面。这是服务运行的地方。 “仅允许服务与桌面交互”选项可能会因其描述而有点误导。以下是对其允许内容的详细说明:http://msdn.microsoft.com/en-us/library/windows/desktop/ms683502(v=vs.85).aspx

任何时候都可以有许多“桌面”,因为您可以登录多个用户(快速用户切换和RDP)。您可能希望优化您的方法,以获得“控制台”用户的会话,或者当前登录用户的会话。

您将需要在窗口会话中运行的代理进程才能执行此操作。

我建议进一步调查这两件事并为你找到合适的选择:

  1. 使用CreateProcessAsUser将流程生成到用户的会话中以进行屏幕截图
  2. 在每个用户的会话中运行一个系统托盘应用程序,您可以与之交互(即命名管道)并告诉它进行屏幕截图。