1 (изменено: mozers, 2016-01-27 11:02:56)

Тема: 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. Трюк с подключением и тут же отключением сетевого диска служит для сохранения учетных данных для последующих сеансов. Что то даже не могу придумать какой то иной вариант...

2

Re: CMD/BAT: Подключение с помощью UltraVNC

2й вопрос порешал. Код обновил.
Уже не первый раз такое: Стоит прилюдно озвучить давнишнюю проблему, так сразу в голову приходит ее решение.

3

Re: CMD/BAT: Подключение с помощью UltraVNC

mozers пишет:

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

Пардону прошу, а MSRA (Remote Assistant, "Удалённый помощник") в вашем случае не подошёл из-за "лишних телодвижений" (отправить приглашение, сообщить пароль) со стороны пользователя? Или он просто менее удобен? (или что-то другое?)

4

Re: CMD/BAT: Подключение с помощью UltraVNC

UNDYING, совершенно верно, главная проблема - тупой юзверь на другом конце.

5

Re: CMD/BAT: Подключение с помощью UltraVNC

mozers пишет:

Добавили его в контекстное меню LAN Admin-а и стали жить припеваючи.

возможно как-то в скрипт передать имя или ip машины к которой пытаешься подключиться из контекстного меню?