RDP выдаёт ошибку 0x204 при подключении к Windows VPS
Ошибка 0x204 в RDP означает, что клиент не смог установить удалённое подключение к Windows VPS, но сам код почти ничего не говорит о причине. Одинаковое сообщение можно получить при закрытом TCP-порте, остановленной службе Remote Desktop Services, неправильном RDP-порте, блокировке firewall, проблеме на этапе NLA/CredSSP или из-за сети на компьютере пользователя.
Поэтому начинать с перезагрузки VPS, отключения Windows Firewall или изменения NLA — плохая стратегия. Сначала нужно выяснить, устанавливается ли TCP-соединение с фактическим RDP-портом. Если порт недоступен, пароль пользователя пока вообще не имеет значения. Если порт доступен, наоборот, не стоит бесконечно перестраивать маршрутизатор и правила внешнего firewall.

Рабочая цепочка проверки выглядит так: IP и порт, внешний сетевой периметр, Windows Firewall, TermService и RDP listener, настройки Remote Desktop, а затем NLA, права пользователя, журналы Windows и клиентское устройство. Главное — после каждого теста получать конкретный результат и сужать круг причин, а не менять несколько настроек одновременно.
Что означает ошибка RDP 0x204 и как сразу понять, где искать проблему
Код 0x204 лучше воспринимать не как диагноз, а как признак того, что RDP-клиент не смог довести подключение до рабочей удалённой сессии. Причина может находиться до Windows VPS, непосредственно в сетевых настройках Windows или уже на этапе аутентификации.
Внешне сценарии часто похожи. Пользователь вводит IP сервера в Remote Desktop Connection или другом RDP-клиенте, некоторое время видит Connecting, а затем получает сообщение о невозможности соединиться. В другом случае ошибка появляется почти сразу. По одной скорости появления 0x204 нельзя надёжно определить причину, поэтому первое полезное действие — проверить не интерфейс RDP, а транспорт.
Нужно ответить на простой вопрос: принимает ли Windows VPS TCP-соединение на том порту, куда обращается клиент? Пока ответа нет, переходить к NLA, паролям и правам пользователя рано.
| Симптом или результат | Что уже можно предположить | Первая следующая проверка |
|---|---|---|
TcpTestSucceeded: False | TCP-соединение с указанным портом не устанавливается | Проверить порт, внешний firewall, Windows Firewall и listener |
TcpTestSucceeded: True | Сетевой путь до TCP-порта работает | Проверить listener, RDP, NLA, пользователя и журналы |
| Через hotspot RDP работает, через Wi-Fi нет | Сервер способен принимать RDP хотя бы по одному маршруту | Проверить VPN, локальную сеть и фильтрацию исходящего трафика |
| Другой компьютер подключается к тому же IP и порту | Основная серверная цепочка работоспособна | Проверить проблемный клиент и его сеть |
| TermService Running, но LISTENING нет | Запущенная служба не создала ожидаемый listener | Проверить PortNumber, RDP-Tcp и состояние listener |
| Порт LISTENING локально, но снаружи TCP-тест False | RDP слушается внутри Windows, но трафик режется по пути | Проверить Windows Firewall и внешний сетевой периметр |
После такой развилки уже есть за что зацепиться. Если TCP не устанавливается, остаёмся на сетевом уровне. Если устанавливается, идём выше — к RDP listener, безопасности и входу пользователя.
Доступен ли Windows VPS по правильному IP и RDP-порту
При ошибке 0x204 первым делом проверьте фактический IP Windows VPS и TCP-порт RDP. Стандартный порт Remote Desktop — 3389, но на VPS его нередко меняют, поэтому автоматически считать правильным именно 3389 нельзя.
На компьютере с Windows откройте PowerShell и выполните:
Test-NetConnection SERVER_IP -Port 3389Вместо SERVER_IP укажите публичный IPv4 вашего VPS. Главная строка в выводе:
TcpTestSucceeded : Trueили:
TcpTestSucceeded : FalseTrue означает, что TCP-соединение с указанным портом устанавливается. Это ещё не доказывает исправность всей RDP-сессии: после установления TCP остаются RDP negotiation, NLA, аутентификация и создание пользовательской сессии. Но базовый сетевой путь уже работает.
False означает, что TCP-соединение установить не удалось. Среди причин — неправильный порт, внешний firewall, Windows Firewall, отсутствующий listener, ограничение по исходному IP или фильтрация в сети пользователя.
Если администратор менял RDP-порт, тестировать нужно именно его:
Test-NetConnection SERVER_IP -Port 3390Номер 3390 здесь приведён только как пример.
Почему одного ping недостаточно
Ситуация «сервер пингуется, но RDP не подключается» не противоречит сетевой диагностике. Ping использует ICMP, а RDP требует доступности своего TCP-порта. Успешный ping подтверждает только то, что сервер или сетевой периметр отвечает на ICMP.
Работает и обратный сценарий: VPS не отвечает на ping, но RDP открывается. ICMP может быть запрещён firewall, тогда как TCP-порт Remote Desktop разрешён.
Если используется hostname, а не IP, попробуйте подключиться непосредственно по IP. Когда SERVER_IP:PORT работает, а имя сервера нет, причину уже стоит искать в DNS, локальном кеше резолвера или устаревшей записи, а не в TermService.
Практическая развилка:TcpTestSucceeded: False оставляет нас на уровне сети, firewall и listener. При True базовая доступность порта подтверждена, поэтому следующий этап — серверная конфигурация RDP и аутентификация.
Где блокируется RDP: на стороне VPS-провайдера, маршрута или внешнего firewall
IP правильный, VPS включён, но Test-NetConnection возвращает False. В этот момент менять NLA или пользователя бессмысленно: TCP-соединение ещё не дошло до стадии RDP-аутентификации.
У Windows VPS могут одновременно существовать несколько уровней фильтрации. Один firewall работает внутри Windows. Второй может находиться в панели VPS или облачной инфраструктуре. Поверх этого встречаются security groups, ACL, allowlist по IP, VPN и корпоративные правила исходящего трафика.
Начните с панели VPS. Проверьте, разрешён ли входящий TCP-трафик на фактический RDP-порт. Если правило ограничено конкретным Remote IP, сравните его с текущим публичным IP компьютера пользователя. После переподключения провайдера, смены офиса, подключения VPN или перехода на другой канал внешний адрес может измениться.
Почему RDP может работать через мобильный интернет, но не через Wi-Fi
Хороший изолирующий тест — тот же компьютер, тот же IP Windows VPS и тот же порт, но другая сеть. Например, из домашнего Wi-Fi получаем:
Test-NetConnection SERVER_IP -Port PORT
TcpTestSucceeded : FalseПереключаем тот же ноутбук на мобильную точку доступа и повторяем:
Test-NetConnection SERVER_IP -Port PORT
TcpTestSucceeded : TrueВ таком сценарии сервер уже умеет принимать TCP-подключение на нужном порту. Значит, в первую очередь проверяем исходную сеть: VPN, корпоративный firewall, маршрутизатор, локальный security software или политику, запрещающую исходящее соединение.
Важно, что тест должен выполняться к одному и тому же IP:PORT. Если через Wi-Fi проверяли один сервер, а через мобильную сеть другой, сравнение теряет диагностический смысл.
Что показывает тест с включённым и выключенным VPN
VPN меняет маршрут, исходный публичный IP и иногда правила фильтрации. Поэтому полезно выполнить два последовательных теста, не меняя ничего другого:
Test-NetConnection SERVER_IP -Port PORTСначала с включённым VPN, затем после его отключения. Если результат меняется с False на True, Windows VPS трогать пока не нужно. Проверяйте VPN-маршрут, корпоративные ограничения и allowlist на стороне VPS.
Встречается и обратная ситуация: без VPN порт закрыт, а через VPN доступен. Например, внешний firewall сервера разрешает RDP только с адресов корпоративной сети. Это уже не неисправность RDP — срабатывает заданная политика доступа.
| Сеть A | Сеть B | Что можно заключить |
|---|---|---|
| TCP False | TCP True | RDP-порт доступен не по всем маршрутам; проверяем сеть A, VPN, allowlist и фильтрацию |
| TCP False | TCP False | Вероятнее проблема ближе к серверу: порт, внешний firewall, Windows Firewall или listener |
| TCP True | TCP True | Базовый транспорт работает из обеих сетей; ищем выше уровня TCP |
| RDP к другому VPS работает, к нужному нет | Без изменений | Это доказывает только способность сети использовать RDP вообще, но не доступность конкретного IP:PORT |
Успешное подключение к другому RDP-серверу не доказывает, что текущий Windows VPS доступен. Firewall фильтрует конкретные адреса и порты. Поэтому контрольная единица здесь всегда одна: нужный IP:PORT.
Разрешает ли Windows Defender Firewall входящие RDP-подключения
Порт слушается локально, а Test-NetConnection с внешнего компьютера возвращает False. Реестр в этот момент уже не главный подозреваемый: если listener есть, нужно проверить, выпускает ли Windows этот порт наружу.
Откройте PowerShell от имени администратора:
Get-NetFirewallRule -DisplayGroup "Remote Desktop"Команда показывает правила группы Remote Desktop. На локализованных версиях Windows отображаемое имя группы может отличаться, поэтому при отсутствии результата откройте wf.msc и найдите входящие правила Remote Desktop вручную.
Для правил нужно проверить не только Enabled, но и направление, действие и профиль:
Get-NetFirewallRule -DisplayGroup "Remote Desktop" |
Select-Object DisplayName, Enabled, Direction, Action, ProfileПортовые фильтры:
Get-NetFirewallRule -DisplayGroup "Remote Desktop" |
Get-NetFirewallPortFilterАдресные ограничения:
Get-NetFirewallRule -DisplayGroup "Remote Desktop" |
Get-NetFirewallAddressFilterЧерез GUI те же настройки находятся в:
wf.mscДалее: Inbound Rules → Remote Desktop.
Правило Remote Desktop включено, но порт всё равно закрыт
Enabled=True ещё не означает, что правило подходит текущему подключению. Обычно нужно проверить четыре вещи: профиль, LocalPort, Action и Scope.
Посмотрите активный сетевой профиль Windows:
Get-NetConnectionProfileЕсли правило действует, например, только для Domain, а сетевой интерфейс Windows VPS находится в Public, оно не даст ожидаемого результата. В GUI это видно на вкладке профилей конкретного firewall rule.
Следующая точка — LocalPort. При стандартном RDP ожидается 3389. Если PortNumber уже изменён на 3390, а firewall продолжает разрешать 3389, правило формально включено, но фактический listener остаётся недоступным.
Потом проверьте Scope или RemoteAddress. Правило может разрешать соединения не с любого адреса, а только с заданной подсети или одного административного IP. Из офиса всё работает, дома появляется 0x204 — такой сценарий часто объясняется именно scope, а не поломкой RDP.
| Результат проверки | Что означает | Следующий шаг |
|---|---|---|
| Rule Disabled | Это правило не разрешает входящий RDP | Проверить, какое правило должно использоваться, и включить его при необходимости |
| Enabled, но Action=Block | Правило блокирует совпавший трафик | Проверить порядок и набор firewall rules |
| Enabled, но LocalPort не совпадает с PortNumber | Firewall разрешает другой порт | Сопоставить RDP PortNumber и портовое правило |
| Enabled, порт правильный, профиль не совпадает | Правило не применяется к текущему сетевому профилю | Проверить Get-NetConnectionProfile и Profile правила |
| Enabled, профиль и порт правильные, RemoteAddress ограничен | Подключаться могут только разрешённые IP | Сравнить текущий внешний IP с Scope |
| Всё совпадает, локально LISTENING есть, снаружи TCP False | Windows Firewall становится менее вероятной причиной | Проверить внешний firewall/security group и маршрут |
Особенно внимательно проверьте firewall после смены RDP-порта
Обычная конфигурационная ловушка выглядит так: PortNumber уже 3390, netstat показывает LISTENING на 3390, а Windows Firewall всё ещё пропускает только 3389. В этом состоянии перезапуск TermService ничего не меняет.
Здесь должны совпасть четыре значения: PortNumber, локальный LISTENING, LocalPort firewall rule и порт в RDP-клиенте. Плюс, если есть внешний firewall хостинга, то и его правило.
Не отключайте Windows Firewall целиком как постоянное «исправление». Если RDP — единственный доступ к VPS, перед изменением правил убедитесь, что открывается web-, VNC- или другая независимая консоль. Ошибка в одном inbound rule может просто отрезать администратора от сервера.
Слушает ли Windows VPS порт RDP и работает ли служба TermService
TermService показывает Running. Это только половина проверки. Для рабочего Remote Desktop служба должна не просто быть запущена — Windows должна создать RDP listener на фактическом порту.
Если RDP уже потерян, выполняйте команды через независимую консоль VPS.
Сначала состояние службы:
Get-Service TermServiceОжидаемый результат:
Status Name DisplayName
------ ---- -----------
Running TermService Remote Desktop ServicesАльтернативная проверка:
sc query TermServiceили:
services.mscЕсли TermService остановлена или сразу останавливается
Однократно запустить службу можно через Services или PowerShell, но если она снова переходит в Stopped, повторный запуск уже не диагностика. Нужно посмотреть, почему Windows не удерживает службу в рабочем состоянии.
Проверьте конфигурацию службы:
sc qc TermServiceИ связанные службы:
Get-Service TermService -RequiredServicesПосле неудачной попытки запуска откройте Event Viewer → Windows Logs → System и отфильтруйте события по времени запуска. Сообщения Service Control Manager часто дают гораздо больше информации, чем само состояние Stopped: отказ запуска, проблема зависимости, ошибка конфигурации или системного компонента.
Если проблема появилась сразу после hardening, обновления политик или ручного изменения служб, сначала восстановите известную рабочую конфигурацию этого участка. Не стоит одновременно править TermService, firewall и RDP-Tcp — после этого трудно понять, где была исходная причина.
Как проверить RDP listener
Для стандартного порта:
Get-NetTCPConnection -LocalPort 3389 -State ListenЛибо:
netstat -ano | findstr :3389У работающего listener должна присутствовать строка LISTENING. Например:
TCP 0.0.0.0:3389 0.0.0.0:0 LISTENING 820PID можно сопоставить со службой:
tasklist /svc | findstr TermServiceДля более подробного вывода:
netstat -anob | findstr 3389Есть ещё одна полезная серверная проверка:
qwinstaВ нормальной конфигурации в выводе можно увидеть RDP listener rdp-tcp в состоянии ожидания подключений. Это другой взгляд на ту же серверную часть: netstat показывает сетевой сокет, а qwinsta — состояние терминальных сессий и listener.
TermService Running, PortNumber правильный, но LISTENING отсутствует
Вот здесь часто заканчиваются короткие инструкции, хотя именно комбинация самая интересная. Служба работает, порт в реестре известен, но никто его не слушает.
Сначала ещё раз получите фактический PortNumber:
Get-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp' -Name PortNumberЗатем проверьте не только 3389, а именно полученное значение:
Get-NetTCPConnection -LocalPort PORT -State ListenЕсли результата нет, посмотрите конфигурацию ветки:
HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-TcpДля диагностики полезно проверить, не отключён ли сам RDP-Tcp listener. Один из связанных параметров — fEnableWinStation. При рабочей конфигурации RDP-Tcp должен быть разрешён. Реестр здесь лучше использовать как подтверждение состояния, а не как место для случайного перебора значений.
После изменения RDP-настроек или порта перезапустите Remote Desktop Services только если у вас есть независимый доступ к серверу. Затем снова выполните три проверки:
Get-Service TermService
qwinsta
Get-NetTCPConnection -LocalPort PORT -State ListenЕсли TermService Running, rdp-tcp появился и порт находится в LISTENING — серверная часть listener восстановлена. Дальше уже проверяем доступность порта снаружи.
| Результат | Что означает | Куда идти дальше |
|---|---|---|
| TermService Running + LISTENING | Служба и сетевой listener работают | Firewall, NLA, пользователь, клиент и журналы |
| TermService Stopped | RDP-служба не работает | Запуск, зависимости и System log |
| TermService запускается и снова падает | Есть серверная причина остановки службы | Service Control Manager и изменения перед появлением проблемы |
| Running + PortNumber правильный + LISTENING нет | Служба не создала ожидаемый RDP listener | RDP-Tcp, qwinsta, политики и конфигурация listener |
| Порт слушает другой PID | Возможен конфликт порта | Определить процесс и устранить конфликт |
| LISTENING есть локально, снаружи TCP False | Listener работает, блокировка находится дальше по сетевому пути | Windows Firewall и внешний firewall |
Если порт слушается локально — это уже конкретный результат. Реестр и TermService перестают быть первыми подозреваемыми, а диагностику переносим наружу, к firewall и сети.
Не изменился ли RDP-порт после настройки Windows VPS
Если Windows VPS с RDP раньше настраивали вручную, применяли hardening-скрипт или переносили из другого окружения, RDP может работать не на 3389. Клиент в таком случае безуспешно обращается к стандартному порту, хотя Remote Desktop на сервере исправен.
Текущий PortNumber:
Get-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp' -Name PortNumberПараметр хранится здесь:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-TcpИмя:
PortNumberЕсли используется нестандартный порт, его нужно указать в RDP-клиенте:
SERVER_IP:PORTНапример:
203.0.113.10:3390Нашли PortNumber 3390 — не спешите менять его обратно. Сначала проверьте, согласована ли вся цепочка:
- PortNumber равен 3390;
Get-NetTCPConnectionилиnetstatпоказывает LISTENING на 3390;- Windows Firewall разрешает входящий TCP 3390;
- внешний firewall VPS, если он есть, тоже разрешает 3390;
- клиент подключается к
IP:3390; Test-NetConnection IP -Port 3390возвращает True.
Типичная ошибка как раз выглядит иначе: реестр уже показывает 3390, listener слушает 3390, а firewall по-прежнему открыт на 3389. В такой конфигурации менять пароль или NLA нет смысла — TCP до нужного listener не доходит.
После любого изменения порта повторите проверку именно снаружи:
Test-NetConnection SERVER_IP -Port PORTЛокальный LISTENING подтверждает только работу Windows. Внешний TCP-тест подтверждает, что к этому listener действительно можно добраться через весь сетевой периметр.

Включён ли Remote Desktop в Windows и не запрещён ли он политикой
Windows Firewall может разрешать порт, а TermService — работать, но Windows должна разрешать сами входящие Remote Desktop connections. Если listener не поднимается или ошибка появилась после применения security policy, эту ветку нужно проверить отдельно.
Начните с Settings → System → Remote Desktop. Remote Desktop должен быть включён.
Связанное состояние можно проверить в реестре:
HKLM\SYSTEM\CurrentControlSet\Control\Terminal ServerПараметр:
fDenyTSConnectionsПри разрешённых RDP-подключениях ожидается:
fDenyTSConnections = 0Получить значение через PowerShell:
Get-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server' -Name fDenyTSConnectionsКак понять, что локальную настройку переопределяет политика
Сложнее выглядит ситуация, когда Settings показывает ожидаемое состояние, администратор меняет локальный параметр, но после обновления политик проблема возвращается. Тогда нужно проверить не только локальную конфигурацию, но и фактически применённые Group Policy.
Для локальной политики можно открыть:
gpedit.mscНас интересуют политики Remote Desktop Services в разделе Windows Components. В доменной среде локальный редактор не показывает всей картины, поэтому полезнее посмотреть результирующую политику:
rsop.mscили сформировать отчёт:
gpresult /h C:\gpresult.htmlПосле создания откройте C:\gpresult.html и посмотрите, какая политика реально применяется к компьютеру.
Если доменная GPO запрещает Remote Desktop, локальное изменение может выглядеть рабочим только до очередного обновления политик. В таком сценарии бесконечно возвращать fDenyTSConnections вручную бесполезно — нужно исправлять источник политики.
Для контрольной проверки после изменения политики можно обновить её:
gpupdate /forceЗатем снова проверить:
Get-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server' -Name fDenyTSConnections
Get-Service TermService
qwinstaИ уже после этого — внешний TCP-порт.
Характерная микросцена здесь простая: Remote Desktop визуально включён, администратор открывает firewall, но после применения security baseline listener снова исчезает или подключение остаётся запрещённым. В такой ситуации узкое место не в 3389, а в политике, которая управляет поведением RDP.
Может ли NLA или CredSSP мешать подключению к VPS
NLA и CredSSP проверяют только после подтверждения транспортного уровня: Test-NetConnection возвращает True, TermService работает и RDP listener существует. При закрытом порте никакое изменение NLA не поможет — клиент ещё не дошёл до стадии предварительной аутентификации.
Network Level Authentication переносит аутентификацию пользователя на ранний этап RDP-соединения. CredSSP участвует в передаче и согласовании учётных данных. Поэтому неисправность на этом уровне выглядит иначе, чем обычный timeout: TCP до сервера уже проходит, но RDP не может завершить security negotiation или вход пользователя.
Как отличить проблему NLA от сетевой ошибки и отказа учётной записи
Сначала зафиксируйте три результата:
Test-NetConnection SERVER_IP -Port PORT
Get-Service TermService
Get-NetTCPConnection -LocalPort PORT -State ListenЕсли первый тест False, проблема ещё не на уровне NLA. Если все три проверки успешны, транспорт и listener уже подтверждены.
| Симптом | Какой уровень вероятнее | Что проверить |
|---|---|---|
| TCP False | Сеть, firewall, port, listener | Не переходить к NLA |
| TCP True, но клиент обрывается до нормального входа | RDP negotiation, NLA, CredSSP, client policy | Другой клиент, журналы RemoteConnectionManager, NLA |
| Появляется явный отказ по паролю | Credentials или account state | Имя пользователя, пароль, блокировка учётной записи |
| Сервер принимает другого пользователя | Конкретная учётная запись или её права | Remote Desktop Users и User Rights Assignment |
| Другой компьютер входит тем же пользователем | Клиентская конфигурация | RDP-клиент, policies, сохранённые credentials |
Для сравнения полезно использовать стандартный mstsc.exe на другом Windows-компьютере. Если тот же IP, порт и пользователь работают там, серверную конфигурацию NLA лучше пока не менять. Разница находится на клиентской стороне.
Проверьте также, используется ли реальный пароль учётной записи. PIN Windows Hello — это способ локальной разблокировки устройства и не всегда подходит как пароль для удалённой аутентификации к другой Windows-системе.
Как проверить, требует ли RDP Network Level Authentication
Связанный параметр RDP-Tcp можно посмотреть через PowerShell:
Get-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp' -Name UserAuthenticationЗначение 1 означает требование NLA для RDP-Tcp. Эта проверка полезна именно как диагностика текущей конфигурации.
Через графический интерфейс настройку можно увидеть в свойствах Remote Desktop. На Windows Server конкретное расположение элемента зависит от версии и установленной роли, но смысл один: требовать Network Level Authentication для удалённых подключений.
Когда временная проверка без NLA действительно имеет смысл
Временно рассматривать NLA как гипотезу стоит только при выполнении всех базовых условий: порт доступен извне, listener работает, а сбой начинается уже после установления транспортного соединения.
Перед тестом желательно иметь доступ через консоль VPS. Затем можно временно изменить требование NLA, повторить подключение и сравнить поведение.
Если без NLA RDP начинает работать, это ещё не готовое исправление. Результат говорит, что нужно разбирать следующий слой: клиент, CredSSP, credentials, security policy или совместимость RDP-компонентов. Постоянно оставлять ослабленную конфигурацию ради обхода симптома не стоит.
Если же отключение NLA вообще не меняет поведение, возвращайте исходную настройку и продолжайте диагностику по журналам. Здесь уже нет смысла крутить один и тот же переключатель.
Где искать признаки проблемы CredSSP или security negotiation
Сделайте одну новую попытку подключения и сразу посмотрите:
Event Viewer → Applications and Services Logs → Microsoft → Windows → TerminalServices-RemoteConnectionManager
Дополнительно проверьте клиентское сообщение RDP. Ошибка, в которой прямо упоминаются credentials, authentication или CredSSP, гораздо полезнее общего 0x204 и должна изменить направление диагностики.
Когда TCP True, listener есть и RemoteConnectionManager видит обращение, сеть уже можно почти снять с подозрения. Дальше разбираем handshake и auth, а не возвращаемся в маршрутизатор после каждой неудачной попытки.
Есть ли у пользователя право входить на Windows VPS через Remote Desktop
Права пользователя нужно проверять только тогда, когда соединение дошло до этапа аутентификации. Если TCP-порт закрыт и Windows не видит RDP-запрос, членство в Remote Desktop Users ничего не изменит.
RDP-соединение ещё не установлено
Нет доступного TCP-порта или сервер не обрабатывает RDP-запрос. Проверяем сеть, firewall и listener.
Сервер дошёл до аутентификации
Появляется окно входа, сервер фиксирует пользователя или выдаёт отказ авторизации. Тогда проверяем credentials и права.
Участников локальной группы можно посмотреть командой:
net localgroup "Remote Desktop Users"Управление локальными пользователями:
lusrmgr.mscАдминистраторы обычно уже имеют право удалённого входа, а обычному пользователю может потребоваться членство в Remote Desktop Users.
Но группы недостаточно. Откройте:
secpol.mscДалее:
Local Policies → User Rights Assignment → Allow log on through Remote Desktop Services
И обязательно:
Deny log on through Remote Desktop Services
Запрещающее право имеет приоритет. Пользователь может состоять в Remote Desktop Users и всё равно не проходить вход, если на него или его группу распространяется Deny.
В доменной среде эти настройки могут задаваться GPO. Тогда снова полезен результирующий набор политик, а не только локальный secpol.msc.
Проверьте формат имени пользователя
Для локальной учётной записи standalone Windows VPS можно явно указать локальный контекст:
.\usernameили имя сервера:
SERVERNAME\usernameЭто особенно полезно, когда RDP-клиент автоматически подставляет сохранённый домен или другую учётную запись.
Если другой пользователь входит на тот же VPS с того же компьютера, сеть, firewall и listener уже практически исключаются. Не надо снова открывать 3389. Сравнивайте состояние учётных записей, формат login и User Rights Assignment.
Как понять, находится ли проблема на Windows VPS или на RDP-клиенте
Один ноутбук получает 0x204, другой сразу подключается к тому же IP и порту. Это уже сильный диагностический результат: основная серверная цепочка способна принять RDP-сессию.
Чтобы не менять сервер наугад, используйте матрицу «два клиента × две сети».
| Клиент | Сеть | Что проверяем |
|---|---|---|
| Компьютер A | Основной интернет | Исходный проблемный сценарий |
| Компьютер A | Мобильный hotspot | Влияние сети при неизменном клиенте |
| Компьютер B | Основной интернет | Влияние клиента при неизменной сети |
| Компьютер B | Мобильный hotspot | Контрольная комбинация |
Если три комбинации работают, а одна стабильно нет, серверную конфигурацию лучше не трогать. Ищите отличающуюся переменную.
На проблемном компьютере сначала сравните TCP:
Test-NetConnection SERVER_IP -Port PORTЕсли TCP тоже False только на этом устройстве, проверьте:
- VPN;
- локальный firewall;
- endpoint security;
- сетевой профиль;
- маршрут;
- корпоративные ограничения.
Если TCP True, но конкретный RDP-клиент выдаёт 0x204, сравните его со стандартным:
mstsc.exeСоздайте новое подключение вручную, не используя старый .rdp-файл. Так можно исключить сохранённые gateway-настройки, credentials и параметры конкретного профиля.
Если Windows-клиент работает, а приложение на macOS, iOS или другом устройстве нет, сначала обновите или пересоздайте подключение на проблемном клиенте. Код 0x204 может отображаться разными Microsoft Remote Desktop-клиентами, поэтому ориентироваться нужно не на название платформы, а на результаты TCP-теста и серверных журналов.
За один тест меняйте одну переменную. Сначала сеть. Потом клиент. Потом credentials. Если одновременно отключить VPN, поменять порт и перезапустить TermService, рабочее подключение можно получить, но причина так и останется неизвестной.
Какие события Windows проверить, если порт открыт, но RDP не работает
Test-NetConnection=True, TermService Running и RDP-порт LISTENING. Следующий вопрос: до какого этапа Windows доводит конкретную попытку подключения? Ответ лучше искать в журналах в момент воспроизведения ошибки.
Откройте:
eventvwr.mscОсновные журналы:
Applications and Services Logs → Microsoft → Windows → TerminalServices-RemoteConnectionManager → Operational
Applications and Services Logs → Microsoft → Windows → TerminalServices-LocalSessionManager → Operational
При проблемах с credentials и правами:
Windows Logs → Security
Как не утонуть в старых событиях
Запомните текущее время, очистить журнал для этого не нужно. Сделайте ровно одну попытку RDP, дождитесь ошибки, сразу обновите нужные журналы и смотрите события в диапазоне одной-двух минут вокруг теста.
Если записей много, используйте Filter Current Log и ограничьте период. Такая привязка ко времени намного полезнее, чем поиск случайного Event ID среди событий за несколько дней.
| Журнал | Что он помогает подтвердить | Куда идти дальше |
|---|---|---|
| TerminalServices-RemoteConnectionManager/Operational | RDP-компонент сервера увидел попытку подключения и обрабатывает этап удалённого соединения | Security negotiation, NLA, credentials |
| TerminalServices-LocalSessionManager/Operational | Что происходит с пользовательской RDP-сессией: вход, создание, отключение, переподключение | Права пользователя, состояние сессии, logon |
| Security | Успешный или неуспешный вход, если соответствующий аудит включён | Credentials, account state, User Rights Assignment |
| System | Ошибки служб и системных компонентов | TermService, зависимости, Service Control Manager |
Что проверять после появления RDP-запроса в RemoteConnectionManager
Если новая попытка появляется в TerminalServices-RemoteConnectionManager, пакет уже дошёл до RDP-компонента Windows. В этот момент снова проверять внешний firewall без нового симптома обычно не нужно.
Полезный ориентир — событие 1149, которое обычно фиксирует успешную аутентификацию пользователя компонентом RemoteConnectionManager. Оно не означает, что полноценный рабочий стол уже обязательно открылся, но показывает, что соединение прошло заметно дальше простого TCP.
Если после этого пользователь всё равно не получает рабочую сессию, переходите в TerminalServices-LocalSessionManager. Там уже интересует создание и состояние пользовательской сессии.
Например, события LocalSessionManager могут показывать успешный вход в сессию, отключение или переподключение. Это позволяет отделить «аутентификация не прошла» от ситуации «пользователь вошёл, но сессия сразу оборвалась».
Когда нужен Security log
Если проблема выглядит как отказ конкретному пользователю, смотрите Windows Logs → Security. При включённом аудите входов там можно встретить:
- 4624 — успешный вход;
- 4625 — неудачная попытка входа.
Для Remote Desktop особенно интересен Logon Type 10 — RemoteInteractive. Но Event ID нельзя читать отдельно от деталей события: имя пользователя, источник, статус и substatus дают больше пользы, чем сам номер.
Если 4625 появляется ровно в момент теста, сеть уже не главный вопрос. Смотрите reason/status, правильность username, пароль, состояние аккаунта и права входа.
Если RemoteConnectionManager видит запрос, но Security вообще не фиксирует попытку пользователя, сбой может происходить раньше полноценного logon — например, на этапе NLA/security negotiation.
RDP-событий нет
Возвращаемся к порту, firewall, маршруту и listener. Windows ещё не показывает обработку нашей попытки.
RemoteConnectionManager видит подключение
Транспорт в значительной степени подтверждён. Проверяем security negotiation, NLA и credentials.
Есть события входа пользователя
Диагностика переходит к учётной записи, правам и состоянию RDP-сессии.
Так журналы превращаются не в список Event ID, а в продолжение той же диагностической цепочки: дошёл ли запрос, прошёл ли authentication, создалась ли сессия.
Как восстановить доступ к Windows VPS, если RDP 0x204 не удаётся устранить удалённо
Если RDP был единственным привычным способом управления сервером, не восстанавливайте его вслепую. Нужен независимый административный канал: web-консоль, VNC/noVNC, emergency console или другой способ, который предоставляет VPS-провайдер.
Через такую консоль можно проверить Windows локально даже при полностью закрытом внешнем RDP.
- Проверьте сетевую конфигурацию Windows.
Убедитесь, что система загружена и интерфейс имеет ожидаемый IP.ipconfig - Проверьте Remote Desktop Services.
Если служба остановлена или сразу падает, переходите к System log и Service Control Manager.Get-Service TermService - Узнайте фактический RDP-порт.
Get-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp' -Name PortNumber - Проверьте listener.
При необходимости:qwinsta Get-NetTCPConnection -LocalPort PORT -State Listennetstat -ano | findstr :PORT - Проверьте Windows Firewall.
Смотрите не только Enabled, но и Profile, LocalPort и Scope.Get-NetFirewallRule -DisplayGroup "Remote Desktop" - Убедитесь, что Remote Desktop разрешён.
При подозрении на GPO проверьтеGet-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server' -Name fDenyTSConnectionsrsop.mscилиgpresult. - Сделайте новую RDP-попытку и откройте TerminalServices logs. Если запрос появляется на сервере, сетевую часть уже можно сузить.
- После исправлений протестируйте порт с внешнего компьютера.
Test-NetConnection SERVER_IP -Port PORT - Только после успешного TCP-теста снова проверяйте полноценный вход по RDP.
RDP 0x204: проверка Windows VPS за 10 минут
- VPS включён и открывается через панель или независимую консоль.
- Используется правильный публичный IP.
- Известен фактический RDP-порт.
- Выполнен
Test-NetConnection IP -Port PORT. - При False выполнена проверка из второй сети.
- Проверен внешний firewall или security group.
- Проверены профиль, LocalPort и Scope Windows Firewall.
- TermService находится в состоянии Running.
qwinstaпоказывает RDP listener.- Фактический RDP-порт находится в LISTENING.
- PortNumber совпадает с listener, firewall и настройкой клиента.
- Remote Desktop разрешён в Windows.
- Проверено, не переопределяет ли настройку GPO.
- При открытом порте проверены NLA, credentials и клиент.
- Права пользователя проверяются только после достижения стадии входа.
- TerminalServices logs просмотрены в момент новой попытки.
- При необходимости выполнен тест с другого клиента и другой сети.
| Проверка | Нормальный результат | Если результат другой |
|---|---|---|
Test-NetConnection IP -Port PORT | TcpTestSucceeded: True | При False проверять путь до сервера, firewall и listener |
Get-Service TermService | Running | При Stopped смотреть запуск службы и System log |
qwinsta | Присутствует RDP listener | Проверить RDP-Tcp и политики |
Get-NetTCPConnection -LocalPort PORT -State Listen | Есть listener | Проверить PortNumber и конфигурацию RDP-Tcp |
Get-NetFirewallRule ... | Нужное inbound rule включено и подходит профилю | Проверить Profile, Action, LocalPort и Scope |
Get-ItemProperty ... PortNumber | Совпадает с используемым портом | Подключаться к фактическому порту и синхронизировать firewall |
fDenyTSConnections | 0 | Проверить Remote Desktop settings и GPO |
| RemoteConnectionManager | Новая попытка появляется в журнале | Если записи нет, вернуться к сетевому пути и listener |
net localgroup "Remote Desktop Users" | Нужный обычный пользователь имеет необходимый доступ | Проверить группу и User Rights Assignment |
Для нормальной диагностики 0x204 достаточно собрать несколько фактов: какой IP и порт используются, проходит ли TCP-тест, работает ли TermService, существует ли listener, разрешает ли трафик firewall и видит ли Windows новую RDP-попытку. После этого проблема уже не выглядит как «RDP просто не подключается» — она оказывается на конкретном участке цепочки.
TcpTestSucceeded: False означает, что сначала разбираем сеть, firewall, PortNumber и listener. True позволяет двигаться выше — к RDP negotiation, NLA, credentials, правам пользователя и журналам. Если тот же Windows VPS стабильно открывается с другого устройства или через другую сеть, серверную конфигурацию без нового доказательства лучше не трогать.
И перед любыми изменениями RDP-порта, firewall или политик Remote Desktop проверьте независимую консоль VPS. Если что-то пойдёт не так, именно она позволит вернуть рабочую конфигурацию, не превращая ошибку 0x204 в полную потерю административного доступа.


