В данном разделе находится общая информация.
В данном разделе находятся примеры различных Linux shell скриптов.
В данном разделе находятся примеры различных скриптов на WSH.
В данном разделе находятся материалы по разным темам.

Правильный CSS!

Для корректного отображения страницы, рекомендуется использовать браузер поддерживающий JavaScript.

Для навигации пользуйтесь боковым меню и кнопками "Описание" и "Подробно".

Linux скрипт managecomps.sh: Консоль управления Windows компьютерами в домене.

Основные особенности работы:

  • Для администраторов гетерогенной сети (Linux+samba-client, Windows XP-2003);
  • Модуль useroncomp.sh:
    Определение логина пользователя, работающего на Windows ПК в домене, по IP адресу или имени ПК;
  • Модуль vncadmin.sh:
    Удаленное управление рабочим столом Windows ПК (зависит от tightvnc);
  • Модуль managecom.sh:
    Удаленное управление службами, реестром, шарами, открытыми файлами на Windows ПК;
  • Для работы требуется dilaog ≥ 1.1, samba-client ≥ 3.5 (с младшими версиями не тестировалось, но возможно будет работать)

Пример запуска:

Выбор компьютера:
managecomps.sh:Консоль управления Выбор компьютера

Выбор действий:
managecomps.sh:Консоль управления Выбор действий

Удаленное управление рабочим столом
vncadmin.sh:Удаленное управление рабочим столом Режим запуска

Управление компьютером
managecomp.sh:Управление Выбор действий

Пример Linux скриптов для управления Windows компьютерами в домене.

(Скачать файлы можно будет здесь managecomps-current.tar.gz. ЗЫ Не тыкать! Жать правой кнопкой: сохранить ссылку как...)

Условия:

Консоль управления, запуск в терминале:
managecomps.sh
в программе можно выбрать компьютер и запустить необходимый модуль.

В случае ручного запуска необходимого модуля, доступны следующие ключи:

Удаленное управление рабочим столом:
vncadmin.sh [-m fast|install|view|remove] [-n SERVERNAME] [-k|-U "DOMAIN\login%password"] [-d|-e] [-f] [-h]

  • -m - тип запуска (по умолчанию fast)
  • -n - Имя компьютера или IP
  • -k - использовать kerberos
  • -U - использовать указанные "DOMAIN\login%password"
  • -d - использовать dialog
  • -e - использовать echo
  • -f - полноэкранный режим
  • -h - вывести справку
Управление компьютером:
managecomp.sh [-n SERVERNAME] [-k|-U "DOMAIN\login%password"] [-h]
  • -n - Имя компьютера или IP
  • -k - использовать kerberos
  • -U - использовать указанные "DOMAIN\login%password"
  • -h - вывести справку
Кто на компе:
useroncomp.sh [-I|-U IP|Name] [-d|-k] [-b broadcast_IP] [-h]
  • -I -IP адрес или имя компьютера
  • -d -использовать dialog
  • -k -использовать kdialog
  • -o -сокращенный вывод
  • -U -искать по пользователю
  • -b -использовать указанный широковещательный адрес
  • -h -показать помощь

Обязательные параметры: IP адрес или имя компьютера, если не указано, предложит ввести.
Необязательные параметры: Тип аутентификации для модулей managecomp.sh и vncadmin.sh, если не указан, предложит ввести.
По умолчанию все модули, при запуске из Консоли управления managecomps.sh, используют dialog.

Текст managecomps.sh:

#!/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.0 (2010-09-20 12:37:13)
#
#Description:
# Консоль управления (выбор компьютера, вызов внешних модулей управления)

progname="${0##*/}"
title="Консоль управления"
vncadmin_param="-d"
useroncmp_param="-d -b 192.168.1.255"
menusize="20 100 15"
msgsize="20 100"

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"
}

authtype(){
	defU="$fn\\\\Администратор%password"
	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
}

complist=$(net ads search '(objectCategory=Computer)' cn 2>/dev/null | awk '/^cn:/ {print $2" <-" | "sort"}' | sed ':a; s/[:,]//g; /$/N; s/\n/ /; ta')
manage="1"
while [ "$manage" = "1" ]; do
	menu_t " Выбор компьютера " "" "$menusize" ".. Ручной_ввод $complist"
	test $ret -ne 0 && break
	fn="$action"
	if [ "$fn" = ".." ]; then
		input_t " Выбор компьютера " "Ручной ввод компьютера:" "$msgsize" ""
		test $ret -ne 0 && break
		fn="$action"
	fi
	# Выполнение
	menu_t " Выбор действий " "Что делать с $fn?" "$menusize" "vncadmin Удаленное_управление_рабочим_столом managecmp Управление_компьютером useroncmp Кто_на_компе"
	case $action in
		vncadmin) vncadmin.sh $vncadmin_param -n $fn;;
		managecmp) managecomp.sh -n $fn;;
		useroncmp) useroncomp.sh $useroncmp_param -I $fn;;
		*) break;;
	esac
done
exit 0

		

Текст vncadmin.sh:

#!/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.5 (2010-10-08 18:04:12)
#
#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)
		echo "Выбор компьютера:"
		complist=$(net ads search '(objectCategory=Computer)' cn 2>/dev/null | awk '/^cn:/ {print $2 | "sort"}') 
		echo "$complist" | awk 'BEGIN {for (i=0; i<=96; i++) printf "%s","="; print ""; i=0;} {i++; printf "|%-15s", $0; if ( i == 6 ) {i=0; print "|";} } END {print "";for (i=0; i<=96; i++) printf "%s","=";print ""}'
		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

		

Текст managecomp.sh:

#!/bin/sh
#
#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.3 (2010-09-30 16:15:06)
#
#Description:

progname="${0##*/}"
menusize="26 120 22"
menusizel="16 80 8"
msgsize="20 120"
msgsizel="10 80"
fn=""; fk=""
title="Управление:"

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"
}

echo_t(){
	#$1 - $title
	#$2 - $msgtext
	#$3 - $msgsize
	dialog --backtitle "$progname:$title" --title "$1" --msgbox "$2" $3
}

echo_ () {
	dialog --backtitle "$progname:$title" --title "$1" --infobox "$2" $3
}

ShowHelp () {
	echo_ " Справка " "Используй: $progname [-n SERVERNAME] [-k|-U \"DOMAIN\\login%password\"] [-h]\
		\n      -n - Имя компьютера или IP\
		\n      -k - использовать kerberos\
		\n      -U - использовать указанные \"DOMAIN\\login%password\"\
		\n      -h - вывести справку\n" "$msgsize"
}

for i in $@; do
	case $i in
		-n) nexts="fn";;
		-U) nexts="fU";;
		-k) fk="-k";;
		-h) ShowHelp; exit 0;;
		*)
			case $nexts in
				fn) fn="$i"; nexts="";;
				fU) fk="-U $i"; nexts="";;
			esac
		;;
	esac
done

if [ "$fn" = "" ]; then
	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
fi
test "$fn" != "" || { ShowHelp; exit 1; }
title="$title: $fn"

if [ "$fk" = "" ]; then
	defU="$fn\\\\Администратор%password"
	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
fi
echo "$fk" | grep -Eq "^(-k|-U +[[:graph:]]+\\\[[:graph:]]+%[[:graph:]]+)$" || { ShowHelp; exit 1; }

servicelist(){
	srvcmenutitle="(пробелы заменены символом \"._\" )"
	srvclist=$(net rpc service list -S $fn $fk)
	ret=$?
	if [ $ret -eq 0 ]; then
		srvcmenulist=$(echo "$srvclist" | awk '{gsub(/ +/,"._"); sub(/(\._)+"/," ");sub(/"$/,""); gsub(/\._/,"_",$2); print}')
	else
		srvcmenulist="error Ошибка:$ret"
	fi
}

ofilelist(){
	oflsmenutitle=""
	oflslist=$(net rpc file -S $fn $fk)
	ret=$?
	if [ $ret -eq 0 ]; then
		oflsmenulist=$(echo "$oflslist" | awk '$1 ~ /^[0-9]+$/ {flid_user=$1":"$2;sub($1" +"$2" *","");gsub(/( +$|")/,"");gsub(/ +/,":");sub(/^$/,"-");print flid_user" "$0 | "sort -t : --key 2"}')
	else
		oflsmenulist="error Ошибка:$ret"
	fi
}

sharelist(){
	shrmenutitle="(пробелы заменены символом \"._\" )"
	shrlist=$(rpcclient -c netshareenumall $fk $fn)
	ret=$?
	if [ $ret -eq 0 ]; then
		shrmenulist=$(echo "$shrlist" | awk '$1 !~ /^(password|remark):/ {if ($1 == "netname:") {sub(/^netname: */,"");str=str",_;"$0",_";} else str=str";"$0} END {gsub(/ /,"._",str);gsub(/\t/,"",str);gsub(/,_;/," ",str);print str}')
	else
		shrmenulist="error Ошибка:$ret"
	fi
}

registrylist(){
	#$1 - $path
	regmenutitle="(пробелы заменены символом \"._\" )"
	if [ "$1" = "" ]; then
		regmenulist="HKLM: <-- HKCU: <-- HKCR: <-- HKU: <--"
	else
		reglist=$(net rpc registry enumerate "$1" -S $fn $fk)
		ret=$?
		if [ $ret -eq 0 ]; then
			regmenulist=".. <-- $(echo "$reglist" | awk '{if ($1 == "Keyname") {sub(/^Keyname\s*=\s*/,"");gsub(/ /,"._");print $0":Key <--";} else if ($1 == "Valuename") {sub(/^Valuename\s*=\s*/,"");gsub(/ /,"._");print $0":Val <--";} }')"
		else
			regmenulist=".. <-- error Ошибка:$ret"
		fi
	fi
}

registrylist_r(){
	#$1 - $path
	base=$1
	subkeys=${base// /._}
	subkeys_r=""
	while [ "$subkeys" != "" ]; do
		fsubkeys=""
		for subkey in $subkeys; do
			subkeys_r="$subkey $subkeys_r"
			#echo "${subkey//._/ }"
			ssubkeys="$(net rpc registry enumerate "${subkey//._/ }" -S $fn $fk | awk '$1 ~ /^Keyname$/ {sub(/^Keyname\s*=\s*/,"");gsub(/ /,"._");print "'$subkey'/"$0}')"
			test "$ssubkeys" != "" && fsubkeys="$ssubkeys $fsubkeys"
		done
		subkeys="$fsubkeys"
	done
}

yesno(){
	#$1 - $title
	#$2 - $msgtext
	#$3 - $msgsize
	#$4 - $defaultno
	defaultno=""
	test "$4" = "No" && defaultno="--defaultno"
	dialog $defaultno --backtitle "$progname:$title" --title "$1" --yesno "$2" $3
	sel=$?
	case $sel in
		0) ret=1 ;;
		1) ret=0 ;;
		255) ret=0 ;;
	esac
}

manageservice(){
	service=" "
	servicelist
	defaultitem=""
	while [ "$service" != "" ]; do
		menu_t " Список сервисов " "$srvcmenutitle" "$menusize" "$srvcmenulist" "$defaultitem"
		defaultitem="--default-item $action"
		service="${action//._/ }"
		test "$service" = "error" && service=""
		managesrvc=1
		while [ $managesrvc -eq 1 -a "$service" != "" ]; do
			menu_t " Управление сервисом " "$service" "$menusize" "status Показать_статус start Запустить stop Остановить"
			case $action in
				status)	msgtext=$(net rpc service status "$service" -S $fn $fk);;
				start) msgtext=$(net rpc service start "$service" -S $fn $fk 2>/dev/null || echo "Ошибка $?");;
				stop) msgtext=$(net rpc service stop "$service" -S $fn $fk 2>/dev/null || echo "Ошибка $?");;
				*) break;;
			esac
			test "$msgtext" != "" && echo_t " Управление сервисом: $service " "$msgtext" "$msgsize"
			managesrvc=1
		done
	done
}

manageofiles(){
	oflid_user=" "
	ofilelist
	defaultitem=""
	while [ "$oflid_user" != "" ]; do
		menu_t " Список открытых файлов " "$oflsmenutitle" "$menusize" "$oflsmenulist" "$defaultitem"
		defaultitem="--default-item $action"
		oflid_user="$action"
		test "$oflid_user" = "error" && oflid_user=""
		manageofls=1
		while [ $manageofls -eq 1 -a "$oflid_user" != "" ]; do
			menu_t " Управление открытым файлом " "id=${oflid_user%:*} user=${oflid_user#*:}" "$menusize" "user Показать_файлы_пользователя close Закрыть"
			case $action in
				user) msgtext=$(net rpc file user ${oflid_user#*:} -S $fn $fk);;
				close)
					yesno " Управление открытым файлом " "Действительно закрыть?\n$oflid_user" "$msgsizel" "No"
					if [ $ret -eq 1 ]; then
						msgtext=$(net rpc file close ${oflid_user%:*} -S $fn $fk || echo "Ошибка $?")
						ofilelist
						defaultitem=""
						manageofls=0
					else
						msgtext=""
					fi
				;;
				*) break;;
			esac
			test "$msgtext" != "" && echo_t " Управление открытым файлом: $oflid_user " "$msgtext" "$msgsize"
		done
	done
}

manageshares(){
	share=" "
	sharelist
	defaultitem=""
	while [ "$share" != "" ]; do
		menu_t " Список шар " "$shrmenutitle" "$menusize" "$shrmenulist" "$defaultitem"
		defaultitem="--default-item $action"
		share="${action//._/ }"
		test "$share" = "error" && share=""
		manageshrs=1
		while [ $manageshrs -eq 1 -a "$share" != "" ]; do
			menu_t " Управление шарой " "$share" "$menusize" "info Показать_информацию delete Удалить"
			case $action in
				info) msgtext=$(rpcclient -c "netsharegetinfo \"$share\"" $fk $fn);;
				delete)
					yesno " Управление шарой " "Действительно удалить?\n$share" "$msgsizel" "No"
					if [ $ret -eq 1 ]; then
						msgtext=$(net rpc share delete "$share" -S $fn $fk || echo "Ошибка $?")
						sharelist
						defaultitem=""
						manageshrs=0
					else
						msgtext=""
					fi
				;; 
				*) break;;
			esac
			test "$msgtext" != "" && echo_t " Управление шарой: $share " "$msgtext" "$msgsize"
		done
	done
}

manageregistry(){
	regpath=""
	registry=""
	registrylist "$regpath"
	defaultitem=""
	menuoptions="--extra-button --extra-label Действия --ok-label Открыть"
	while [ $ret -ne 1 ]; do
		menu_t " Управление веткой реестра " "$regmenutitle\n$regpath" "$menusize" "$regmenulist" "$menuoptions $defaultitem"
		defaultitem="--default-item $action"
		registry_type="${action//._/ }"
		regtype="${registry_type#*:}:$ret"
		registry=${registry_type%:*}
		test "$registry" = "error" && registry=""
		managereg=1
		while [ $managereg -eq 1 -a $ret -ne 1 ]; do
			case $regtype in
				*Key:0) action="goto";;
				*Val:0) action="info";;
				*:0) action="goto";;
				*Key:3) menu_t " Управление веткой реестра " "$regpath/$registry" "$menusize" "goto Перейти delete Удалить";;
				*Val:3) menu_t " Управление веткой реестра " "$regpath/$registry" "$menusize" "info Смотреть delete Удалить";;
				*:3) action="goto";;
			esac
			case $action in
				goto)
					msgtext=""
					if [ "$registry" = ".." ]; then
						if [ "$regpath" = "${regpath%/*}" ]; then
							defaultitem="--default-item $regpath:"
							regpath=""
						else
							registry=${regpath##*/}
							regpath="${regpath%/*}"
							defaultitem="--default-item ${registry// /._}:Key"
						fi
					else
						if [ "$regpath" = "" ]; then
							regpath="$registry"
						else
							regpath="$regpath/$registry"
						fi
						defaultitem=""
					fi
					registrylist "$regpath"
					managereg=0
				;;
				info) msgtext=$(net rpc registry getvalue "$regpath" "$registry" -S $fn $fk ); managereg=0;;
				delete)
					case ${regtype#*:} in
						Key)
							yesno " Управление веткой реестра " "Рекурсивное удаление: $regpath/$registry\nПродолжить?" "$msgsizel" "No"
							if [ $ret -eq 1 ]; then
								registrylist_r "$regpath/$registry"
								msgtext="Рекурсивное удаление:"
								for subkey in $subkeys_r; do
									net rpc registry deletekey "${subkey//._/ }" -S $fn $fk; ret=$?
									if [ $ret -eq 0 ]; then
										msgtext="$msgtext\nУдален: ${subkey//._/ }"
									else
										msgtext="$msgtext\nОшибка ($ret) удаления ${subkey//._/ }"
									fi
								done
							else
								msgtext=""
							fi
						;;
						Val)
							yesno " Управление веткой реестра " "Удаление: $regpath/$registry\nПродолжить? " "$msgsizel" "No"
							if [ $ret -eq 1 ]; then
								net rpc registry deletevalue "$regpath" "$registry" -S $fn $fk; ret=$?
								if [ $ret -eq 0 ]; then
									msgtext="Удален: $regpath/$registry"
								else
									msgtext="Ошибка ($ret) удаления $regpath/$registry"
								fi
							else
								msgtext=""
							fi
						;;
					esac
					registrylist "$regpath"
					defaultitem=""
					managereg=0
				;; 
				*) break;;
			esac
			test "$msgtext" != "" && echo_t " Управление веткой реестра:$regpath/$registry " "$msgtext" "$msgsize" 
		done
	done

}

manage=" "
while [ "$manage" != "" ]; do
	menutitle=""
        menulist="managesrvc Управление_сервисами manageofls Управление_открытыми_фалами manageshrs Управление_шарами managereg Управление_реестром"
        menu_t " Выбор действий " "$menutitle" "$menusize" "$menulist"
	manage="$action"
	case $manage in
		managesrvc) manageservice;;
		manageofls) manageofiles;;
		manageshrs) manageshares;;
		managereg) manageregistry;;
	esac
done
#echo_t "$title" "Работа завершена" "$msgsizel"
exit 0

		

Текст useroncomp.sh:

#!/bin/sh
#
#Version: 1.3
#Copyright 2009-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/>.
#
progname="Кто на компе"
nonet="(127\.|169\.254\.)"
ethpre="eth"
nexts=""
echotype="e"
output="normal"
searchtype=""
c=1
broadcast=""
for i in "$@"; do
	case $i in
		-I) nexts="fI";;
		-d) echotype="d";;
		-k) echotype="k";;
		-o) output="oneline";;
		-U) nexts="fU";;
		-b) nexts="fb";;
		-h) echo -e "$0 [-I|-U IP|Name] [-d|-k] [-b broadcast_IP] [-h]\n\
			\t-I -IP адрес или имя компьютера\n\
			\t-d -использовать dialog\n\
			\t-k -использовать kdialog\n\
			\t-o -сокращенный вывод\n\
			\t-U -искать по пользователю\n\
			\t-b -использовать указанный широковещательный адрес\n\
			\t-h -показать помощь" && exit;;
		*)
			case $nexts in
				fI) name="$i"; searchtype="comp"; nexts="";;
				fU) name="$i"; searchtype="user"; nexts="";;
				fb) broadcast="$i"; nexts="";;
			esac
		;;
	esac
done

echo_t(){
case $1 in
	d) dialog --backtitle "$progname" --title " Результат " --msgbox "$2" 8 50;;
	k) kdialog  --caption "$progname" --title " Результат " --msgbox "$2";;
	e) echo $3 -e "$2";;
esac
}

read_t(){
case $1 in
	d) tmpfile="/tmp/input.$$"; dialog --backtitle "$progname" --title " Запрос " --inputbox "$2" 12 50 "$3" 2>$tmpfile; read < $tmpfile; rm -f $tmpfile;;
	k) tmpfile="/tmp/input.$$"; kdialog  --caption "$progname" --title " Запрос " --inputbox "$2" --    "$3"  >$tmpfile; read < $tmpfile; rm -f $tmpfile;;
	e) echo -e "$2";read;;
esac	
}

getname() {
	name="$1"
	if [ "$name" = "" ]; then
		while [ "$searchtype" = "" ]; do
			read_t $echotype "Укажи -I:[IP или Имя компьютера] или -U:[Имя пользователя]:" "-I:"
			case ${REPLY%:*} in
				"") echo_t $echotype "IP или Имя компьютера или Имя пользователя не выбрано. Отмена."; exit 1;;
				-I) searchtype="comp";;
				-U) searchtype="user";;
				*) echo_t $echotype "Не указан тип -I или -U. Попробуй еще раз, или нажми Ввод для выхода."; searchtype="";;
			esac
		done
		name="${REPLY#*:}"
		test "$name" = "" -o "$name" = "${REPLY%:*}" && { echo_t $echotype "IP или Имя не указан. Отмена."; exit 1; }
	fi
	case $searchtype in
	comp)
		IP=$name
		user=""
		if echo "$name" | grep -q -E "^([0-9]{1,3}\.){3}[0-9]{1,3}$"; then
			echo "$name" | grep -q -E "^((2(5[0-4]|[0-4][0-9])|1[0-9]{2}|[1-9]?[0-9])\.){3}(2(5[0-4]|[0-4][0-9])|1[0-9]{2}|[1-9]?[0-9])$"; ret=$?
			test $ret -eq 0 || { echo_t $echotype "$name похож на IP, но вне диапазона доступных IP или имеет лишние нули. Отмена."; exit 1; }
		else
			IP=$(nmblookup -B $broadcast $name#00 | awk 'and(/<00>/,!/^'$nonet'/) {print $1}')
			test "$IP" = "" && { echo_t $echotype "Компьютер: $name - не найден."; exit 1; }
			
		fi
		;;
	user)
		IP=""
		user=$name
		if echo "$name" | grep -q -E "^([0-9]{1,3}\.){3}[0-9]{1,3}$"; then
			echo_t $echotype "$name похож на IP, но должно быть Имя пользователя . Отмена."; exit 1
		else
			IP=$(nmblookup -B $broadcast -R $user#03 | awk '/<03>/ {print $1}')
			test "$IP" = "" && { echo_t $echotype "Пользователь: $user - не найден."; exit 1; }
		fi
		;;
	esac
}

getbrd() {
	#$1 - ether name prefix (eth)
	if echo "$broadcast" | grep -q -E "^([0-9]{1,3}\.){3}[0-9]{1,3}$"; then
		echo "$broadcast" | grep -q -E "^((2(5[0-4]|[0-4][0-9])|1[0-9]{2}|[1-9]?[0-9])\.){3}(2(5[0-5]|[0-4][0-9])|1[0-9]{2}|[1-9]?[0-9])$"; ret=$?
		test $ret -eq 0 || { echo_t $echotype "$broadcast похож на IP, но вне диапазона доступных IP или имеет лишние нули. Отмена."; exit 1; }
	else
		broadcasts=$(ip -f inet addr show label $1* | awk '$3 == "brd" {print $4}')
		echostr="Какой широковещательный адрес использовать? (Выбери номер: 1, 2 и т.д.)"
		i=1
		for broadcast in $broadcasts; do
			echostr="$echostr\n$i: $broadcast"
			let i=$i+1
		done
		brdnum=0
		while [ $brdnum -eq 0 ]; do
			read_t $echotype "$echostr" "1"; brdnum="$REPLY"
			test "$brdnum" = "" && { echo_t $echotype "Широковещательный адрес не выбран. Отмена."; exit 1; }
			echo "$brdnum" | grep -q -E "^[1-9][0-9]*$" || brdnum=$i
			test $brdnum -ge $i && { echo_t $echotype "Некорректный ввод. Попробуй еще раз, или нажми Ввод для выхода."; brdnum=0; }
		done
		i=1
		for broadcast in $broadcasts; do
			test $brdnum -eq $i && break
			let i=$i+1
		done
	fi
}

getbrd "$ethpre"
getname "$name"

cr=$(ping -c $c $IP 2>/dev/null | awk '/received/ {gsub(/^.*transmitted, | received,.*$/,""); print}')
#cr=1
if [ "$c" = "$cr" ]; then
	all=$(nmblookup -A $IP | awk 'or(and(/<(00|03)>/,!/<GROUP>/),/<1e>.+<GROUP>/) {gsub(/<|>/,"",$2); print $2":"$1}')
	test "$all" = "" && { echo_t $echotype "$IP не отвечает."; exit 1; }
	comp=$(echo "$all" | awk '/^00:/ {sub(/^00:/,""); comps=comps"|"$0} END {print comps}')
	comp=${comp#|}
	test "$searchtype" = "user" || { user=$(echo "$all" | awk 'and(/^03:/,!/:('$comp')/) {sub(/^03:/,""); users=users"|"$0} END {print users}'); user=${user#|}; }
	domain=$(echo "$all" | awk '/^1e:/ {sub(/^1e:/,""); print}')
	case $output in
		normal) echo_t $echotype "Домен: $domain\nПользовател(ь/и): $user\nКопьютер: $comp";;
		oneline) echo_t $echotype "$domain\\\\$user@$comp";;
	esac
else
	echo_t $echotype "$IP не пингуется: отпралено $c, получено $cr пакетов"	
	exit 1
fi

		

Что нового в этой версии:

Версия 1.4 (2010-10-08 18:04:12):
- изменен vncadmin.sh:#Version: 1.5 (2010-10-08 18:04:12):
-- при запуске с ключем -e добавлено отображение таблицы со списком компов для выбора
Версия 1.3 (2010-09-30 16:15:06):
- изменен managecomp.sh:#Version: 1.3 (2010-09-30 16:15:06):
-- доработано меню управления реестром (теперь при переходе в ".. <--", по умолчанию будет выбран тот элемент который был выбран ранее)
Версия 1.2 (2010-09-29 19:21:08):
- изменен managecomp.sh:#Version: 1.2 (2010-09-29 19:21:08):
-- реализована возможность удаления записей из реестра (c рекурсией)
Версия 1.1 (2010-09-24 13:31:54):
- изменен managecomp.sh:#Version: 1.1 (2010-09-24 13:28:48):
-- реализована возможность удаления записей из реестра (без рекурсии)
Версия 1.0 (2010-09-20 12:37:13):
- состав:
-- vncadmin.sh:#Version: 1.4 (2010-09-20 12:37:13)
-- managecomp.sh:#Version: 1.0 (2010-09-20 12:37:13)
-- useroncomp.sh:#Version: 1.3

Yandex.Metrika

Page modification: Птн Окт 8 18:28:01 MSD 2010
Используется bluefish 2.0.2 Under the GPL v3+ license.