fix(autostart): run from repo root + visible console at logon

autostart-run.bat did 'cd /d %~dp0' -> scripts/, but web-vnc.exe/webvnc.conf/
go.mod live in the repo root, so the binary was never found and web-vnc never
started after reboot. Now it cd's to %~dp0.. (repo root).

The task was ONSTART/RU SYSTEM (session 0) so it could not show a window, making
failures invisible. install-autostart.bat now registers ONLOGON /RL HIGHEST as the
current user -> a visible console opens at logon. autostart-run.bat sets a window
title, prints status, stays open while web-vnc serves, and pauses on fatal errors
(no binary / no webvnc.conf) so the reason is visible. Docs updated.
This commit is contained in:
Codex
2026-08-06 01:09:47 +03:00
parent f315618bfc
commit 02fefa1e4e
5 changed files with 98 additions and 43 deletions
+15 -8
View File
@@ -63,14 +63,14 @@ internal/server/static встроенные ассеты (vnc.html, favicon.
Все пользовательские точки входа лежат в корне репозитория:
set-password.bat настройка пароля: спрашивает пароль, генерирует хэш и пишет webvnc.conf (HASH= + VNC_PASSWORD=, gitignored) — ДО синхронизации UltraVNC, чтобы веб-пароль был настроен даже если синк упадёт или UAC отменят; затем синхронизирует VNC-пароль UltraVNC (scripts/ensure-vnc-password.ps1). Если установлено задание «web-vnc» — перезапускает его через restart-autostart.bat (с elevation), чтобы живый gateway перезалил пароль; рестарт пропускается, только если пароль не изменился (PBKDF2-хэш всегда новый из-за соли, поэтому изменение детектится сравнением введённого пароля со старым VNC_PASSWORD из webvnc.conf). Саму проверку «запущен ли web-vnc.exe» делает restart-autostart.bat (elevated, надёжно видит SYSTEM-процесс).
run.bat интерактивный запуск в один клик: собирает бинарник/noVNC/VNC, читает пароль из webvnc.conf (НЕ спрашивает — если файла нет, просит сначала запустить set-password.bat); если 5900 уже занят (сервис UltraVNC) — не порождает второй VNC-сервер, а подключается к существующему
install-autostart.bat регистрирует плановое задание «web-vnc» (schtasks /SC ONSTART /RU SYSTEM /RL HIGHEST), запускающее scripts/autostart-run.bat при загрузке ОС; запускать от админа (самопрос elevation); требует уже созданный webvnc.conf.
install-autostart.bat регистрирует плановое задание «web-vnc» (schtasks /SC ONLOGON /RL HIGHEST, от имени текущего пользователя) — открывает ВИДИМУЮ консоль с scripts/autostart-run.bat при входе пользователя в систему; запускать от админа (самопрос elevation); требует уже созданный webvnc.conf. (Вариант ONSTART/SYSTEM скрыт в session 0 и окна не показывает — поэтому не используется.)
uninstall-autostart.bat удаляет плановое задание «web-vnc» (от админа).
restart-autostart.bat перезапускает задание «web-vnc» (от админа, auto-elevate): проверяет tasklist, запущен ли web-vnc.exe — если да, делает schtasks /End + пауза 2 c + schtasks /Run; если нет — только schtasks /Run. Вызывается из set-password.bat, или вручную.
open-firewall.bat открыть порт 8080 в Windows Firewall (от админа, один раз).
webvnc.conf создаётся set-password.bat; содержит HASH=<pbkdf2-хэш> и VNC_PASSWORD=<тот же пароль для noVNC>; читается run.bat и scripts/autostart-run.bat; в git не коммитится (.gitignore).
Внутренние помощники (вызываются другими скриптами, не пользователем) — в scripts/:
scripts/autostart-run.bat НЕинтерактивный launcher для автостарта (нет пауз/запросов): читает webvnc.conf, ПОЛЛИТ 127.0.0.1:5900 до ~30 c (UltraVNC-сервис может ещё подниматься при загрузке) и только потом запускает web-vnc.exe — без --spawn если 5900 уже слушает, иначе спавнит локальный VNC-сервер (portable vnc\\winvnc.exe/tvnserver.exe или авто-детект). Ничего не качает на старте. Вызывается плановым заданием из install-autostart.bat.
scripts/autostart-run.bat launcher для автостарта: лежит в scripts/, но работает относительно КОРНЯ репо (cd /d %~dp0.. — web-vnc.exe/webvnc.conf/vnc/go.mod там). Читает webvnc.conf, ПОЛЛИТ 127.0.0.1:5900 до ~30 c (UltraVNC-сервис может ещё подниматься) и только потом запускает web-vnc.exe — без --spawn если 5900 уже слушает, иначе спавнит локальный VNC-сервер (portable vnc\\winvnc.exe/tvnserver.exe или авто-детект). Ничего не качает на старте. Запускается ВИДИМОЙ консолью (задание из install-autostart.bat): окно остаётся, пока web-vnc serves; при фатальной ошибке/no binary/no conf — pause, чтобы окно не закрылось и было видно причину. Вызывается также restart-autostart.bat.
scripts/ensure-vnc-password.ps1 синхронизирует VNC-пароль UltraVNC с введённым (пишет только при несовпадении; UAC только при смене) — вызывается из set-password.bat.
scripts/get-novnc.{ps1,sh} скачать noVNC
scripts/get-vnc.ps1 скачать портативный UltraVNC в vnc/ (с верификацией zip)
@@ -135,8 +135,11 @@ scripts/list-ips.ps1 список IPv4 машины (использует
даже если синк упадёт или UAC отменят. Файл `webvnc.conf`**секрет**, в git не
коммитится (см. `.gitignore`).
2. **Один раз (от админа)** запустить `install-autostart.bat` — регистрирует
плановое задание `web-vnc` через `schtasks /Create /SC ONSTART /RU SYSTEM /RL HIGHEST`,
которое при загрузке ОС запускает `scripts/autostart-run.bat`.
плановое задание `web-vnc` через `schtasks /Create /SC ONLOGON /RL HIGHEST` (от имени
текущего пользователя, без `/RU SYSTEM`), которое при **входе пользователя в систему**
открывает **видимую консоль** с `scripts/autostart-run.bat`. Запуск от SYSTEM/ONSTART
намеренно не используется: он выполняется в session 0 и НЕ показывает окно на рабочем
столе, поэтому увидеть ошибки запуска было бы невозможно.
3. `scripts/autostart-run.bat`**неинтерактивный** launcher: читает `webvnc.conf`,
при необходимости собирает `web-vnc.exe` (если есть Go), затем **опрашивает
`127.0.0.1:5900` до ~30 c** (один PowerShell-проект крутит цикл try/TcpClient +
@@ -150,10 +153,14 @@ scripts/list-ips.ps1 список IPv4 машины (использует
4. Снять автостарт: `uninstall-autostart.bat` (от админа) — `schtasks /Delete`.
Замечания:
- Задание выполняется от `SYSTEM`, поэтому VNC-сервер, отдавающий рабочий стол, должен
быть отдельным сервисом (UltraVNC `uvnc_service`) — `autostart-run.bat` его НЕ порождает,
а лишь подключается к `127.0.0.1:5900`. Портативный `vnc\winvnc.exe` используется только
если 5900 ещё не слушает.
- Задание выполняется от имени **текущего пользователя** при его входе (видимая консоль),
а не от SYSTEM в session 0. Поэтому web-vnc может сам спавнить VNC-сервер в сеансе
пользователя (что удобнее для захвата рабочего стола, чем SYSTEM). Если уже работает
сервис UltraVNC (`uvnc_service`) и слушает 5900 — `autostart-run.bat` подключается к нему
без `--spawn`. Портативный `vnc\winvnc.exe` спавнится только если 5900 не слушает.
- Автостарт срабатывает при **входе пользователя**, а не до входа. Если нужен запуск до
логина (без окна) — это отдельный скрытый вариант ONSTART/SYSTEM; текущий по умолчанию
ориентирован на «видимую консоль после ребута/логина».
- **Смена пароля на ходу:** `web-vnc.exe` читает хэш и `WEBVNC_VNC_PASSWORD` **один раз
при старте** (`config.Parse`/`auth.New`) и никогда не перечитывает `webvnc.conf`. Поэтому
`set-password.bat` после перезаписи `webvnc.conf` сам перезапускает задание «web-vnc» через
+8 -5
View File
@@ -53,9 +53,12 @@ gateway без запросов.
set-password.bat :: один раз: пароль -> webvnc.conf
install-autostart.bat :: один раз (от админа): плановое задание «web-vnc»
```
`install-autostart.bat` регистрирует через `schtasks` задание (`ONSTART`, `SYSTEM`,
`HIGHEST`), которое при загрузке запускает `scripts\autostart-run.bat` —
неинтерактивный launcher, читающий `webvnc.conf` и не качающий ничего на старте.
`install-autostart.bat` регистрирует через `schtasks` задание (`ONLOGON`, `HIGHEST`,
от имени текущего пользователя), которое **при входе в систему открывает видимую
консоль** с `scripts\autostart-run.bat` — launcher, читающий `webvnc.conf`, ждущий
`127.0.0.1:5900` до ~30 c и затем запускающий `web-vnc.exe` (не качает ничего на старте).
Окно остаётся, пока web-vnc работает; при ошибке — пауза, чтобы было видно причину.
Запуск от `SYSTEM`/`ONSTART` не используется: он в session 0 и окна не показывает.
Запустить сразу без перезагрузки: `schtasks /Run /TN "web-vnc"`.
Снять автостарт: `uninstall-autostart.bat` (от админа).
@@ -211,14 +214,14 @@ internal/server/static встроенные веб-ассеты (vnc.html +
Пользовательские точки входа — в корне репозитория:
run.bat интерактивный запуск: собирает бинарник/noVNC/VNC, читает пароль из webvnc.conf (не спрашивает)
set-password.bat разовая настройка пароля -> webvnc.conf (хэш + VNC-пароль); синхронизирует UltraVNC
install-autostart.bat автостарт при загрузке ОС (schtasks ONSTART/SYSTEM) — от админа
install-autostart.bat автостарт при входе (schtasks ONLOGON/HIGHEST, видимая консоль) — от админа
uninstall-autostart.bat снять автостарт — от админа
restart-autostart.bat перезапустить задание «web-vnc» (чтобы применить новый пароль) — от админа
open-firewall.bat открыть порт 8080 в Windows Firewall (один раз, от админа)
webvnc.conf секрет: HASH= + VNC_PASSWORD= (создаётся set-password.bat, gitignored)
Внутренние помощники — в scripts/ (вызываются другими скриптами):
scripts/autostart-run.bat неинтерактивный launcher для автостарта: читает webvnc.conf, ждёт 5900 до ~30 c, затем запускает web-vnc (без --spawn, если VNC уже слушает)
scripts/autostart-run.bat launcher автостарта (видимая консоль): cd в корень репо, читает webvnc.conf, ждёт 5900 до ~30 c, запускает web-vnc (без --spawn, если VNC уже слушает); pause на ошибке
scripts/ensure-vnc-password.ps1 синхронизирует VNC-пароль UltraVNC (вызывается из set-password.bat)
scripts/get-novnc.{ps1,sh} скачать noVNC во встроенную статику
scripts/get-vnc.ps1 скачать портативный VNC-сервер (UltraVNC) в папку vnc/
+18 -7
View File
@@ -1,9 +1,19 @@
@echo off
REM ============================================================
REM install-autostart.bat - register web-vnc as a startup task.
REM Creates a scheduled task "web-vnc" that runs at system startup
REM (as SYSTEM, highest privileges) and launches
REM scripts\autostart-run.bat in the foreground.
REM Creates a scheduled task "web-vnc" that runs at YOUR logon
REM (as the current user, with highest privileges available to
REM you) and opens a VISIBLE console window running
REM scripts\autostart-run.bat. The console stays open while
REM web-vnc serves, and pauses on error so you can see why it
REM did not start.
REM
REM Why logon (not boot/SYSTEM): a task that runs as SYSTEM at
REM boot runs in session 0 and CANNOT show a window on your
REM desktop, so you would never see its output. Running at your
REM logon, in your session, makes the console visible. (If you
REM need it before any user logs in, that requires the hidden
REM SYSTEM/boot variant - which is invisible by design.)
REM Requires administrator rights (auto-elevates).
REM Run set-password.bat first to configure the password.
REM ============================================================
@@ -31,8 +41,8 @@ if not exist "scripts\autostart-run.bat" (
set "TASK=web-vnc"
set "CMD=%~dp0scripts\autostart-run.bat"
echo Creating scheduled task "%TASK%" (startup, SYSTEM, highest) ...
schtasks /Create /TN "%TASK%" /TR "cmd /c \"%CMD%\"" /SC ONSTART /RU SYSTEM /RL HIGHEST /F
echo Creating scheduled task "%TASK%" (at logon, current user, highest, visible) ...
schtasks /Create /TN "%TASK%" /TR "cmd /c \"%CMD%\"" /SC ONLOGON /RL HIGHEST /F
if errorlevel 1 (
echo [error] Could not create the task.
pause
@@ -40,8 +50,9 @@ if errorlevel 1 (
)
echo.
echo Done. web-vnc will start automatically on every boot.
echo Start it now (without rebooting):
echo Done. web-vnc will start automatically when you log in: a console
echo window will open and stay while it serves. Close that window to stop it.
echo Start it now (without re-logging-in):
echo schtasks /Run /TN "%TASK%"
echo Remove it with: uninstall-autostart.bat
echo.
+1 -1
View File
@@ -9,7 +9,7 @@ REM
REM It first checks whether web-vnc.exe is actually running:
REM - running -> stop the task (schtasks /End) and start it again;
REM - not running -> just start it (no /End).
REM Requires administrator rights (the task runs as SYSTEM), so it
REM Requires administrator rights (the task was created elevated), so it
REM auto-elevates. Called from set-password.bat, or run manually.
REM ============================================================
cd /d "%~dp0"
+55 -21
View File
@@ -1,42 +1,55 @@
@echo off
REM ============================================================
REM autostart-run.bat - non-interactive launcher used by the
REM scheduled task created by install-autostart.bat.
REM Reads the password from webvnc.conf, WAITS for the VNC server
REM on 127.0.0.1:5900 (the UltraVNC service may still be starting
REM at boot), and only then starts web-vnc.exe in the foreground.
REM If no VNC server comes up, it spawns a local one (portable
REM vnc\winvnc.exe / tvnserver.exe, or auto-detected) so web-vnc
REM does not serve before the VNC server is ready.
REM autostart-run.bat - launcher used by the scheduled task
REM created by install-autostart.bat. Runs in a VISIBLE console
REM window (install-autostart.bat registers it at logon, as the
REM current user, so the window is visible - unlike a hidden
REM SYSTEM/boot task). It reads the password from webvnc.conf,
REM WAITS for the VNC server on 127.0.0.1:5900 (the UltraVNC
REM service may still be starting), and only then starts
REM web-vnc.exe in the foreground. If no VNC server comes up,
REM it spawns a local one. On any fatal error it pauses so the
REM window stays open and you can read why it did not start.
REM
REM This script lives in scripts/ but operates relative to the
REM REPO ROOT (web-vnc.exe, webvnc.conf, vnc\, ./cmd/web-vnc are
REM there), so it cd's to %~dp0.. first.
REM Exit codes: 0 = server ran and stopped; 1 = no binary;
REM 2 = password not configured; other = web-vnc error.
REM ============================================================
cd /d "%~dp0"
title web-vnc autostart
cd /d "%~dp0.."
echo.
echo === web-vnc autostart ===
echo Working dir: %CD%
echo.
REM --- 1. Binary (build if Go is available, else fail) ---
if not exist "web-vnc.exe" (
if exist "web-vnc.exe" goto havebin
where go >nul 2>nul
if not errorlevel 1 (
go build -o web-vnc.exe .\cmd\web-vnc >nul 2>nul
)
)
if not exist "web-vnc.exe" exit /b 1
if errorlevel 1 goto nobinary
echo Building web-vnc.exe ...
go build -o web-vnc.exe .\cmd\web-vnc
if errorlevel 1 goto nobinary
:havebin
if not exist "web-vnc.exe" goto nobinary
REM --- 2. Stored password ---
if not exist "webvnc.conf" exit /b 2
if not exist "webvnc.conf" goto noconf
set "HASH="
set "VNC_PW="
for /f "tokens=1,* delims==" %%a in (webvnc.conf) do (
if /i "%%a"=="HASH" set "HASH=%%b"
if /i "%%a"=="VNC_PASSWORD" set "VNC_PW=%%b"
)
if "%HASH%"=="" exit /b 2
if "%VNC_PW%"=="" exit /b 2
if "%HASH%"=="" goto noconf
if "%VNC_PW%"=="" goto noconf
set "WEBVNC_VNC_PASSWORD=%VNC_PW%"
set "VNC_PW="
REM --- 3. Wait for the VNC server on 127.0.0.1:5900 ---
REM At boot the UltraVNC service (uvnc_service) may still be starting.
REM At boot/logon the UltraVNC service may still be starting.
REM Poll up to ~30 s (one PowerShell process loops internally) so we do
REM NOT spawn a 2nd server and do NOT serve before the VNC server is
REM ready. Exits 0 as soon as 5900 accepts a connection, 1 on timeout.
@@ -66,6 +79,27 @@ set "SPAWNARGS="
set "SPAWNFLAG="
:launch
REM --- 4. Launch (foreground; the task host keeps it alive) ---
REM --- 4. Launch (foreground; the console window stays open while it serves) ---
echo.
echo Starting web-vnc on http://localhost:8080
echo Close this window to stop it.
echo.
web-vnc.exe --password-hash "%HASH%" %SPAWNARGS% %SPAWNFLAG% --listen :8080
exit /b %errorlevel%
echo.
echo Server stopped (exit code %errorlevel%).
pause
exit /b
:nobinary
echo.
echo [error] web-vnc.exe not found and could not be built.
echo Build it once with: go build -o web-vnc.exe .\cmd\web-vnc
echo or run run.bat interactively.
pause
exit /b 1
:noconf
echo.
echo [error] webvnc.conf not found. Run set-password.bat first to set the password.
pause
exit /b 2