System administration
28 March 2014

Удаленная установка программ на Windows (XP SP3 и более новые) без использования сторонних утилит

From Sandbox
Работая системным администратором, часто сталкиваешься с необходимостью удаленной установки каких-либо программ. Что-то массовое может быть установлено через групповые политики, что-то единичное приходится устанавливать с помощью непосредственного управления целевым компьютером.

Однако, с тех пор, как в нашей ультраконсервативной конторе стали появлятся компьютеры с более новой, чем XP, версией Windows, возникла проблема: удаленный помощник Windows Server 2003 (который итак никого, в общем-то, не устраивал) не мог подключиться к более поздним версиям ОС. Конечно, у нас оставался старый добрый «Удаленный рабочий стол», но иногда ведь нужно увидеть именно то, что видит на своем рабочем столе пользователь. При этом политика безопасности конторы требовала использовать минимум стороннего софта.

После долгих поисков, было установлено, что подключиться к сеансу Windows 7 из сеанса Windows Server 2003 без какой-либо сторонней утилиты не получится. Конкурс на самую бесплатную утилиту удаленного управления выиграла UltraVNC. Именно на ее примере ниже будет рассмотрен способ удаленной тихой установки программ без использования сторонних утилит.

Постановка задачи


Для все той же минимизации присутствия левого софта на компьютерах предприятия, решено было не толкать установку UltraVNC через политики. При этом не было никакого желания на каждый компьютер, где требуется подключиться в сеанс пользователя, подключаться через «удаленный рабочий стол» для установки UltraVNC.

Так и возникла задача — организовать удаленную установку программы X на компьютер Y по требованию. В результате работы сначала явился на свет файл install.bat, способный совершить тихую установку-настройку требуемой программы, а затем был придуман и способ запустить такую установку на удаленном компьютере совершенно без использования сторонних утилит (remote-install.bat).

Тихая установка UltraVNC


Скрипт позволяет быстро и без лишнего шума установить UltraVNC при запуске с администраторскими правами на целевой машине.
install.bat
@echo off
rem Начинаем новый лог установки
set logfile=install.log
echo %date% %COMPUTERNAME%>%logfile%
echo [%time:~,8%] Установка начата>>%logfile%

set ThePath="%1"
if %ThePath% EQU "" set ThePath="%CD%"

rem Проверяем не 64-битная ли система
set DISTR=UltraVNC1191(x86).exe
if "%ProgramFiles(x86)%" NEQ "" set DISTR=UltraVNC1191(x64).exe

rem Проверяем есть ли установленный сервер в данный момент
dir "C:\Program Files\UltraVNC" >NUL
if %errorlevel% EQU 0 (goto CHECK_VER) else (cls)
echo [%time:~,8%] Установленных версий программы не найдено>>%logfile%
goto INSTALL

rem При наличии установки проверяем соответствует ли версия нужной
:CHECK_VER
echo [%time:~,8%] Найдена установленная версия программы>>%logfile%

type "C:\Program Files\UltraVNC\Whatsnew.rtf" | find "1.1.9.1" >NUL
if %errorlevel% EQU 0 (cls & goto OOPS) else (echo [%time:~,8%] Установленная версия не соответствует актуальной>>%logfile%)

rem Чтобы не было ребутов - останавливаем службу и сносим старые конфиги со всем остальным за компанию
echo [%time:~,8%] Останавливаем службу UVNC_Service>>%logfile%
net stop uvnc_service >NUL
if %errorlevel% EQU 0 (echo [%time:~,8%] Служба UVNC_Service остановлена>>%logfile%) else (echo [%time:~,8%] Не удалось остановить службу UVNC_Service>>%logfile%)

rd /s /q "C:\Program Files\UltraVNC" >NUL
if %errorlevel% EQU 0 (echo [%time:~,8%] Папка установленной ранее версии UltraVNC очищена>>%logfile%) else (echo [%time:~,8%] Не удалось очистить папку ранее установленной UltraVNC>>%logfile%)

rem Начинаем установку: создаем папку, копируем туда заготовленный конфиг с нужными настройками
:INSTALL
md "C:\Program Files\UltraVNC" >NUL && echo [%time:~,8%] Создана папка для установки UltraVNC>>%logfile%
cls

copy /y "%ThePath:"=%\ultravnc.ini" "C:\Program Files\UltraVNC" >NUL
if %errorlevel% EQU 0 (echo [%time:~,8%] Файл настроек сервера скопирован в папку>>%logfile%) else (echo [%time:~,8%] Не удалось скопировать файл настроек сервера>>%logfile%)

rem Запускаем тихую установку
"%ThePath:"=%\%DISTR%" /verysilent /loadinf="%ThePath:"=%\uvncinstall.inf"
if %errorlevel% EQU 0 (echo [%time:~,8%] Сервер UltraVNC установлен>>%logfile%) else (echo [%time:~,8%] Не удалось установить сервер UltraVNC>>%logfile%)
rem Удаляем пункты в Главном меню - чтобы пользователям не мешалось
rd /q /s "C:\Documents and Settings\All Users\Главное меню\Программы\UltraVNC" >NUL
if %errorlevel% EQU 0 (echo [%time:~,8%] Ярлыки удалены из главного меню>>%logfile%) else (echo [%time:~,8%] Не получилось удалить ярлыки из главного меню>>%logfile%)

cls
type %logfile%
echo Сервер UltraVNC установлен
goto :eof

rem Версия соответствует нужной, установка не нужна, выходим
:OOPS
echo [%time:~,8%] Найдена актуальная версия UltraVNC сервера (1.1.9.1)>>%logfile%
cls
type %logfile%
echo Установка не требуется
pause
goto :eof

Удаленный запуск тихой установки


Скрипт позволяет удаленно запустить install.bat с администраторскими (пользователь SYSTEM) правами.
remote-install.bat
@echo off
rem Узнаём имя целевого компьютера, проверяем не пустое ли оно
set /p CompName="Введите имя компьютера или IP-адрес: "
if '%CompName%' EQU '' goto :eof

rem Проверяем не установлена ли какая-нибудь версия UltraVNC
dir "\\%CompName%\c$\Program Files\UltraVNC" >NUL && goto CHECK_VER
goto INSTALL

rem Проверяем установленную версию
:CHECK_VER
type "\\%CompName%\c$\Program Files\UltraVNC\Whatsnew.rtf" | find "1.1.9.1" >NUL && goto OOPS
goto INSTALL

rem Копируем папку, в которой находится этот скрипт в C:\Temp
:INSTALL
md \\%CompName%\c$\Temp\UltraVNCServer
xcopy /y "%CD%\*.*" \\%CompName%\c$\Temp\UltraVNCServer >NUL
rem Создаём и запускаем на выполнение задание установки
schtasks /create /s %CompName% /ru system /sc once /tn uvncinstall /tr "C:\Temp\UltraVNCServer\install.bat C:\Temp\UltraVNCServer" /ST "23:30:00"
schtasks /run /s %CompName% /tn uvncinstall

rem Циклично проверяем не завершилось ли задание каждые 5 пингов (секунд)
:CHECK
ping 127.0.0.1 -n 5 >NUL
schtasks /query /s %CompName% | find "uvncinstall" | find "Выполняется" && goto :CHECK

rem Удаляем задание и дистрибутив с комп-а
schtasks /delete /s %CompName% /tn uvncinstall /f
type \\%CompName%\c$\Temp\UltraVNCServer\install.log
rd /q /s \\%CompName%\c$\Temp\UltraVNCServer >NUL
echo Завершено. Проверяйте!
pause
goto :eof

rem Версия-то стоит как раз нужная
:OOPS
echo UltraVNC (1.1.9.1) уже установлен на этот компьютер.
pause
goto :eof

Немаловажное


Во избежание неработоспособности скриптов из-за недоразумений с кодировками, оба файла лучше сохранить в кодировке MS-DOS (OEM 866). Также для успешной установки программы нужны:
  • соответственно названные дистрибутивы для 32 и 64-битных систем — UltraVNC1191(x86).exe и UltraVNC1191(x64).exe
  • заранее заготовленный файл с настройками будущего UltraVNC сервера — ultravnc.ini (можно взять из уже установленной и настроенной копии программы на любом компьютере)
  • файл с опциями установки — uvncinstall.inf. У меня он такой:

[Setup]
Lang=en
Dir=C:\Program Files\UltraVNC
Group=UltraVNC
NoIcons=0
SetupType=server_silent
Components=ultravnc_server_s
Tasks=installservice,startservice

Итог


Данные bat-скрипты позволили беспрепятственно устанавливать UltraVNC не только на компьютеры с Windows 7, но и на проблемные (с точки зрения «удаленного помощника») компьютеры с Windows XP, а впоследствии и на компьютеры с Windows 8. При желании и наличии напильника, с помощью этих скриптов также можно установить и другие программы — лишь бы была «тихая» установка.

Ключевой особенностью этого способа установки стало именно использование schtasks для создания, запуска и удаления заданий после их завершения. Остальное содержимое скриптов — проверки, перестраховки и всяческие ленивости для минимизации ручного и умственного труда при необходимости установки UltraVNC на очередной компьютер.

+4
44.7k 124
Comments 14
Top of the day