(Скачать можно будет здесь managecomps-current.tar.gz. ЗЫ Не тыкать! Жать правой кнопкой: сохранить ссылку как...)
#!/bin/bash # #Copyright 2010 Konstantin Nadezhdin <w.homenki.ru> # #This program is free software: you can redistribute it and/or modify #it under the terms of the GNU General Public License as published by #the Free Software Foundation, either version 3 of the License, or #(at your option) any later version. # #This program is distributed in the hope that it will be useful, #but WITHOUT ANY WARRANTY; without even the implied warranty of #MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #GNU General Public License for more details. # #You should have received a copy of the GNU General Public License #along with this program. If not, see <http://www.gnu.org/licenses/>. # #Version: 1.4 (2010-09-20 12:37:13) # #Description: # Linux скрипт для удаленного запуска tightvnc сервера на ПК под управлением Windows XP,2003 # Требования: # На Linux компе, с которого планируется подключаться: # - установленный tightvnc клиент; # - настроенный winbind; # - распакованный дистрибутив tightvnc для Windows (файлы WinVNC.exe VNCHooks.dll) в каталог $srcdir; # - установлен пароль в $HOME/.vnc/passwd с помощью утилиты vncpasswd, такой же пароль прописан # в файле реестра при помощи WinVNC.exe -defaultsettings на подопытном компе # А также: # - один подопытный Windows комп для генерации файла реестра; # - права администратора на целевых ПК. # Состав рабочего комплекта: # #В $HOME/bin/: # vncadmin.sh - сам скрипт # #В рабочеи каталоге (например $HOME/LinuxScripts/tightvnc_srv_win32/): # tightvnc-1.3.10_x86.zip - дистрибутив tightvnc (http://www.tightvnc.com) # LICENCE.txt из tightvnc-1.3.10_x86.zip # README.txt из tightvnc-1.3.10_x86.zip # VNCHooks.dll из tightvnc-1.3.10_x86.zip # WhatsNew.txt из tightvnc-1.3.10_x86.zip # WinVNC.exe из tightvnc-1.3.10_x86.zip # VNCins.bat батник для вызова VNCins.vbs # VNCins.vbs скрипт для установки # VNCrem.bat батник для вызова VNCrem.vbs # VNCrem.vbs скрипт для удаления # VNCreg.bat батник для импорта реестра # winvnc.reg пример файла реестра, ветка HKLM\SOFTWARE\ORL (сгенерируйте свой самостоятельно!) progname="${0##*/}" title="Удаленное управление рабочим столом" # Рабочий каталог: srcdir=$HOME/LinuxScripts/tightvnc_srv_win32 # Количество пакетов для ping проверки: c=1 # Максимальное время ожидания установки/удаления и интервал проверки, в сек: timemax=12 timestep=2 timewait=5 menusize="20 100 15" msgsize="20 100" fn=""; fm=""; ff=""; fk=""; fd="-e"; dstr="" echo_ () { case $fd in -d) dstr="$dstr $1"; dialog --backtitle "$progname:$title" --infobox "$dstr" $msgsize;; -e) echo -en "$1";; esac } sleep_ () { case $fd in -d) dstr="$dstr $1"; dialog --backtitle "$progname:$title" --sleep $2 --infobox "$dstr" $msgsize;; -e) read -p "$1" -t $2;; esac } menu_t(){ #$1 - $title; #$2 - $menutitle; #$3 - $menusize; #$4 - $menulist; #$5 - $options tmpfile="/tmp/input-$UID.$$" dialog --backtitle "$progname:$title" --title "$1" $5 --menu "$2" $3 $4 2>$tmpfile ret=$? read < $tmpfile rm -f $tmpfile action="$REPLY" } input_t(){ #$1 - $title; #$2 - $inputboxtitle; #$3 - $inputboxsize; #$4 - $inputboxdef; #$5 - $options tmpfile="/tmp/input-$UID.$$" dialog --backtitle "$progname:$title" --title "$1" $5 --inputbox "$2" $3 "$4" 2>$tmpfile ret=$? read < $tmpfile rm -f $tmpfile action="$REPLY" } ShowHelp () { echo_ "Используй: $progname [-m fast|install|view|remove] [-n SERVERNAME] [-k|-U \"DOMAIN\\login%password\"] [-d|-e] [-f] [-h]\ \n -m - тип запуска (по умолчанию fast)\ \n -n - Имя компьютера или IP\ \n -k - использовать kerberos\ \n -U - использовать указанные \"DOMAIN\\login%password\"\ \n -d - использовать dialog\ \n -e - использовать echo\ \n -f - полноэкранный режим\ \n -h - вывести справку\n" } for i in $@; do case $i in -n) nexts="fn";; -m) nexts="fm";; -f) ff="-fullscreen";; -k) fk="-k";; -U) nexts="fU";; -d) fd="-d";; -e) fd="-e";; -h) ShowHelp; exit 0;; *) case $nexts in fn) fn="$i"; nexts="";; fm) fm="$i"; nexts="";; fU) fk="-U $i"; nexts="";; esac ;; esac done if [ "$fn" = "" ]; then case $fd in -d) complist=$(net ads search '(objectCategory=Computer)' cn 2>/dev/null | awk '/^cn:/ {print $2" <-" | "sort"}' | sed ':a; s/[:,]//g; /$/N; s/\n/ /; ta') menu_t " Выбор компьютера " "" "$menusize" ".. Ручной_ввод $complist" fn="$action" if [ "$fn" = ".." ]; then input_t " Выбор компьютера " "Ручной ввод компьютера" "$msgsize" "" fn="$action" fi ;; -e) test "$fn" = "" && read -p "Имя компа: " fn ;; esac fi test "$fn" != "" || { ShowHelp; exit 1; } title="$title: $fn" if [ "$fm" = "" ]; then case $fd in -d) menu_t " Режим запуска " "" "$menusize" "fast Полный_цикл install Установить view Смотреть remove Удалить" fm="$action" ;; -e) echo -e "Режим запуска:\n1 - fast\n2 - install\n3 - view\n4 - remove" read inp case $inp in 1|"") fm="fast";; 2) fm="install";; 3) fm="view";; 4) fm="remove";; esac ;; esac fi echo "$fm" | grep -Eq "^(install|view|remove|fast)$" || { ShowHelp; exit 1; } if [ "$fk" = "" ]; then defU="$fn\\\\Администратор%password" case $fd in -d) menu_t " Тип аутентификации " "" "$menusize" "-k использовать:kerberos -U использовать:DOMAIN\\login%password" fk="$action" if [ "$fk" = "-U" ]; then input_t " Тип аутентификации -U " "укажи: DOMAIN\\\\login%password" "$msgsize" "$defU" fk="-U $action" fi ;; -e) echo -e "Тип аутентификации\n-k - использовать kerberos*\n-U - использовать DOMAIN\\login%password" read fk test "$fk" = "" && fk="-k" test "$fk" = "-U" && { echo "Тип аутентификации -U, укажи: DOMAIN\\login%password"; read -e -i "$defU" -r fk; fk="-U $fk"; } ;; esac fi echo "$fk" | grep -Eq "^(-k|-U +[[:graph:]]+\\\[[:graph:]]+%[[:graph:]]+)$" || { ShowHelp; exit 1; } # Прочие параметры: logfile=$srcdir/last.log dstdir="\\Program Files\\tightvnc" regok="winvnc.reg.ok" srvok="winvnc.srv.ok" srvcnm="winvnc" srvcnmd="VNC Server" srvcnme="\"C:$dstdir\\WinVNC.exe\" -service" srvcnmr="winvncreg" srvcnmrd="VNC Server Register" srvcnmre="\"C:$dstdir\\VNCreg.bat\"" srvcnmi="winvncins" srvcnmid="VNC Server Installer" srvcnmie="\"C:$dstdir\\VNCins.bat\"" srvcnmu="winvncrem" srvcnmud="VNC Server Remover" srvcnmue="\"C:$dstdir\\VNCrem.bat\"" filelist="WinVNC.exe VNCHooks.dll winvnc.reg VNCreg.bat VNCins.vbs VNCins.bat VNCrem.vbs VNCrem.bat" regkeys="HKLM\\SOFTWARE\\ORL\\WinVNC3\\Default HKLM\\SOFTWARE\\ORL\\WinVNC3 HKLM\\SOFTWARE\\ORL" # Процедуры SrvSet () { #$1 имя сервиса #$2 delete|stop #$3 1|0 выйти или нет #$4 код выхода case $2 in delete) SetStr="удаления";; start) SetStr="запуска";; stop) SetStr="остановки";; esac net rpc service status $1 -S $fn $fk >>$logfile 2>&1 && { net rpc service $2 $1 -S $fn $fk >>$logfile 2>&1 || { echo_ "Ошибка $SetStr сервиса $srvcnm\n"; test $3 -eq 1 && exit $4; }; } } SrvcVar () { #$1 - имя файла #$2 - имя сервиса #$3 - имя сервиса отображаемое #$4 - комада запуска сервиса #$5 - дополнительный инф. текст #$6 - 1|0 выйти или нет #$7 - код выхода echo -e "1\x0d" > $srcdir/$1 smbclient //$fn/c$ $fk -c 'put "'$srcdir/$1'" "'"$dstdir\\$1"'"' >>$logfile 2>&1 || { echo_ "Ошибка при отправке $1\n"; exit $7; } net rpc service status $2 -S $fn $fk >>$logfile 2>&1 || { net rpc service create $2 "$3" "$4" -S $fn $fk >>$logfile 2>&1 || { echo_ "Не удалось зарегить сервис $2\n"; exit $7; }; } net rpc service start $2 -S $fn $fk >>$logfile 2>&1 timeout=0 ret=100 while [ $timeout -le $timemax ]; do sleep_ "..." $timestep smbclient //$fn/c$ $fk -c 'get "'"$dstdir\\$1"'" "'$srcdir/$1'"' >>$logfile 2>&1 && ret=$(sed 's/ *\x0d//' $srcdir/$1 | grep -E "^[0-9]+$") test $ret -eq 0 && timeout=$timemax let timeout=$timeout+$timestep done test $ret -eq 100 && { echo_ "Ошибка при получении $1\n"; exit $7; } test $ret -ge 1 && { echo_ "Ошибка запуска $5 на целевом компе\n"; test $6 -eq 1 && exit $7; } } clearlog () { rm -f $logfile touch $logfile } # Процедуры 1-13 step1 () { # Проверка каталога источника, если не найден, то выход с ошибкой 1: step=1 echo_ "STEP:$step " test -d $srcdir || { echo_ "Каталог источник не найден\n"; ShowHelp; exit $step; } clearlog echo_ "Ok\n" } step2 () { # Проверка компа для серверной части, если не задан, то выход с ошибкой 2: step=2 echo_ "STEP:$step " test "$fn" != "" || { echo_ "Не указан комп.\n"; exit $step; } echo_ "Ok\n" } step3 () { # Проверка компа для серверной части, или не найден, то выход с ошибкой 3: step=3 echo_ "STEP:$step " cr=$(ping -c $c $fn 2>/dev/null | awk '/received/ {gsub("^.*transmitted, | received,.*$","",$0); print $0}') test "$c" == "$cr" || { echo_ "Не пингуется $fn, отправлено $c получено $cr пакетов.\n"; exit $step; } echo_ "Ok\n" } step4 () { # Проверка подключения к компу, если нет подключения, то выход с ошибкой 4: step=4 echo_ "STEP:$step " smbclient -L //$fn $fk -g -E >$logfile 2>&1 || { echo_ "Подключиться не удалось\n"; exit $step; } echo_ "Ok\n" } step5 () { # Проверка каталога назначения и, при необходимости, его очистка: cleardir # Копирование файлов и проверка результатов копирования, если были ошибки, то выход с ошибкой 5: step=5 echo_ "STEP:$step " # Проверка каталога назначения и, при необходимости, его создание smbclient //$fn/c$ $fk -c 'cd "'"$dstdir"'"' >>$logfile 2>&1 || smbclient //$fn/c$ $fk -c 'mkdir "'"$dstdir"'"' >>$logfile 2>&1 ret=0 for filename in $filelist; do reti=10 test -e $srcdir/$filename && { reti=0; smbclient //$fn/c$ $fk -c 'put "'$srcdir/$filename'" "'"$dstdir\\$filename"'"' >>$logfile 2>&1; reti=$?; } let ret=$ret+$reti done test $ret -eq 0 || { echo_ "Ошибка при копировании файлов: $ret\n"; exit $step; } echo_ "Ok\n" } step6 () { # Внести данные в реестр HKLM\Software\ORL, если не удалось, то выйти с ошибкой 6: step=6 echo_ "STEP:$step " # Вариант с удаленным запуском reg import на целевом компе echo_ "Подождите, идет импорт реестра" SrvcVar $regok $srvcnmr "$srvcnmrd" "$srvcnmre" "reg import" 1 $step echo_ "Ok\n" } step7 () { # Зарегить сервис winvnc если он еще не зареген, если не удастся зарегить, то выйти с ошибкой 7: step=7 echo_ "STEP:$step " regkey="HKLM\SYSTEM\CurrentControlSet\Services" # Вариант с удаленным запуском WinVNC.exe -install на целевом компе (промежуточный сервис winvncins) echo_ "Подождите, идет установка" SrvcVar $srvok $srvcnmi "$srvcnmid" "$srvcnmie" "WinVNC.exe -install" 1 $step net rpc registry setvalue "$regkey\\$srvcnm" "Start" "dword" "3" -S $fn $fk >>$logfile 2>&1 || { echo_ "Не удалось сменить запуск сервиса $srvcnm\n"; exit $step; } echo_ "Ok\n" } step8 () { # Старотовать сервис winvnc, если не удалось, то выйти с ошибкой 8: step=8 echo_ "STEP:$step " SrvSet $srvcnm "start" 1 $step sleep_ "Подождите, запускаю службу..." $timewait echo_ "Ok\n" } step9 () { # Подключиться: step=9 echo_ "STEP:$step " vncviewer -passwd $HOME/.vnc/passwd -bgr233 $ff $fn >>$logfile 2>&1 #krdc vnc://$fn echo_ "Ok\n" } step10 () { # Остановить сервис winvnc: step=10 echo_ "STEP:$step " SrvSet $srvcnm "stop" 0 $step sleep_ "Подождите, останавливаю службу..." $timewait echo_ "Ok\n" } step11 () { # Удалить сервис winvnc, если не удастся, то выйти с ошибкой 11: step=11 echo_ "STEP:$step " # Вариант с удаленным запуском WinVNC.exe -remove на целевом компе (промежуточный сервис winvncrem) echo_ "Подождите, идет удаление" SrvcVar $srvok $srvcnmu "$srvcnmud" "$srvcnmue" "WinVNC.exe -remove" 0 $step test $ret -ge 1 && { echo_ ",пробую удалить принудительно: \n"; SrvSet $srvcnm "delete" 1 $step; } echo_ "Ok\n" } step12 () { # Удалить сервисы промежуточные: step=12 echo_ "STEP:$step " for srvc in $srvcnmr $srvcnmi $srvcnmu; do SrvSet $srvc "delete" 0 $step done echo_ "Ok\n" } step13 () { # Очитсить реестр: step=13 echo_ "STEP:$step " for regkey in $regkeys; do net rpc registry enumerate "$regkey" -S $fn $fk >>$logfile 2>&1 && { net rpc registry deletekey "$regkey" -S $fn $fk >>$logfile 2>&1 || echo_ "Ошибка очистки реестра $regkey\n"; } done echo_ "Ok\n" } renamef () { # Переименовывание файлов перед копированим, если не удалось, то выйти с ошибкой renamef: step="renamef" echo_ "STEP:$step " ret=0 filelistre="" filelistr=$(smbclient //$fn/c$ $fk -c 'ls "'"$dstdir\\?*.*"'"' 2>/dev/null | awk '{if ($1 == "") exit; print $1}') for filename in $filelistr; do reti=0 smbclient //$fn/c$ $fk -c 'rename "'"$dstdir\\$filename"'" "'"$dstdir\\$filename.old"'"' >>$logfile 2>&1 || { reti=$?; filelistre="$filelistre\n$dstdir\\$filename"; } let ret=$ret+$reti done test $ret -eq 0 || { echo_ "Ошибка при удалении и переименовании файлов: $filelistre\n"; exit $step; } echo_ "Ok\n" } cleardir () { # Проверка каталога назначения и, при необходимости, его очистка: step="cleardir" echo_ "STEP:$step " smbclient //$fn/c$ $fk -c 'cd "'"$dstdir"'"' >>$logfile 2>&1 ret=$? if [ $ret -eq 0 ]; then smbclient //$fn/c$ $fk -c 'rm "'"$dstdir\\*"'"' >>$logfile 2>&1 || { echo_ "Ошибка при очистке $dstdir\n"; exit $step; } smbclient //$fn/c$ $fk -c 'rmdir "'"$dstdir"'"' >>$logfile 2>&1 || { echo_ "Ошибка при удалении $dstdir\n"; exit $step; } fi smbclient //$fn/c$ $fk -c 'cd "'"$dstdir"'"' >>$logfile 2>&1 ret=$? if [ $ret -eq 0 ]; then echo_ "Error, похоже каталог остался, поэтому запускаю модуль переименования renamef:\n" renamef else echo_ "Ok\n" fi } # Выполнение case $fm in install) echo_ "Выполняю установку 1-7,12:\n" step1 step2 step3 step4 step5 step6 step7 step12 ;; remove) echo_ "Выполняю удаление 1-4,11-13,cleardir:\n" step1 step2 step3 step4 step11 step12 step13 cleardir ;; view) echo_ "Подключаюсь к удаленному рабочему столу 1-3,8-10:\n" step1 step2 step3 step8 step9 step10 ;; fast) echo_ "Выполняю быстрый старт 1-13,cleardir:\n" step1 step2 step3 step4 step5 step6 step7 step8 step9 step10 step11 step12 step13 cleardir ;; esac
Set WshShell = WScript.CreateObject("WScript.Shell") WshShell.Run "cmd /c """"C:\Program Files\tightvnc\WinVNC.exe"" -silent -install && echo 0 > ""C:\Program Files\tightvnc\winvnc.srv.ok""""",0,false
@echo off cscript //Nologo "C:\Program Files\tightvnc\VNCins.vbs"
Set WshShell = WScript.CreateObject("WScript.Shell") WshShell.Run "cmd /c """"C:\Program Files\tightvnc\WinVNC.exe"" -silent -remove && echo 0 > ""C:\Program Files\tightvnc\winvnc.srv.ok""""",0,false
@echo off cscript //Nologo "C:\Program Files\tightvnc\VNCrem.vbs"
@echo off reg import "C:\Program Files\tightvnc\winvnc.reg" && echo 0 > "C:\Program Files\tightvnc\winvnc.reg.ok"Примечание: