feat: autostart as a service + separate password setup (set-password.bat)

- set-password.bat: one-time password setup -> writes webvnc.conf (HASH + VNC_PASSWORD), syncs UltraVNC via ensure-vnc-password.ps1; if the 'web-vnc' task is installed, restarts it (elevated) to reload the new password, skipping restart when the password is unchanged.
- run.bat: no longer prompts for the password; reads it from webvnc.conf (asks to run set-password.bat first if absent). Also clears --spawn-command (not just --spawn) when 5900 is already listening, to avoid spawning a 2nd VNC server.
- scripts/autostart-run.bat: non-interactive launcher for the scheduled task (reads webvnc.conf, finds only a LOCAL VNC server, never downloads at boot).
- scripts/install-autostart.bat / uninstall-autostart.bat: register/remove a 'web-vnc' scheduled task (ONSTART, SYSTEM, HIGHEST) via schtasks.
- scripts/restart-autostart.bat: restart the task to apply a new password; checks whether web-vnc.exe is running (stop+start, or just start).
- .gitignore: ignore webvnc.conf (secret).
- AGENTS.md / README.md: document the autostart flow, set-password.bat, the new scripts, and that the running gateway must be restarted to apply a password change.
This commit is contained in:
Codex
2026-08-05 15:23:58 +03:00
parent 0779b4327c
commit 754f77a8d0
9 changed files with 427 additions and 62 deletions
+4 -1
View File
@@ -31,4 +31,7 @@ internal/server/static/utils/
internal/server/static/novnc-original.html
# Downloaded VNC server (installed via scripts/get-vnc.ps1)
/vnc/
/vnc/
# Stored web access password + hash (created by set-password.bat)
webvnc.conf
+57 -14
View File
@@ -63,22 +63,30 @@ scripts/get-novnc.{ps1,sh} скачать noVNC
scripts/get-vnc.ps1 скачать портативный UltraVNC в vnc/ (с верификацией zip)
scripts/list-ips.ps1 список IPv4 машины (используется run.bat)
scripts/open-firewall.bat открыть порт 8080 в Windows Firewall (от админа)
scripts/ensure-vnc-password.ps1 синхронизирует VNC-пароль UltraVNC с паролем из run.bat (пишет только при несовпадении; UAC только при смене) — вызывается из run.bat
run.bat запуск в один клик (спрашивает только пароль); синхронизирует VNC-пароль UltraVNC с введённым (см. ensure-vnc-password.ps1); если 5900 уже занят (сервис UltraVNC) — не порождает второй VNC-сервер, а подключается к существующему
scripts/ensure-vnc-password.ps1 синхронизирует VNC-пароль UltraVNC с введённым (пишет только при несовпадении; UAC только при смене) — вызывается из set-password.bat
set-password.bat настройка пароля: спрашивает пароль, синхронизирует VNC-пароль UltraVNC (ensure-vnc-password.ps1), генерирует хэш и пишет webvnc.conf (HASH= + VNC_PASSWORD=, gitignored). Если установлено задание «web-vnc» — перезапускает его через scripts/restart-autostart.bat (с elevation), чтобы живый gateway перезалил пароль; рестарт пропускается, только если пароль не изменился (PBKDF2-хэш всегда новый из-за соли, поэтому изменение детектится сравнением введённого пароля со старым VNC_PASSWORD из webvnc.conf). Саму проверку «запущен ли web-vnc.exe» делает restart-autostart.bat (elevated, надёжно видит SYSTEM-процесс).
webvnc.conf создаётся set-password.bat; содержит HASH=<pbkdf2-хэш> и VNC_PASSWORD=<тот же пароль для noVNC>; читается run.bat и scripts/autostart-run.bat; в git не коммитится (.gitignore).
run.bat интерактивный запуск в один клик: собирает бинарник/noVNC/VNC, читает пароль из webvnc.conf (НЕ спрашивает — если файла нет, просит сначала запустить set-password.bat); если 5900 уже занят (сервис UltraVNC) — не порождает второй VNC-сервер, а подключается к существующему
scripts/autostart-run.bat НЕинтерактивный launcher для автостарта (нет пауз/запросов): читает webvnc.conf, ищет только ЛОКАЛЬНЫЙ VNC-сервер (ничего не качает), запускает web-vnc.exe в foreground. Вызывается плановым заданием из install-autostart.bat.
scripts/install-autostart.bat регистрирует плановое задание «web-vnc» (schtasks /SC ONSTART /RU SYSTEM /RL HIGHEST), запускающее scripts/autostart-run.bat при загрузке ОС; запускать от админа (самопрос elevation); требует уже созданный webvnc.conf.
scripts/uninstall-autostart.bat удаляет плановое задание «web-vnc» (от админа).
scripts/restart-autostart.bat перезапускает задание «web-vnc» (от админа, auto-elevate): проверяет tasklist, запущен ли web-vnc.exe — если да, делает schtasks /End + пауза 2 c + schtasks /Run; если нет — только schtasks /Run. Вызывается из set-password.bat, или вручную.
```
## Соглашения и подводные камни
- **Кодировка файлов `.bat`:** **UTF-8 с BOM**, окончания строк **CRLF**, и `chcp 65001 >nul`
после `@echo off`. Именно **BOM** заставляет `cmd` читать .bat как UTF-8 независимо
от OEM-кодировки консоли (без BOM + `chcp 65001` в `cmd` даёт `????` — cmd читает
файл по OEM-кодировке, а не по `chcp`). BOM + `chcp 65001` проверено: кириллица в
`echo`/`set /p`/`for /f` отображается корректно, `@echo off` работает. Альтернатива
без BOM — включить системную опцию «Beta: Use Unicode UTF-8 for worldwide language
support» (тогда OEM-кодировка = 65001), но это влияет на всю систему (нужен reboot,
могут ломаться legacy-приложения под cp866/cp1251) — поэтому по умолчанию BOM.
Пиши через `[System.IO.File]::WriteAllText(path, content -replace "(?<!\r)\n","`r`n", [Text.UTF8Encoding]::new($true))`.
- **Go-файлы:** UTF-8 **без BOM**, LF. То же самое правило — не использовать
- **Кодировка файлов `.bat`:** текст всех `.bat`**English ASCII**, окончания строк **CRLF**,
**без BOM** и без `chcp` — ASCII читается `cmd` одинаково при любой OEM-кодировке, так
что кириллица в `echo`/`set /p`/`for /f` больше не нужна. Это намеренный отход от
кириллицы в bat-файлах (см. коммит «Translate run.bat and open-firewall.bat to English
ASCII»). Исторически кириллица в `.bat` требовала **UTF-8 с BOM** + `chcp 65001 >nul`
после `@echo off` (BOM заставлял `cmd` читать файл как UTF-8; без BOM + `chcp 65001` в
`cmd` давал `????`, т.к. cmd читает файл по OEM-кодировке, а не по `chcp`). Альтернатива
без BOM — системная опция «Beta: Use Unicode UTF-8 for worldwide language support»
(OEM=65001), но она влияет на всю систему (reboot, могут ломаться legacy-приложения
под cp866/cp1251). Если когда-нибудь вернёшь кириллицу в `.bat` — пиши через
`[System.IO.File]::WriteAllText(path, content -replace "(?<!\r)\n","`r`n", [Text.UTF8Encoding]::new($true))`
(с BOM). Для **English ASCII** — то же, но `[Text.UTF8Encoding]::new($false)` (без BOM).- **Go-файлы:** UTF-8 **без BOM**, LF. То же самое правило — не использовать
`Set-Content -Encoding UTF8` (ставит BOM). Используй
`[System.IO.File]::WriteAllText(path, content, [Text.UTF8Encoding]::new($false))`.
- **`.gitignore`:** бинарники игнорируются **root-anchored** (`/web-vnc`,
@@ -112,6 +120,41 @@ run.bat запуск в один клик (спрашивае
- **Hijack WebSocket:** `internal/relay` сам делает апгрейд через
`http.Hijacker`; гейтвей НЕ использует gorilla/websocket.
## Автостарт (запуск при загрузке ОС)
Чтобы gateway поднимался сам при включении машины (а не интерактивно через `run.bat`),
пароль должен быть настроен заранее и не запрашиваться при старте. Поэтому процедура:
1. **Один раз** запустить `set-password.bat` — он спрашивает пароль, синхронизирует
VNC-пароль UltraVNC (`scripts/ensure-vnc-password.ps1`), генерирует хэш и пишет
`webvnc.conf` (HASH + VNC_PASSWORD). Файл `webvnc.conf`**секрет**, в git не
коммитится (см. `.gitignore`).
2. **Один раз (от админа)** запустить `scripts/install-autostart.bat` — регистрирует
плановое задание `web-vnc` через `schtasks /Create /SC ONSTART /RU SYSTEM /RL HIGHEST`,
которое при загрузке ОС запускает `scripts/autostart-run.bat`.
3. `scripts/autostart-run.bat`**неинтерактивный** launcher: читает `webvnc.conf`,
при необходимости собирает `web-vnc.exe` (если есть Go), ищет только **локальный**
VNC-сервер (ничего не качает — на старте сети/интернета может не быть), и запускает
`web-vnc.exe --password-hash <HASH> --listen :8080` в foreground (задание держит
процесс живым). Если `127.0.0.1:5900` уже слушает (сервис UltraVNC) — запускает
**без** `--spawn` и **без** `--spawn-command`, подключаясь к существующему серверу
(иначе попытка породить второй VNC-сервер конфликтовала бы с сервисом).
4. Снять автостарт: `scripts/uninstall-autostart.bat` (от админа) — `schtasks /Delete`.
Замечания:
- Задание выполняется от `SYSTEM`, поэтому VNC-сервер, отдавающий рабочий стол, должен
быть отдельным сервисом (UltraVNC `uvnc_service`) — `autostart-run.bat` его НЕ порождает,
а лишь подключается к `127.0.0.1:5900`. Портативный `vnc\winvnc.exe` используется только
если 5900 ещё не слушает.
- **Смена пароля на ходу:** `web-vnc.exe` читает хэш и `WEBVNC_VNC_PASSWORD` **один раз
при старте** (`config.Parse`/`auth.New`) и никогда не перечитывает `webvnc.conf`. Поэтому
`set-password.bat` после перезаписи `webvnc.conf` сам перезапускает задание «web-vnc» через
`scripts\restart-autostart.bat` (elevation): тот проверяет `tasklist`, запущен ли
`web-vnc.exe`, и делает `schtasks /End` + `/Run` (или только `/Run`, если процесс не
запущен). Рестарт пропускается, если пароль не изменился (детект по старому `VNC_PASSWORD`
из `webvnc.conf`, т.к. PBKDF2-хэш всегда новый из-за соли). Если задание не установлено —
`set-password.bat` только пишет `webvnc.conf` и подсказывает `install-autostart.bat`. Для
интерактивного `run.bat` нового пароля — просто перезапусти его вручную.
## Что делать дальше (известные TODO)
- Надёжный авто-скачиватель VNC-сервера (URL UltraVNC на SourceForge нестабилен —
@@ -122,6 +165,6 @@ run.bat запуск в один клик (спрашивае
**UltraVNC как сервис (`uvnc_service`, LocalSystem):** пароль хранится в
`%ProgramData%\UltraVNC\ultravnc.ini`; задать его обычным пользователем через
tray-иконку молча не получается (нет прав на запись).
`run.bat` синхронизирует этот пароль сам через `scripts/ensure-vnc-password.ps1`
`set-password.bat` синхронизирует этот пароль сам через `scripts/ensure-vnc-password.ps1`
(пишет только при несовпадении; UAC только при смене пароля). VNC-пароль = первые 8 байт,
поэтому используй ASCII-пароль <= 8 символов и там, и в `run.bat`.
поэтому используй ASCII-пароль <= 8 символов и в `set-password.bat`, и в VNC-сервере.
+47 -17
View File
@@ -18,29 +18,53 @@ Go-модулей, собирается офлайн.
└─ прозрачный релей WS↔TCP
```
## Самый простой запуск (Windows) — одним батником
## Самый простой запуск (Windows)
В папке проекта есть `run.bat`. Он делает всё сам и спрашивает **только пароль**:
Запуск состоит из двух шагов: один раз задаётся пароль, затем `run.bat` поднимает
gateway без запросов.
```bat
run.bat
```
1. **Один раз** задайте пароль:
```bat
set-password.bat
```
Спросит пароль доступа, синхронизирует им пароль UltraVNC-сервиса
(`scripts\ensure-vnc-password.ps1`, UAC только при смене), сгенерирует хэш и
сохранит его вместе с паролем в `webvnc.conf` (секрет, в git не коммитится).
Используйте ASCII-пароль длиной до 8 символов (VNC-пароль = первые 8 байт).
Что делает `run.bat`:
1. Если `web-vnc.exe` отсутствует — собирает его (нужен установленный Go).
Если Go нет — подсказывает, что сделать.
2. Если noVNC-клиент ещё не встроен — пытается его скачать (нужен интернет).
Без интернета продолжит работу, но в браузере будет страница-заглушка.
3. Спрашивает пароль доступа.
4. Генерирует из него хэш.
5. Ищет VNC-сервер: если он не установлен — пытается скачать портативный
UltraVNC (`scripts\get-vnc.ps1`) и запускать его.
6. Выводит список всех адресов для подключения (`http://localhost:8080` и
`http://<каждый IPv4 машины>:8080`) и запускает сервер с флагом `--spawn`.
2. **Запустите gateway**:
```bat
run.bat
```
`run.bat` собирает `web-vnc.exe` (нужен Go, если бинарника нет), встраивает
noVNC-клиент (качает при наличии интернета), находит/докачивает VNC-сервер,
читает пароль из `webvnc.conf` (больше не спрашивает), печатает адреса
(`http://localhost:8080` и `http://<каждый IPv4 машины>:8080`) и запускает
сервер с флагом `--spawn`. Если `127.0.0.1:5900` уже слушает (сервис UltraVNC) —
запускается без `--spawn`, подключаясь к существующему серверу.
После запуска откройте в браузере один из выведенных адресов,
введите тот же пароль — и попадёте на рабочий стол.
### Автостарт при загрузке ОС (вместо ручного `run.bat`)
```bat
set-password.bat :: один раз: пароль -> webvnc.conf
scripts\install-autostart.bat :: один раз (от админа): плановое задание «web-vnc»
```
`install-autostart.bat` регистрирует через `schtasks` задание (`ONSTART`, `SYSTEM`,
`HIGHEST`), которое при загрузке запускает `scripts\autostart-run.bat` —
неинтерактивный launcher, читающий `webvnc.conf` и не качающий ничего на старте.
Запустить сразу без перезагрузки: `schtasks /Run /TN "web-vnc"`.
Снять автостарт: `scripts\uninstall-autostart.bat` (от админа).
**Смена пароля:** `web-vnc.exe` читает пароль из `webvnc.conf` только при старте и не
перечитывает его в runtime. Поэтому `set-password.bat` (если задание «web-vnc» установлено)
перезапускает его через `scripts\restart-autostart.bat` (с elevation) — тот проверяет,
запущен ли `web-vnc.exe` (если да — стоп + старт, если нет — только старт). Рестарт
пропускается, если пароль не изменился. Для интерактивного `run.bat` просто перезапустите
его вручную.
## Быстрый старт вручную (Windows)
```powershell
@@ -186,7 +210,13 @@ scripts/get-novnc.{ps1,sh} скачать noVNC во встроенную ста
scripts/get-vnc.ps1 скачать портативный VNC-сервер (UltraVNC) в папку vnc/
scripts/list-ips.ps1 список IPv4 машины (используется run.bat)
scripts/open-firewall.bat открыть порт 8080 в Windows Firewall (один раз, от админа)
run.bat запуск в один клик (спрашивает только пароль)
run.bat интерактивный запуск: собирает бинарник/noVNC/VNC, читает пароль из webvnc.conf (не спрашивает)
set-password.bat разовая настройка пароля -> webvnc.conf (хэш + VNC-пароль); синхронизирует UltraVNC
webvnc.conf секрет: HASH= + VNC_PASSWORD= (создаётся set-password.bat, gitignored)
scripts/autostart-run.bat неинтерактивный launcher для автостарта (читает webvnc.conf)
scripts/install-autostart.bat автостарт при загрузке ОС (schtasks ONSTART/SYSTEM) — от админа
scripts/uninstall-autostart.bat снять автостарт — от админа
scripts/restart-autostart.bat перезапустить задание «web-vnc» (чтобы применить новый пароль) — от админа
```
## Кросс-компиляция под другую ОС
+27 -30
View File
@@ -1,6 +1,9 @@
@echo off
REM ============================================================
REM web-vnc launcher - one-click start, asks only for the password.
REM web-vnc launcher - starts the gateway without prompting.
REM The password is set up once with set-password.bat (stored in
REM webvnc.conf). If webvnc.conf is missing, this script tells you
REM to run set-password.bat first.
REM ============================================================
cd /d "%~dp0"
@@ -70,31 +73,29 @@ echo Install UltraVNC/TightVNC manually or retry: scripts\get-vnc.ps1
echo.
:vncdone
REM --- 4. Password ---
:getpw
set "PW="
set /p "PW=Enter access password: "
if "%PW%"=="" goto emptypw
goto gotpw
:emptypw
echo Password cannot be empty.
goto getpw
:gotpw
REM --- 4b. Sync UltraVNC password with the one entered (only when it differs) ---
echo Syncing UltraVNC password with the one entered. It will ask for admin rights if they differ...
powershell -NoProfile -ExecutionPolicy Bypass -File "%~dp0scripts\ensure-vnc-password.ps1" -Password "%PW%"
if errorlevel 1 echo [warning] Could not sync the UltraVNC password - continuing.
REM --- 5. Password hash + same password for the VNC server ---
echo Generating password hash ...
for /f "delims=" %%i in ('web-vnc.exe --gen-hash "%PW%"') do set "HASH=%%i"
if "%HASH%"=="" goto hashfail
REM --- 4. Stored password (set up once via set-password.bat) ---
if not exist "webvnc.conf" goto nopwconf
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%"=="" goto nopwconf
if "%VNC_PW%"=="" goto nopwconf
REM The same password is auto-sent to noVNC to authenticate against the VNC server.
set "WEBVNC_VNC_PASSWORD=%PW%"
set "PW="
set "WEBVNC_VNC_PASSWORD=%VNC_PW%"
set "VNC_PW="
goto havepw
:nopwconf
echo [error] Password is not configured yet.
echo Run set-password.bat once to set the password, then start run.bat.
echo.
pause
exit /b 1
:havepw
REM --- 6. Available addresses ---
REM --- 5. Available addresses ---
echo.
echo === Addresses to connect to (port 8080) ===
echo http://localhost:8080
@@ -104,7 +105,7 @@ echo If it does not open from another machine, run once as administrator:
echo scripts\open-firewall.bat
echo.
REM --- 7. Launch ---
REM --- 6. Launch ---
echo Starting web-vnc on http://localhost:8080
echo Stop: Ctrl+C
echo.
@@ -114,6 +115,7 @@ powershell -NoProfile -Command "try{$c=New-Object Net.Sockets.TcpClient('127.0.0
if not errorlevel 1 (
echo VNC server already listening on 127.0.0.1:5900 - connecting to it without --spawn.
set "SPAWNFLAG="
set "SPAWNARGS="
)
web-vnc.exe --password-hash "%HASH%" %SPAWNARGS% %SPAWNFLAG% --listen :8080
echo.
@@ -124,9 +126,4 @@ exit /b
:buildfail
echo Build failed.
pause
exit /b 1
:hashfail
echo [error] Could not generate the password hash.
pause
exit /b 1
+52
View File
@@ -0,0 +1,52 @@
@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, finds a LOCAL VNC server
REM (does NOT download anything), and starts web-vnc.exe in the
REM foreground. The task keeps the process alive and restarts it
REM on next boot.
REM Exit codes: 0 = server ran and stopped; 1 = no binary;
REM 2 = password not configured; other = web-vnc error.
REM ============================================================
cd /d "%~dp0"
REM --- 1. Binary (build if Go is available, else fail) ---
if not exist "web-vnc.exe" (
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
REM --- 2. Stored password ---
if not exist "webvnc.conf" exit /b 2
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
set "WEBVNC_VNC_PASSWORD=%VNC_PW%"
set "VNC_PW="
REM --- 3. VNC server (detect local only; never download at boot) ---
set "SPAWNARGS="
set "SPAWN_CMD="
if exist "vnc\winvnc.exe" set "SPAWN_CMD=vnc\winvnc.exe -run"
if exist "vnc\tvnserver.exe" if not defined SPAWN_CMD set "SPAWN_CMD=vnc\tvnserver.exe -run"
if defined SPAWN_CMD set "SPAWNARGS=--spawn-command "%SPAWN_CMD%""
set "SPAWNFLAG=--spawn"
powershell -NoProfile -Command "try{$c=New-Object Net.Sockets.TcpClient('127.0.0.1',5900);$c.Close();exit 0}catch{exit 1}"
if not errorlevel 1 (
set "SPAWNFLAG="
set "SPAWNARGS="
)
REM --- 4. Launch (foreground; the task host keeps it alive) ---
web-vnc.exe --password-hash "%HASH%" %SPAWNARGS% %SPAWNFLAG% --listen :8080
exit /b %errorlevel%
+48
View File
@@ -0,0 +1,48 @@
@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 Requires administrator rights (auto-elevates).
REM Run set-password.bat first to configure the password.
REM ============================================================
cd /d "%~dp0"
REM Admin check + auto-elevate.
net session >nul 2>nul
if errorlevel 1 (
echo Requesting administrator rights ...
powershell -Command "Start-Process -FilePath '%~f0' -Verb RunAs"
exit /b
)
if not exist "webvnc.conf" (
echo [error] Password is not configured. Run set-password.bat first.
pause
exit /b 1
)
if not exist "scripts\autostart-run.bat" (
echo [error] scripts\autostart-run.bat not found.
pause
exit /b 1
)
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
if errorlevel 1 (
echo [error] Could not create the task.
pause
exit /b 1
)
echo.
echo Done. web-vnc will start automatically on every boot.
echo Start it now (without rebooting):
echo schtasks /Run /TN "%TASK%"
echo Remove it with: scripts\uninstall-autostart.bat
echo.
pause
+58
View File
@@ -0,0 +1,58 @@
@echo off
REM ============================================================
REM restart-autostart.bat - restart the "web-vnc" task so the
REM running gateway reloads webvnc.conf (e.g. after set-password.bat
REM changed the password). web-vnc.exe reads the hash and the VNC
REM password only once at startup, so a restart is the only way to
REM apply a new password to the live gateway.
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 auto-elevates. Called from set-password.bat, or run manually.
REM ============================================================
cd /d "%~dp0"
net session >nul 2>nul
if errorlevel 1 (
echo Requesting administrator rights ...
powershell -Command "Start-Process -FilePath '%~f0' -Verb RunAs"
exit /b
)
set "TASK=web-vnc"
schtasks /Query /TN "%TASK%" >nul 2>nul
if errorlevel 1 (
echo [error] Task "%TASK%" is not installed. Run scripts\install-autostart.bat first.
pause
exit /b 1
)
REM --- Is web-vnc.exe currently running? ---
set "RUNNING=0"
tasklist /FI "IMAGENAME eq web-vnc.exe" 2>nul | findstr /I /B /C:"web-vnc.exe" >nul
if not errorlevel 1 set "RUNNING=1"
if "%RUNNING%"=="1" (
echo web-vnc.exe is running - restarting task "%TASK%" ...
schtasks /End /TN "%TASK%" >nul 2>nul
REM give the previous process a moment to release port 8080
timeout /t 2 /nobreak >nul
) else (
echo web-vnc.exe is NOT running - just starting task "%TASK%" ...
)
schtasks /Run /TN "%TASK%"
if errorlevel 1 (
echo [error] Could not start the task.
pause
exit /b 1
)
echo.
echo Done. web-vnc reloaded the password from webvnc.conf.
echo Check it at http://localhost:8080
echo.
pause
+26
View File
@@ -0,0 +1,26 @@
@echo off
REM ============================================================
REM uninstall-autostart.bat - remove the web-vnc startup task.
REM Deletes the scheduled task "web-vnc" created by
REM install-autostart.bat. Requires administrator rights
REM (auto-elevates).
REM ============================================================
cd /d "%~dp0"
net session >nul 2>nul
if errorlevel 1 (
echo Requesting administrator rights ...
powershell -Command "Start-Process -FilePath '%~f0' -Verb RunAs"
exit /b
)
set "TASK=web-vnc"
echo Removing scheduled task "%TASK%" ...
schtasks /Delete /TN "%TASK%" /F
if errorlevel 1 (
echo [error] Could not remove the task (maybe it does not exist).
pause
exit /b 1
)
echo Done.
pause
+108
View File
@@ -0,0 +1,108 @@
@echo off
REM ============================================================
REM set-password.bat - setup of the web access password.
REM Asks for the password, syncs the UltraVNC service password,
REM generates a hash and saves both to webvnc.conf (gitignored).
REM After this, run.bat and the autostart task start without asking.
REM
REM If the "web-vnc" autostart task is installed, this script also
REM restarts it (elevated, via scripts\restart-autostart.bat) so the
REM running gateway reloads the new password. The restart is skipped
REM only when the password did not actually change (the running gateway
REM already accepts it). restart-autostart.bat checks whether
REM web-vnc.exe is running and stops+starts it, or just starts it.
REM ============================================================
cd /d "%~dp0"
echo.
echo === web-vnc: password setup ===
echo.
REM --- 1. Binary (needed for --gen-hash) ---
if exist "web-vnc.exe" goto havebin
where go >nul 2>nul
if errorlevel 1 (
echo [error] web-vnc.exe not found and Go is not installed.
echo Build it first with: go build -o web-vnc.exe .\cmd\web-vnc
echo or run run.bat once interactively.
pause
exit /b 1
)
echo Building web-vnc.exe ...
go build -o web-vnc.exe .\cmd\web-vnc
if errorlevel 1 (
echo Build failed.
pause
exit /b 1
)
:havebin
REM --- 2. Remember the previous password (to detect a real change) ---
set "OLD_PW="
if exist "webvnc.conf" (
for /f "tokens=1,* delims==" %%a in (webvnc.conf) do if /i "%%a"=="VNC_PASSWORD" set "OLD_PW=%%b"
)
REM --- 3. Ask password ---
:getpw
set "PW="
set /p "PW=Enter access password (ASCII, max 8 chars for VNC): "
if "%PW%"=="" (
echo Password cannot be empty.
goto getpw
)
REM --- 4. Sync UltraVNC service password (UAC only if it differs) ---
echo Syncing UltraVNC password with the one entered ...
powershell -NoProfile -ExecutionPolicy Bypass -File "%~dp0scripts\ensure-vnc-password.ps1" -Password "%PW%"
if errorlevel 1 echo [warning] Could not sync the UltraVNC password - continuing.
REM --- 5. Generate hash ---
echo Generating password hash ...
set "HASH="
for /f "delims=" %%i in ('web-vnc.exe --gen-hash "%PW%"') do set "HASH=%%i"
if "%HASH%"=="" (
echo [error] Could not generate the password hash.
pause
exit /b 1
)
REM --- 6. Save to webvnc.conf (overwrite) ---
echo HASH=%HASH%> "webvnc.conf"
echo VNC_PASSWORD=%PW%>> "webvnc.conf"
set "HASH="
echo Saved to webvnc.conf.
REM --- 7. Apply to the running gateway (if the autostart task is installed) ---
REM web-vnc.exe reads the hash + VNC password only at startup, so a
REM restart is required for the new password to take effect.
schtasks /Query /TN "web-vnc" >nul 2>nul
if errorlevel 1 goto no_task
REM Skip the restart if the password did not change (the running gateway
REM already accepts it; PBKDF2 hash is always new due to salt, so we compare
REM the entered password with the old VNC_PASSWORD from webvnc.conf).
if not defined OLD_PW goto do_restart
if /i not "%OLD_PW%"=="%PW%" goto do_restart
echo.
echo Password unchanged - the running gateway keeps accepting it. No restart needed.
echo If the gateway is not running, start it with: scripts\restart-autostart.bat ^(admin^)
goto cleanup
:do_restart
echo.
echo Applying the new password to the "web-vnc" task ^(needs admin^) ...
powershell -NoProfile -Command "Start-Process -FilePath '%~dp0scripts\restart-autostart.bat' -Verb RunAs -Wait"
goto cleanup
:no_task
echo.
echo Autostart task "web-vnc" is not installed.
echo To start on every boot, run once as administrator:
echo scripts\install-autostart.bat
:cleanup
set "PW="
set "OLD_PW="
echo.
pause