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:
@@ -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» через
|
||||
|
||||
@@ -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
@@ -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.
|
||||
|
||||
@@ -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
@@ -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
|
||||
Reference in New Issue
Block a user