В сеансе Windows 0 я смог получить рабочий стол, хотя рабочего стола не было, почему?

#windows #desktop

Вопрос:

Я смог получить дескриптор Window Station из процесса IIS и получить имя «Service-0x0» с помощью GetUserObjectInformation. Аналогично, когда я получил дескриптор рабочего стола из потока и получил имя, я получил «Рабочий стол». Я думаю, что в сервисе есть оконная станция для сеанса 0, а рабочего стола нет. Почему она существует?

 IntPtr hWinSta = GetProcessWindowStation();
IntPtr hDesktop =  GetThreadDesktop(GetCurrentThreadId());

GetUserObjectInformation(hWinSta, ...
GetUserObjectInformation(hDesktop, ...
 

Комментарии:

1. Есть рабочий стол, он просто не виден. Как использовать его в более старых версиях Windows, подробно описано на этой веб-странице

Ответ №1:

Рабочий стол все еще там. Причина, по которой он все еще существует, заключается в том, что он необходим для создания Windows (HWND) и для функционирования различных API ( SetWindowsHookEx и т.д.). Изоляция сеанса 0 была добавлена в Vista, и существует слишком много устаревших служб, чтобы иметь возможность полностью удалить window station и desktop, эти службы полагаются на слишком много функций в USER32 и GDI32.

В Vista вы могли бы фактически переключиться на рабочий стол сеанса 0, если Windows обнаружила, что интерактивная служба требует ввода пользовательского интерфейса, но я не думаю, что эта функция существует в текущих версиях Windows.

Комментарии:

1. Спасибо за ваш ответ. Я вижу. Он существует. Я использую Windows Servier 2019. Правильно ли я понимаю, что могу его получить, но рабочий стол в сеансе 0 является неинтерактивным рабочим столом, и я не могу переключаться между ними?

2. Это то, что утверждает MSDN, да. Я не помню, когда служба переключения сеанса 0 была удалена.