# Отчёт: периодические разрывы RDP-сессии на VM100

| Параметр | Значение |
|---|---|
| Объект | VM100, Windows 7 Профессиональная, **32-разрядная** |
| Платформа | Proxmox VE |
| Дата отчёта | 15.09.2026 |
| Статус | Расследование: причина локализована до уровня гипотезы, требуется подтверждающий эксперимент |

## 1. Описание проблемы

При работе пользователя с VM100 по RDP сессия периодически (интервал 3–5 минут) разрывается. В это же время в консоли Proxmox на экране входа Windows 7 отображается сообщение:

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

Кнопка «OK» под сообщением означает, что это ответ системы на **попытку входа, выполняемую на консоли**, а не сообщение RDP-клиента.

## 2. Исходные данные и ранее выполненные действия

### 2.1. Первичная диагностика

| № | Наблюдение | Первичная трактовка |
|---|---|---|
| 1 | В `HKLM\Software\Microsoft\Windows\CurrentVersion\RunOnce` есть значение `zzInitDisk50` → `wscript.exe C:\initdisk.vbs` | Скрипт при входе активирует консоль и отбирает сеанс у RDP |
| 2 | Время изменения `IO.SYS` / `MSDOS.SYS` в корне `C:` совпадает с моментами разрывов (13:04:39 → 13:05) | Признак активности NTVDM (DOS-подсистемы) |
| 3 | Интервал между разрывами 3–5 минут | Соответствует циклу автологона / RunOnce |

### 2.2. Выполненные действия

| Действие | Результат |
|---|---|
| Пустой скрипт (`/root/empty.vbs`, 129 байт) загружен как `C:\Users\user\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\initdisk.vbs` | Разрывы продолжаются |
| VM101: снимок `Vetraz-test-01` удалён из конфигурации, VM остановлена | Не связано с VM100 напрямую |
| На хосте запущен `/root/watch100.sh`, пишущий OCR-текст консоли в `/root/console100-watch.log` | Используется для фиксации времени циклов |
| Попытка офлайн-замены куста `SOFTWARE` через SMB | Не выполнена: sharing violation (куст занят системой) |

## 3. Анализ

### 3.1. Ошибка в проверке гипотезы

RunOnce запускает `C:\initdisk.vbs`, а пустой скрипт был помещён в папку автозагрузки пользователя. **Это разные файлы.** Реально запускаемый скрипт не изменялся, поэтому продолжение разрывов не опровергает и не подтверждает связь с `initdisk.vbs`.

### 3.2. Уточнение технических выводов

| Утверждение | Заключение |
|---|---|
| RunOnce срабатывает каждые 3–5 минут | Штатно RunOnce выполняется однократно при входе, значение удаляется. Многократное срабатывание возможно только при повторяющихся входах и пересоздании записи |
| NTVDM «отбирает консоль» | NTVDM исполняет 16-битный код внутри существующего сеанса и не переключает сеансы. На 32-разрядной Windows 7 NTVDM присутствует, поэтому его активность реальна, но это **следствие входа, а не причина разрыва** |
| Изменение IO.SYS / MSDOS.SYS | Подтверждает запуск DOS-кода в моменты разрывов, то есть совпадение разрывов со входами в систему |
| Сообщение «службы заняты» | Возникает при попытке входа, когда единственный интерактивный сеанс Windows 7 занят. Альтернативная причина — сбой службы профилей `ProfSvc` (известная проблема Windows 7 SP1 / Server 2008 R2) |

### 3.3. Ключевой факт из консоли Proxmox

Сообщение появляется на **консольном** экране входа во время работы пользователя по RDP. Windows 7 допускает один интерактивный сеанс. Следовательно, пока сеанс занят RDP, на консоли кто-то (или что-то) пытается выполнить вход. Самостоятельно консоль вход не инициирует; это делает:

- механизм **AutoAdminLogon** (Winlogon), либо
- внешний ввод в консоль — ручной или автоматизированный (например, отправка клавиш со стороны хоста).

### 3.4. Рабочая гипотеза: цикл «RDP ↔ автологон»

| Шаг | Событие |
|---|---|
| 1 | Пользователь подключается по RDP; консоль VM100 переходит на экран входа |
| 2 | Winlogon на консоли обнаруживает включённый автологон и пытается войти |
| 3 | Сеанс занят RDP — на консоли выводится сообщение «службы заняты» |
| 4 | Окно закрывается (таймаут или нажатие клавиши), Winlogon повторяет попытку |
| 5 | Одна из попыток проходит: сеанс переходит на консоль, RDP-сессия разрывается |
| 6 | Консольный вход запускает RunOnce → `C:\initdisk.vbs` → NTVDM (меняются IO.SYS / MSDOS.SYS) |
| 7 | Скрипт, предположительно, заново записывает `zzInitDisk50` — при следующем входе цикл повторяется |

Гипотеза объясняет все наблюдения: сообщение на консоли, интервал 3–5 минут, активность NTVDM в моменты разрывов, многократное срабатывание RunOnce. **Не подтверждена** до проверки параметров Winlogon и содержимого `C:\initdisk.vbs`.

### 3.5. Перечень подозреваемых по приоритету

| Приоритет | Причина | Как подтвердить |
|---|---|---|
| 1 | AutoAdminLogon на консоли | `AutoAdminLogon = 1`, `DefaultUserName` = пользователь RDP; 4624 с LogonType 2 в моменты разрывов |
| 2 | Ввод в консоль со стороны хоста (`watch100.sh` или ручные действия) | Содержимое `watch100.sh`: наличие `sendkey` / `qm sendkey` / monitor-команд ввода |
| 3 | Самовосстановление `zzInitDisk50` | `RegWrite` с `RunOnce` в `C:\initdisk.vbs`; появление записи после удаления |
| 4 | Задание планировщика с `tscon` / `logoff` / `shutdown` | `schtasks /query /fo LIST /v` |
| 5 | Цикл перезагрузок | `LastBootUpTime`; события 41, 1001, 6008, 1074 |
| 6 | Сбой `ProfSvc` | События Application 1500 / 1502 / 1530 |

## 4. Рекомендации

### 4.1. Проверка (только чтение), внутри VM100

```cmd
mkdir C:\VM100-Diag
wmic os get OSArchitecture,LastBootUpTime
reg query "HKLM\Software\Microsoft\Windows NT\CurrentVersion\Winlogon" /v AutoAdminLogon
reg query "HKLM\Software\Microsoft\Windows NT\CurrentVersion\Winlogon" /v ForceAutoLogon
reg query "HKLM\Software\Microsoft\Windows NT\CurrentVersion\Winlogon" /v DefaultUserName
reg query "HKLM\Software\Microsoft\Windows NT\CurrentVersion\Winlogon" /v AutoLogonCount
reg query "HKLM\Software\Microsoft\Windows\CurrentVersion\RunOnce"
type C:\initdisk.vbs
findstr /i "RegWrite RunOnce tscon logoff shutdown" C:\initdisk.vbs
schtasks /query /fo LIST /v > C:\VM100-Diag\tasks.txt
wevtutil epl "Microsoft-Windows-TerminalServices-LocalSessionManager/Operational" C:\VM100-Diag\LSM.evtx
wevtutil epl Security C:\VM100-Diag\Security.evtx
wevtutil epl System C:\VM100-Diag\System.evtx
wevtutil epl Application C:\VM100-Diag\Application.evtx
```

На хосте:

```bash
cat /root/watch100.sh
```

### 4.2. Подтверждающий эксперимент

Выполняется, если `AutoAdminLogon = 1`. Перед экспериментом убедиться, что `watch100.sh` не отправляет ввод в консоль (или остановить его), и не нажимать ничего в консоли Proxmox.

```cmd
reg export "HKLM\Software\Microsoft\Windows NT\CurrentVersion\Winlogon" C:\VM100-Diag\Winlogon-before.reg
reg add "HKLM\Software\Microsoft\Windows NT\CurrentVersion\Winlogon" /v AutoAdminLogon /t REG_SZ /d 0 /f
```

Затем подключиться по RDP и наблюдать 30–60 минут.

| Результат | Вывод |
|---|---|
| Разрывы и сообщение на консоли прекратились | Причина — автологон. Решить, нужен ли он (п. 4.4) |
| Разрывы продолжаются | Откатить изменение (`reg import C:\VM100-Diag\Winlogon-before.reg`), перейти к п. 4.3 |

### 4.3. Следующие шаги, если гипотеза не подтвердится

Строго по одному, с наблюдением после каждого:

1. Удалить `zzInitDisk50` с предварительным экспортом ветки RunOnce и копией `C:\initdisk.vbs`; проверить, не появляется ли запись снова.
2. Отключить найденное задание планировщика (с экспортом в XML).
3. Разобрать журналы по времени одного разрыва: 4624 (LogonType), 4634 / 4647, LSM 21 / 23 / 24 / 25 / 39 / 40, System 41 / 1001 / 6008 / 1074, Application 1500 / 1502 / 1530.

Если доступа внутрь гостя нет: резервная копия → штатное выключение VM100 → офлайн-работа с диском через `virt-win-reg` / `guestmount --ro`. Замену активного куста `SOFTWARE` через SMB не выполнять.

### 4.4. Если автологон необходим для работы приложения

В Windows 7 один интерактивный сеанс не может одновременно принадлежать консоли и RDP — конфликт архитектурный. Допустимые варианты:

| Вариант | Комментарий |
|---|---|
| Отключать автологон на время работы по RDP | Простое решение при эпизодическом удалённом доступе |
| Работать с VM100 только через консоль Proxmox | Сохраняет автологон, исключает конфликт |
| Перенести приложение на серверную ОС | Долгосрочное решение, если нужны одновременно консольный и удалённый сеансы |

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

## 5. Выводы

1. Разрыв RDP-сессии вызывается перехватом единственного интерактивного сеанса Windows 7 консольным входом; на это прямо указывает сообщение на консольном экране входа.
2. Наиболее вероятный инициатор консольного входа — AutoAdminLogon; альтернативный — ввод в консоль со стороны хоста.
3. `initdisk.vbs` и активность NTVDM — сопутствующие эффекты каждого консольного входа, а не первопричина.
4. Ранее выполненная замена скрипта была сделана не по тому пути и результатов не дала.
5. Для подтверждения необходимы: значения Winlogon, содержимое `C:\initdisk.vbs` и `/root/watch100.sh`, результат эксперимента с отключением автологона.

## 6. Необходимые материалы

| № | Материал | Назначение |
|---|---|---|
| 1 | Вывод `reg query ... Winlogon` | Подтверждение автологона |
| 2 | Содержимое `C:\initdisk.vbs` | Поиск пересоздания `zzInitDisk50` и управляющих команд |
| 3 | Содержимое `/root/watch100.sh` | Исключение ввода в консоль со стороны хоста |
| 4 | Вывод `wmic os get OSArchitecture,LastBootUpTime` | Разделение цикла входов и цикла перезагрузок |
| 5 | Точное время одного разрыва и выгруженные журналы | Сопоставление событий |
| 6 | Результат эксперимента из п. 4.2 | Окончательное подтверждение причины |
