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

Posted

技术标签:

【中文标题】.NET Windows 7 在使用“本地系统帐户”在“Windows 服务”下运行时截取屏幕截图不起作用【英文标题】:.NET Windows 7 take screenshot not working when running under 'Windows Service' with 'Local System Account' 【发布时间】:2014-03-15 17:21:13 【问题描述】:

在 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 服务必须以“本地系统帐户”运行,我无法将其更改为以管理员身份运行

我怎么还能截图?

【问题讨论】:

【参考方案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?

【讨论】:

【参考方案2】:

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

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

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

我建议进一步调查两件事并为您找到正确的选择:

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

【讨论】:

以上是关于.NET Windows 7 在使用“本地系统帐户”在“Windows 服务”下运行时截取屏幕截图不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Windows 7无法启动Diagnostic Policy Service 怎么办?

如何在本地系统帐户下运行 CMD.exe?

为啥“本地系统”帐户缺乏对 NTFS 文件系统的权限(将 java 作为 Windows 服务运行)

.NET Com 互操作帐户

“本地系统”帐户和“网络服务”帐户之间的区别?

Tomcat 服务使用“本地服务”帐户安装