RDP на компьютер с того же компьютера не удается. Почему?

Вопрос или проблема

Фон: У нас есть программное обеспечение, которое (удаленно) извлекает информацию с рабочего стола Windows. Рабочий стол должен быть заблокирован, но если мы делаем это простым способом, Windows считает, что никто не смотрит на экран, и прекращает его обновление. Чтобы предотвратить это, мы открываем сеанс RDP на компьютере. Это блокирует экран как побочный эффект, но оригинальный рабочий стол всё ещё обновляется.

У нас есть небольшая программа (называемая ‘lockscreen’), основанная на Remote Desktop Active X Control для открытия сеанса RDP. Она ведет себя так же, как клиент Microsoft Terminal Services (mstsc.exe) для всех целей и задач этого вопроса. Любое поведение, описанное ниже, относится как к lockscreen, так и к mstsc. Все результаты получены на компьютере с Windows 7.

Запуск программы на целевой машине при попытке подключения к целевой машине (localhost) вызывает ошибку “Ваш компьютер не смог подключиться к другому сеансу консоли на удаленном компьютере, потому что у вас уже есть текущий сеанс консоли” (код ошибки 1800). Это происходит независимо от того, используем ли мы ‘localhost’, 127.0.0.1, имя или IP-адрес целевого компьютера. Кажется, что это проверка в Remote Desktop Active X Control, которую можно обойти, используя IP-адрес 127.0.0.2 для доступа к локальной машине. Использование 127.0.0.2 действительно позволяет соединению продолжиться, и производится попытка входа в систему. Однако потом на удаленном рабочем столе отображается только “Доступ запрещен” и кнопка ОК. Нажатие на кнопку или ожидание минуту вызывает отключение сеанса.

Я не смог выяснить, почему возникает ошибка “Доступ запрещен”. В журнале событий нет записей, которые проясняют ситуацию. Это происходит только при попытке подключения с самого целевого компьютера: подключение с другого компьютера проходит успешно.

Некоторые эксперименты, которые я провел: При попытке подключения с другого компьютера, но через прокси, работающий на целевом компьютере, подключение удается — не имеет значения, подключается ли прокси к localhost или к 127.0.0.2. При подключении с самого целевого компьютера, через тот же прокси, соединение не удается, опять же независимо от того, соединяется ли прокси с localhost или 127.0.0.2. Кажется, что важным является только местоположение программы, устанавливающей соединение.

Во всех описанных сценариях FreeRDP успешно подключается. Очевидно, что проблем с аутентификацией или авторизацией, или других фундаментальных проблем, препятствующих созданию соединения, нет.

Мои два вопроса: Почему я получаю отказ в доступе при установке сеанса RDP с одного компьютера на себя? Есть ли что-то, что я могу с этим сделать?

Подключение к службе Terminal Server, работающей на localhost (или IP 127.0.0.1), заканчивается тем, что сеанс отключается или не удается подключиться. Это поведение явно заложено в RDP Microsoft, и причина этого со временем утеряна.

Ниже приведены некоторые обходные пути, которые обходят это ограничение. Как видите, разработчик Microsoft, который включил это в RDP, не слишком утруждался. Обходные пути могут все еще работать для последней версии Windows 10, но я не тестировал это.

  1. Подключите Remote Desktop Connection к 127.0.0.2, который является псевдонимом 127.0.0.1.

  2. Подключитесь через нестандартный порт, отличный от стандартного (3389).

  3. Запустите mstsc.exe, симулируя выполнение на другой операционной системе.
    Для этого нужно скопировать из C:\Windows\System32 файлы mstsc.exe и mstscax.dll в новую папку, щелкнуть правой кнопкой мыши по скопированному mstsc.exe, выбрать Свойства, вкладку Совместимость и отметить “Запускать программу в режиме совместимости” для “Windows 98 / Windows Me”.

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

Какой службой управляется это приложение? Если удастся выполнить его от имени системы, оно должно продолжать работать независимо от блокировки экрана или входа кого-либо в систему. Я использовал это для автоматизации SharePoint и некоторых сценариев, так что конечный пользователь никогда этого не видит, никто не должен быть в системе, и с помощью групповой политики это запускается каждый раз при перезагрузке системы.

Извините за путаницу, я имел в виду ваше приложение. Не RDP. Приложение/программное обеспечение, которое вы используете для сбора данных. Проблема заключается в том, от какого аккаунта/службы оно выполняется. Есть множество коммерческих приложений, которые могут считывать данные с вашего компьютера, независимо от того, сидит кто-то за компьютером или нет, без необходимости в RDP-соединении для обмана системы. Большинство из этих приложений выполняются от имени системного аккаунта компьютера.

Это действительно работает как задумано. Обычно невозможно инициировать сеанс RDP на одном компьютере из-за проблем с обратной связью (loopback).

Можно запатчить файл .dll терминальных служб, чтобы это стало возможным, но это не красивое решение, потому что с каждым обновлением Windows это будет ломаться, и патч придется применять снова, что сложно, поскольку нужно искать патч для новой версии файла.

Я бы рекомендовал выяснить, почему рабочий стол должен быть заблокирован. Возможно, можно изменить это так, чтобы машина фактически не блокировалась, или была установлена другая блокировка.

Например, можно выбрать переключение на другого пользователя. Первый пользователь все еще работает в фоновом режиме в “заблокированном” состоянии, но всё ещё может быть в состоянии, который устраивает вас. Другой пользователь находится в другом состоянии, и вы можете попытаться заблокировать этого пользователя или даже выйти из его учетной записи.

Я столкнулся с аналогичными проблемами при попытке подключения к серверу RDP (в моем случае MS Server 2025 Standard) с localhost. Каждый раз, когда я пытался подключиться, моя активная консоль или сеанс RDP отключался с сообщением об ошибке: “Вы были отключены, потому что другое подключение было установлено к удаленному компьютеру“.

Я решил эту проблему, применив следующую конфигурацию:

  1. Откройте редактор групповой политики, запустив gpedit.msc.
  2. Перейдите в Конфигурация компьютера\Политики\Административные шаблоны\Компоненты Windows\Службы удаленных рабочих столов\Хост сеанса удаленных рабочих столов\Безопасность\Требовать использования определенного уровня безопасности для удаленных RDP-соединений.
  3. Включите политику и выберите RDP из выпадающего меню “Уровень безопасности“.
  4. Примените изменения, запустив gpupdate.

После внедрения этих настроек я смог установить несколько одновременных сеансов RDP с одного сервера.

С этими изменениями становится немного сложнее сохранить учетные данные пользователя. Однако вы можете создать файл .rdp с сохраненными учетными данными для быстрого доступа, если это необходимо. Вы можете использовать любой подходящий адрес сервера, такой как localhost, 127.0.0.1, имя ПК или LAN IP — все они будут работать.

Ответ или решение

Проблема, с которой вы столкнулись, является распространенной и связанной с попыткой установить сеанс удаленного рабочего стола (RDP) на тот же компьютер, с которого производится подключение. Этот вопрос требует тщательного рассмотрения, так как связано с особенностями работы службы удаленных рабочих столов в Windows.

Теория (Theory)

Главной причиной возникновения данной проблемы является защита от зацикливания и особенности поведения протокола RDP при соединении с локальным хостом. Windows по умолчанию не позволяет устанавливать RDP-сессии к самому себе, чтобы избежать нежелательных последствий и конфликтов с существующим консольным сеансом. При попытке подключения к localhost через стандартные адреса, такие как 127.0.0.1, возникает ошибка либо отказ в доступе. Это поведение может быть объяснено внутренними проверками и ограничениями, заложенными в MSTSC (Microsoft Terminal Services Client) и соответствующими компонентами.

Пример (Example)

На ваших платформенных настройках, как вы сообщили, вы используете собственную программу на базе ActiveX-контроля Remote Desktop. Такая программа ведет себя аналогично стандартному MSTSC клиенту, однако при этом не позволяет установить RDP-сессию к самому компьютеру из-за вышеописанных ограничений, что приводит к ошибке "Access Denied". Этот отказ в доступе является следствием архитектурного решения Microsoft, направленного на предотвращение создания RDP-сессий из одного и того же источника.

Однако, как вы заметили, ваши эксперименты с FreeRDP показали возможность установления успешного соединения. FreeRDP является альтернативной реализацией протокола RDP, которая может обойти некоторые встроенные ограничения MSTSC и позволяет подключаться к локальному хосту.

Применение (Application)

Чтобы обойти данное ограничение и решить проблему, вам необходимо рассмотреть несколько подходов:

  1. Настройка работы программ: Исследуйте возможность выполнения вашей программы в сеансах, минуя необходимость постоянного RDP-подключения. Это можно сделать, изменив учетную запись, под которой запускается приложение, на системную учетную запись, или рассмотреть использование задач Windows, которые могут выполняться в фоновом режиме без необходимости активного сеанса.

  2. Использование альтернативного программного обеспечения: Рассмотрите возможность использования программного обеспечения, которое, как и FreeRDP, может обойти ограничения на подключения к локальному хосту. Это может включать использование более гибких решений, способных работать вне стандартных RDP-сессий.

  3. Изменение конфигурации RDP: Несмотря на то, что патчинг системных .dll файлов RDP может обеспечить возможность подключения, такой подход крайне нерекомендуем из-за необходимости постоянного обновления и потенциальных рисков безопасности. Вместо этого вы можете попробовать изменить настройки безопасности RDP, чтобы использовать более низкий уровень безопасности, что иногда позволяет обойти ограничения для внутреннего подключения. Для этого:

    • Откройте редактор групповой политики (gpedit.msc) и перейдите в раздел Computer Configuration\Policies\Administrative Templates\Windows Components\Remote Desktop Services\Remote Desktop Session Host\Security.
    • Включите параметр Require use of specific security layer for remote (RDP) connections и выберите RDP в выпадающем меню уровня безопасности.
    • Примените изменения и обновите политику с помощью команды gpupdate.
  4. Адаптация посредством технических решений: Можно попробовать использовать сетевые прокси или туннели, чтобы имитировать подключение с другого устройства, что может работать в случае, если ограничения касаются только "местоположения" приложения, создающего сеанс.

  5. Пересмотр взаимодействия с пользователем: Изучите необходимость блокировки рабочего стола, возможно, альтернативные методы блокирования, такие как смена пользователя или выполнение фоновых задач под другим сеансом, будут решением вашей проблемы без необходимости RDP-подключения к самому себе.

Обобщая, проблема с подключением через RDP к самому себе в Windows связана с защитными мерами, встроенными в систему. Рекомендуется рассмотреть изменение архитектуры приложения или использование альтернативных методов для обхода ограничений, которые не нарушают правила безопасности и целостности системы.

Оцените материал
Добавить комментарий

Капча загружается...