簡體   English   中英

在帶有“本地系統帳戶”的“ Windows服務”下運行時,.NET Windows 7截屏不起作用

[英].NET Windows 7 take screenshot not working when running under 'Windows Service' with 'Local System Account'

在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服務必須以“本地系統帳戶”身份運行,我無法將其更改為以管理員身份運行

我如何仍然可以截屏?

截屏與GUI有關,但是Windows服務沒有GUI。 msdn文章提供了一種解決方法,但是它說:在安全性較高的上下文中運行的服務(如LocalSystem帳戶)不應在交互式桌面上創建窗口,因為在交互式桌面上運行的任何其他應用程序都可以與此交互。窗口。 這會將服務公開給登錄用戶執行的任何應用程序。 此外,作為LocalSystem運行的服務不應通過調用OpenWindowStation或GetThreadDesktop函數來訪問交互式桌面。

同樣,這些帖子討論的問題更多:1. Windows服務屏幕捕獲返回黑屏 2. 如何在服務上運行Windows GUI應用程序?

您正在拍攝的屏幕快照為會話0桌面。 這是服務運行的地方。 “允許服務與桌面交互”選項可能僅憑其描述可能會引起誤解。 這是對其允許內容的很好描述: http : //msdn.microsoft.com/zh-cn/library/windows/desktop/ms683502(v=vs.85).aspx

一次可以有多個“桌面”可用,因為您可以登錄多個用戶(快速用戶切換和RDP)。 您可能需要優化方法,以獲取“控制台”用戶的會話或當前登錄的用戶的會話。

您將需要在窗口會話中運行的代理進程來執行此操作。

我建議您進一步研究兩件事,並為您找到正確的選擇:

  1. 使用CreateProcessAsUser將流程生成到用戶會話中以進行屏幕截圖
  2. 在每個用戶會話中都運行一個系統托盤應用程序,您可以與該應用程序進行交互(即,命名管道),並告訴其進行屏幕截圖。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM