Тема: CMD/BAT: Подключение с помощью UltraVNC
Данный скрипт был написан очень давно, в то самое время как нам запретили использовать любые программы для удаленного наблюдения за рабочим столом пользователя. "Если есть необходимость - сбегаете и посмотрите...". Несколько сотен пользователей в двух зданиях...
Вот тогда и появился этот скрипт. Добавили его в контекстное меню LAN Admin-а и стали жить припеваючи.
Что делает скрипт:
- копирует в каталог \\%comp%\c$\windows\uvnc пару файлов, необходимых для установки и настройки сервиса
- устанавливает и запускает сервис на удаленном ПК
- запускает на нашей машине UltraVNC Viewer и мы спокойно делаем свои дела (кольсолька со скриптом в это время просто висит на заднем плане)
- после закрытия окна UltraVNC Viewer, скрипт останавливает сервис и удаляет все следы нашего пребывания на удаленной машине
В командной строке запуска скрипта можно указать 3 параметра: имя удаленного компа, логин и пароль администратора.
Если параметры не заданы, то они будут запрошены.
Если пользователь, запустивший скрипт, имеет права администратора на удаленном ПК, то логин и пароль не требуются.
Если пользователь уже запускал скрипт и вводил логин и пароль, то при следующем подключении они так же не потребуются (благодаря уникальной возможности стандартной виндусёвой утилиты SC, которая может использовать сохраненные данные).
В зависимости от разрядности локальной и удаленной системы скрипт использует 32 и 64 битные версии UltraVNC. Для 32 битной я выбрал версию "xp", для 64 битной - "win7". На всем нашем "зоопарке" работает без проблем, но желающие могут выбрать и другие варианты.
Собственно, код скрипта:
@ECHO off
REM Full version with utils <https://bitbucket.org/html-applications/lan-admin/downloads/cm_vnc.zip>
CHCP 1251>nul
TITLE UltraVNC
COLOR 71
CD /d "%~dp0"
ECHO ====================================
ECHO Connect with UltraVNC v.1.2.0
ECHO ====================================
ECHO Usage: _vnc [computer] [login] [password]
ECHO.
SET comp=%1
IF [%comp%]==[] SET /p comp=Enter computer name for connect:
IF [%comp%]==[] GOTO :error
TITLE UltraVNC : %comp%
IF not exist \\%comp%\C$\ (
IF [%2]==[] (
NET use * \\%comp%\c$ /savecred
) ELSE (
NET use * \\%comp%\c$ %3 /user:%2
)
IF errorlevel 1 GOTO :error
FOR /F "tokens=2" %%i IN ('NET use^|FIND /i "\\%comp%\c$"') DO NET use %%i /delete
)
SET install_dir=windows\uvnc
IF not exist \\%comp%\C$\%install_dir%\winvnc.exe (
MD \\%comp%\C$\%install_dir%
<nul SET /p a=Copy to computer %comp% files UltraVNC
IF exist "\\%comp%\C$\Windows\SysWOW64" (
ECHO 64...
XCOPY x64\winvnc.exe \\%comp%\C$\%install_dir%\ /f /c /y
) ELSE (
ECHO 32...
XCOPY winvnc.exe \\%comp%\C$\%install_dir%\ /f /c /y
)
IF errorlevel 1 GOTO :error
XCOPY ultravnc.ini \\%comp%\C$\%install_dir%\ /f /c /y
IF errorlevel 1 GOTO :error
)
SC \\%comp% query uvnc_service | FIND "uvnc_service"
IF errorlevel 1 (
ECHO.
ECHO Create service...
SC \\%comp% create uvnc_service binpath= "c:\%install_dir%\winvnc.exe -service" start= auto
IF errorlevel 1 GOTO :error
)
SC \\%comp% query uvnc_service | FIND "RUNNING"
IF errorlevel 1 (
ECHO.
ECHO Start service...
SC \\%comp% start uvnc_service
IF errorlevel 1 GOTO :error
)
ECHO.
<nul SET /p a=Wait for opening of the port connection
:tcping
<nul SET /p a=.
TcPing -n 1 %comp% 5900 >nul 2<&1
if errorlevel 1 goto :tcping
SET errorlevel=0
ECHO.
ECHO.
<nul SET /p a=Run VNCViewer
IF exist %windir%\SysWOW64 (
ECHO 64...
ECHO = DON'T CLOSE THIS CONSOLE! =
x64\vncviewer.exe %comp% -password gfhjkm
) else (
ECHO 32...
ECHO = DON'T CLOSE THIS CONSOLE! =
vncviewer.exe %comp% -password gfhjkm
)
IF errorlevel 1 GOTO :error
ECHO.
ECHO Stop and delete service...
SC \\%comp% stop uvnc_service
IF errorlevel 1 GOTO :error
SC \\%comp% delete uvnc_service
IF errorlevel 1 GOTO :error
ECHO.
ECHO Wait for completion of the process winvnc.exe...
PING 127.0.0.1 -n 9 > nul
ECHO.
<nul SET /p a=Remove UltraVNC files
:rd
RD /s /q \\%comp%\C$\%install_dir% 2>nul
<nul SET /p a=.
IF exist \\%comp%\C$\%install_dir% GOTO :rd
ECHO.
ECHO Bye!
EXIT /b
:error
PAUSE
EXIT /b 1
Обновляемая версия этого кода лежит тут.
Полный пакет (со всеми необходимыми утилитами) - тут.
Несколько мыслей вслух (м.б. кто предложит лучшее решение?):
1. В Win7 и выше скрипт работает без претензий. Для обеспечения работы в WinXP пришлось к SC добавлять FIND чтобы хоть как то определить результат выполнения (т.к. старая версия SC всегда возвращает 0).
2. Окончание остановки удаленного сервера тупо ждем 10 сек по таймеру. Если сервер за это время еще не успел завершить работу, то файлы им блокируются и удалить их не удастся.
От варианта с проверкой наличия процесса winvnc.exe пришлось отказаться, т.к. я не нашел утилиты, способной использовать сохраненные данные предыдущего подключения (SC, оказывается, уникальна в этом плане).
3. Трюк с подключением и тут же отключением сетевого диска служит для сохранения учетных данных для последующих сеансов. Что то даже не могу придумать какой то иной вариант...