Скриншот защищенного рабочего стола

Я работаю с проектом совместного использования экрана. Я снимаю экран рабочего стола, используя ниже function.it отлично работает. Но всякий раз, когда безопасное приглашение на рабочий стол для повышения.it возвращает черно-белое изображение.

Но когда я отключу защищенный рабочий стол от локальной политики безопасности. Он работает нормально.

Есть ли способ захватить защищенный рабочий стол без отключения локальной политики безопасности.

static Bitmap CaptureDesktop()
{
    SIZE size;
    Bitmap printscreen = null;

    size.cx = Win32Stuff.GetSystemMetrics
                     (Win32Stuff.SM_CXSCREEN);

    size.cy = Win32Stuff.GetSystemMetrics
              (Win32Stuff.SM_CYSCREEN);

    int width = size.cx; int height = size.cy;

    IntPtr hWnd = Win32Stuff.GetDesktopWindow();
    IntPtr hDC = Win32Stuff.GetDC(hWnd);
    if (hDC != IntPtr.Zero)
    {
        IntPtr hMemDC = GDIStuff.CreateCompatibleDC(hDC);
        if (hMemDC != IntPtr.Zero)
        {
            IntPtr m_HBitmap = GDIStuff.CreateCompatibleBitmap(hDC, width, height);
            if (m_HBitmap != IntPtr.Zero)
            {
                IntPtr hOld = (IntPtr)GDIStuff.SelectObject(hMemDC, m_HBitmap);
                GDIStuff.BitBlt(hMemDC, 0, 0, width, height, hDC, 0, 0, GDIStuff.SRCCOPY);
                GDIStuff.SelectObject(hMemDC, hOld);
                GDIStuff.DeleteDC(hMemDC);
                printscreen = System.Drawing.Image.FromHbitmap(m_HBitmap);
                GDIStuff.DeleteObject(m_HBitmap);
            }
        }
    }
    Win32Stuff.ReleaseDC(hWnd, hDC);

    return printscreen;
}

Изменить:

  1. Exe установлен в защищенном месте
  2. Exe имеет цифровую подпись

Ответ 1

Чтобы получить содержимое экрана Secure Desktop, ваше приложение должно выполнить некоторые специальные критерии:

  • он должен выполняться под учетной записью SYSTEM, а не с учетной записью входа в систему
  • он должен запускаться на рабочем столе Winlogon, а не на рабочем столе пользователя
  • он должен работать как услуга

Чтобы протестировать его, вы можете, например, использовать инструмент SysInternals PsExec для запуска приложения в этом режиме:

PsExec /h /x /d /s "path_to\your_application.exe"

/s переключатели /x и /s: они запускают процесс под учетной записью SYSTEM и на рабочем столе Winlogon.

Если вы хотите избежать использования сторонних инструментов, вам необходимо создать свою собственную службу Windows, которая будет выполнять захват экрана Secure Desktop.

Исходный код PsExec отсутствует, но вы можете посмотреть исходный код инструмента PAExec - это альтернатива с открытым исходным кодом.