ПРЕДУПРЕЖДЕНИЕ: Статья предназначена для повышения осведомленности о киберугрозах и методах защиты. Все методы и инструменты, упомянутые в статье, должны использоваться только в законных целях, с разрешения владельцев систем и в рамках действующего законодательства РФ.
Всё о shadow-подключении через RDP
Всё, что вы видите на экране при обычном RDP-подключении — это не тот рабочий стол, который видит пользователь за своим монитором. Это копия, созданная специально для вас.
Я понял это, когда впервые попытался помочь коллеге с зависшей программой. Подключился через стандартный клиент удалённого рабочего стола и увидел пустой рабочий стол с дефолтными обоями, тогда как пользователь по телефону показывал свой экран с открытыми документами.
Мы находились в разных графических окружениях одной и той же Windows. Система создаёт новую пользовательскую сессию при каждом входе через RDP. Это не ошибка, а архитектурное решение, обеспечивающее изоляцию.
Каждая сессия получает:
- собственное пространство процессов;
- отдельный экземпляр explorer.exe;
- свой набор переменных окружения;
- изолированный графический контекст.
Для администрирования серверов такое поведение удобно. Вы не мешаете другим пользователям. Для технической поддержки оно превращается в препятствие: вы не видите проблему, которую пытаетесь решить.
Существует способ подключиться к уже работающей сессии без создания новой. В корпоративной среде это называется shadowing. Microsoft использует термин remote control of user sessions. Механизм позволяет администратору видеть и управлять тем же графическим контекстом, который видит пользователь, в реальном времени.
Чем подключение к активной сессии отличается от обычного RDP
Обычное RDP-подключение инициирует создание новой WinStation — объекта ядра Windows, управляющего графической сессией. Система загружает профиль пользователя, запускает оболочку explorer.exe, создаёт новое окружение рабочего стола. Происходит это даже если пользователь уже работает на том же компьютере. Результат — изолированное пространство процессов: тот же пользователь, те же права доступа, но совершенно другой набор запущенных приложений.
При shadow-подключении mstsc.exe работает иначе. Вместо создания новой WinStation он подключается к существующей, используя Session ID — числовой идентификатор, присвоенный сессии при входе пользователя. Графический вывод не дублируется, а разделяется. Вы видите точно то же изображение, которое формируется для монитора пользователя, с той же частотой обновления и теми же артефактами, если они есть.
Это различие критично для сценариев поддержки. Если у пользователя зависло приложение, отображается ошибка специфичного диалога или пропало сетевое подключение — вы увидите это в shadow-режиме. В обычном RDP вы увидите только свежую сессию, где всё работает нормально, потому что проблема существует в другом графическом контексте.
Почему при обычном RDP создаётся новая сессия пользователя
Архитектура Windows Terminal Services строилась на принципе сессионной изоляции ещё с версии Windows NT 4.0 Terminal Server Edition. Каждый входящий пользователь получает изолированное окружение по соображениям безопасности и стабильности. Если один пользователь запустит ресурсоёмкое приложение или вызовет сбой графической подсистемы, это не повлияет на сессии других пользователей.
При удалённом подключении система не знает, хотите ли вы подключиться к существующей сессии или создать новую. Технически одна учётная запись может иметь несколько активных сессий одновременно — например, локальную консольную и удалённую RDP. Поэтому по умолчанию создаётся новая сессия, чтобы избежать конфликтов и непреднамеренного разрыва существующих соединений.
Как подключиться к уже активной сессии и увидеть экран пользователя
Для подключения к существующей сессии используется тот же исполняемый файл mstsc.exe, что и для обычного RDP, но с дополнительными параметрами командной строки. Ключевой параметр — /shadow, после которого указывается числовой идентификатор целевой сессии.
Примеры команд:
mstsc /shadow:3 /v:COMPUTERNAME /control
mstsc /v:COMPUTERNAME /shadow:3 /control
Параметр /control необходим, если вы планируете управлять сессией. Без него подключение работает только для просмотра. Параметр не принимает значений: запись вида /control:3 приведёт к ошибке.
Когда shadow-подключение лучше обычного RDP
Shadow-подключение не заменяет обычный RDP, а дополняет его. Оно незаменимо в нескольких сценариях:
- Удалённая поддержка пользователей с сохранением контекста.
- Обучение и демонстрация действий на экране пользователя.
- Диагностика спорадических ошибок, воспроизводимых только в конкретной сессии.
Как подключиться через mstsc /shadow
Получение Session ID через qwinsta или quser
Для просмотра активных сессий можно использовать:
qwinsta /server:remote-pc
quser /server:remote-pc
Session ID находится в колонке ID.
Примеры подключения
Только просмотр:
mstsc /v:192.168.1.100 /shadow:3
Полное управление:
mstsc /v:192.168.1.100 /shadow:3 /control
Без запроса согласия пользователя:
mstsc /v:192.168.1.100 /shadow:3 /control /noConsentPrompt
Завершение shadow-сессии
Ctrl + * (звёздочка на цифровой клавиатуре) — прерывает подключение, но не завершает сессию пользователя.
Требования и права для shadow-подключения
Для Windows 8.1 / Server 2012 R2 и выше достаточно членства в группе Remote Desktop Users + разрешение на удалённое управление сессиями через групповую политику.
Настройка политики
Политика: Set rules for remote control of Remote Desktop Services user sessions
Возможные значения:
- 0 — удалённое управление запрещено полностью
- 1 — полный контроль с разрешения пользователя
- 2 — полный контроль без разрешения пользователя
- 3 — просмотр с разрешения пользователя
- 4 — просмотр без разрешения пользователя
Через реестр:
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services" /v Shadow /t REG_DWORD /d 2 /f
Автоматизация через BAT и PowerShell
Пример BAT файла
@echo off
mstsc /v:%1 /shadow:3 /control /noConsentPrompt
Пример PowerShell скрипта
param(
[Parameter(Mandatory=$true)][string]$ComputerName,
[Parameter(Mandatory=$true)][string]$UserName,
[switch]$ViewOnly
)
# Получаем список активных сессий
$sessions = qwinsta /server:$ComputerName | ForEach-Object { ($_ -replace '\s+', ' ').Trim() } | Where-Object { $_ -match $UserName -and $_ -match 'Active' }
if ($sessions.Count -eq 0) {
Write-Host "Активная сессия для пользователя $UserName не найдена" -ForegroundColor Red
exit 1
}
$sessionId = ($sessions[0] -split ' ')[2]
$arguments = @("/v:$ComputerName","/shadow:$sessionId","/noConsentPrompt")
if (-not $ViewOnly) { $arguments += "/control" }
Start-Process mstsc -ArgumentList $arguments
Write-Host "Подключение к сессии $sessionId на $ComputerName..." -ForegroundColor Green
Мониторинг shadow-подключений
События фиксируются в Event Viewer:
Applications and Services Logs → Microsoft → Windows → TerminalServices-RemoteConnectionManager → Operational
ID 20503 — начало shadowing
ID 20504 — завершение shadowing
Текущее количество подключений:
qwinsta /counter
Важные заметки
Shadow-подключение экономит часы работы при поддержке пользователей, позволяет диагностировать проблемы в их естественной среде и обучать без отрыва от рабочего процесса. Но при отключённом запросе согласия пользователь никогда не узнает, что за его работой наблюдают. Корпоративные политики должны регламентировать использование таких технологий. Аудит подключений через Event Viewer обязателен. И еще раз: использование /noConsentPrompt без явного разрешения нарушает принципы информационной этики.
#технологии #IT #софт #администрирование #безопасность #Windows #удаленныйдоступ #системноеадминистрирование