Периодически некоторые пользователи не могут залогиниться на сервера Remote Desktop Services (RDS) фермы на Windows Server через стандартный RDP клиент (mstsc.exe) с ошибкой:
Не удается завершить требуемую операцию, поскольку службы удаленных рабочих столов сейчас заняты. Повторите попытку через несколько минут. Другие пользователи должны по-прежнему иметь возможность входа._x000D_
The task you are trying to do can't be completed because Remote Desktop Services is currently busy. Please try again in a few minutes. Other users should still be able to log on.
При этом можно наблюдать такую картину: на вкладке Users диспетчера задач RDS хоста с Windows Server 2016/2019 отображается множество зависших сессией пользователей с именами (4) вместо username и со статусом Disconnected.
Проблема встречается на всех актуальных версиях Windows Server 2022, 2019, 2016 и 2012 R2.
Ошибка RDP подключения может возникать по разным причинам:
- Ошибка в работе службы удаленных рабочих столов;
- Баг с процессом csrss.exe;
- Проблема с профилем пользователя или со службой profsvc;
- Нехватка оперативной памяти или свободного места на диске RDSH сервера;
- Некорректные настройки групповых политик.
К сожалению, на данный момент нет официального решения от Microsoft, которое бы полностью решало проблему, всё сводится к устранению симптомов.
Практически всегда проблема решается сбросом сессии проблемного пользователя и перезагрузкой RDS сервера, но в исключительных ситуациях этого может не хватить. Пройдемся по решениям, начиная от самых легких.
#1: Проверьте свободные ресурсы RDS сервера
Убедитесь, что серверу хватает ресурсов, так как эта ошибка может возникать из-за нехватки оперативной памяти или свободного места на диске. Посмотрите, достаточно ли свободной оперативной памяти и места на диске, где установлена операционная система (должно быть свободно хотя бы 1 GB), очистите профили пользователей RDS от старых файлов и удалите старые (неиспользуемые) профили . Также проверьте event log на предмет критических ошибок, связанных с RDS.
Если ресурсов хватает, переходим к следующему варианту.
#2: Сброс RDS сессии пользователя и завершение зависших процессов
Возможно у пользователя, которые не может зайти на RDS сервер осталась активная сессия или процесс. Попробуйте принудительно сбросить сессию и процессы такого пользователя. Найдите нужного пользователя на вкладке Users в диспетчере задач, щелкните по нему правой кнопкой и выберите “Log off”. В большинстве случаев, этого достаточно. Но иногда в диспетчере задач отображается множество зависших сессий с именем “(4)” вместо имени пользователя. Как правило в такой зависшей RDS сессии будет присутствовать 4 процесса:
- Client Server Runtime Process (csrss.exe)
- Desktop Windows Manager (dwm.exe)
- Windows Logon Application (winlogon.exe)
- Windows Logon User Interface
В первую очередь попробуйте завершить все зависшие сессии с (4) через диспетчер задач, как описано выше. Если это не поможет, нужно вручную завершить процессы в таких сессиях.
- Запустите командную строку с правами администратора и введите:
query session
Команда выведем список всех пользователей и их сессии на терминальном сервере. В выводе команды есть 3 интересующих нас столбца: SESSIONNAME, USERNAME и ID. Найдите пользователя ( 4 ) и соответствующий ему ID, в данном примере ID 2 . Вам нужно завершить процесс csrss.exe, который работает в этой сессии; - Выполните команду:
query process /id 2
Команда выведет все процессы, которые запущены в сессии с указанным ID. Нам нужно найти PID процесса csrss.exe. В моём случае это PID 5140 . Нам нужно завершить этот процесс. - Завершите процесс csrss.exe по его PID:
taskkill /F /PID 5140
После завершения процесса csrss.exe, все другие процессы в сессии пользователя будут завершены автоматически. Это позволит завершить зависшие сессии без перезагрузки сервера.
Таким образом нужно завершить все сессии для пользователем “(4)”, если их несколько.
Также при работе на нестабильных каналах рекомендуем задайте 1 минуту в параметре GPO Configure keep-alive connection interval (Computer Configuration -> Administrative Templates -> Windows Components -> Remote Desktop Services -> Remote Desktop Session Host -> Connections).
#3: Сброс RDP сессии через командную строку
Если завершить сессию “проблемного” пользователя не удалось, можно попробовать сбросить сессию пользователя через командную строку.
- Выведите список сессий:query session
- Завершите сессию пользователя по его SESSIONNAME или ID. Например:
reset session rdp-tcp#16
или
reset session 3
Это нужно сделать с каждым проблемным пользователем. Теперь можете попробовать залогиниться, проблема должна решиться.
Если RDS сервер не позволяет залогиниться даже под администратором, вы можете получить список сессий пользователей на компьютере удаленно :
qwinsta /server:msk-rds01
После этого можно удаленно завершить зависшую сессию:
reset session rdp-tcp#16 /server:msk-rds01
#4: Проверьте настройки лицензирования хоста RDS
Проверьте, что у вас на RDSH хосте указан правильный адрес сервера лицензирования и настроен тип лицензии (CAL Per User/ CAL Per Device).
Адрес сервера с лицензиями RDS можно указать:
- В настройках RDS коллекции : Tasks -> Edit Deployment Properties -> RD Licensing;
- Через GPO : Use the specified Remote Desktop license servers (Computer Configuration -> Policies -> Admin Templates -> Windows Components -> Remote Desktop Services -> Remote Desktop Session Host -> Licensing)
- С помощью PowerShell (см. статью “Не задан режим лицензирования для сервера узла сеансов удаленных рабочих столов” ).
#5: Уберите лимит RDP подключений в GPO
Через групповые политики можно ограничить количество одновременных подключений по RDS. По умолчанию данная политика не настроена. Это означает, что RDSH хост не ограничивает максимальное количество подключений.
С помощью gpresult нужно проверить, включена ли политика и какое в ней указано значение.
- Запустите командную строку с правами администратора и введите
gpresult /H c:gpresult.html
- Откройте файл gpresult.html, который лежит в корне диска C. Это обычный .html файл, который можно открыть с помощью вашего браузера (в современных версиях Windows Internet Explorer по умолчанию отключен и вы можете испоьзовать MS Edge);
- В разделе Computer Configuration -> Administrative Templates -> Windows Components -> Remote Desktop Services -> Remote Desktop Session HostConnections найдите Limit number of connections , либо в поиске по странице наберите Limit number of connections .
- Запустите командную строку с правами администратора и введите
Если такой политики нет, значит она не применяется и ограничений по количеству одновременных подключений нет. Если политика есть и указано количество одновременных подключений, измените её значение на нужное вам число. Изменить групповую политику можно через оснастку локального редактора GPO gpedit.msc , если политика настроена через доменные GPO, отредактируйте соответствующую политику через доменный редактор GPO gpmc.msc . После того как отредактируете политику, не забудьте набрать в командной строке gpupdate /force
для немедленного применения настроек групповой политики .
#6: Другие способы исправить проблемы занятой RDP службы
Если на хосте достаточно свободных ресурсов, в журналах событий нет ошибок, сброс сессии пользователя по каким-то причинам не помог, а перезагружать сервер прямо сейчас нельзя, то следует попробовать следующие варианты:
- Проверьте, что на RDS сервере не включен режим обслуживания RDS (Drain mode) , который запрещает пользователям новые RDP подключения:
chglogon.exe /QUERY
. Если команда вернет сообщение “ New user logons are DISABLED, but reconnections to existing sessions are ENABLED ”, отключите Drain режим:chglogon.exe /enable
- В настройках RDP подключения (mstsc.exe) на клиенте mstsc снимите галку «Постоянное кэширование точечных рисунков» («Persistent bitmap caching»). Попробуйте использовать режим оптимизации производительности Modem 56kbps;
- Перезагрузите службу RDS. В командной строке с правами администратора наберите
net stop termservice
иnet start termservice
. Либо перезапустите службу удаленно с помощью PowerShell:Get-Service termservice –ComputerName msk-rds1 | Restart-Service
- Принудительно убейте процессы tstheme.exe ;
- Рекомендуется применить все последние обновления для вашей версии Windows, воспользуйтесь стандартными средствами обновления;
- В Windows Server 2012 R2 в Event Viewer может появится событие Event ID 20499 “ Remote Desktop Services has taken too long to load the user configuration from server.. ”. Для исправления проблемы добавьте в реестр параметр fQueryUserConfigFromLocalMachine :
REG ADD "HKLMSYSTEMCurrentControlSetcontrolTerminal ServerWinstationsRDP-Tcp" /v fQueryUserConfigFromLocalMachine /t REG_DWORD /d 1 /f
REG ADD "HKLMSoftwarePoliciesMicrosoftWindows NTTerminal Services" /v fQueryUserConfigFromLocalMachine /t REG_DWORD /d 1 /f - Если на Windows хосте установлен Citrix и на Server VDA много сессий со статусом disconnected , попробуйте создать параметр реестра SeTokenDoesNotTrackSessionObject :
REG ADD "HKLMSYSTEMCurrentControlSetControlSession ManagerKernel" /v SeTokenDoesNotTrackSessionObject /t REG_DWORD /d 1 /f
- Проверьте логи службы профилей пользователей (
profsvc
). Если вы используете профили User Profile Disks или FSLogix на Windows Server , проверьте что файловый сервер с профилями доступен и не имеет проблем с производительностью. Также при использовании UPD на Windows Server 2019/2016 нужно создать параметр реестра DeleteUserAppContainersOnLogoff , который исправить проблемы со множеством правил Windows Defender Firewall, которые генерируются для UWP приложений Windows Store при каждом входе пользователя.