Cкрипт vncadmin.vbs портирован с Linux версии скрипта vncadmin.sh, разработаного для удаленной установки/удаления серверной части tightvnc на Windows XP-2003 и доступу к удаленному рабочему столу Windows XP-2003 используя tightvnc клиент.
(Скачать можно будет здесь vncadmin_w-1.0.zip. ЗЫ Не тыкать! Жать правой кнопкой: сохранить ссылку как...)
' VBS скрипт для удаленного запуска tightvnc сервера на ПК под управлением Windows XP,2003
' Версия: 1.0 (2010-07-06 16:17:23)
' Требования:
' На Windows компе, с которого планируется подключаться:
' - наличие tightvnc клиента;
' - зарегистрирован в домене;
' - распакованный дистрибутив tightvnc для Windows (файлы WinVNC.exe VNCHooks.dll) в каталог srcdir;
' - подготовлен пароль, такой же пароль прописан в файле реестра при помощи WinVNC.exe -defaultsettings
' на подопытном компе
' А также:
' - один подопытный Windows комп для генерации файла реестра;
' - права администратора на целевых ПК.
' Состав рабочего комплекта:
' tightvnc-1.3.10_x86.zip - дистрибутив tightvnc (http://www.tightvnc.com)
'
'В %HOME%/bin/:
' vncadmin.vbs - сам скрипт
' vncadmin_b.bat - скрипт вызова "cscript.exe //Nologo vncadmin.vbs -d"
' vncadmin_e.bat - скрипт вызова "cscript.exe //Nologo vncadmin.vbs -e"
' vncviewer.exe из tightvnc-1.3.10_x86.zip
'
'В рабочеи каталоге (например %HOME%/share/tightvnc_srv_win32/):
' 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 (сгенерируйте свой самостоятельно!)
ScriptName = "vncadmin.vbs"
Set objArgs = WScript.Arguments
Set WshShell = WScript.CreateObject("WScript.Shell")
Set fso = CreateObject("Scripting.FileSystemObject")
Set WshSysEnv = WshShell.Environment("Process")
' Получение значения переменной HOME
HOME = WshSysEnv("HOME")
If HOME = "" Then echo_ "Не установлена переменная HOME","n": exit_ 1
If Not fso.FolderExists(HOME) Then echo_ "Не существует "&HOME,"n": exit_ 1
' Рабочий каталог:
srcdir = HOME&"\share\tightvnc_srv_win32"
' Максимальное время ожидания установки/удаления и интервал проверки, в сек:
timemax = 12
timestep = 2
timewait = 5
' Прочие параметры:
vncparam = "/8bit"
dstshare = "c$"
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"""
Const HKLM = &H80000002
filelist = Array("WinVNC.exe","VNCHooks.dll","winvnc.reg","VNCreg.bat","VNCins.vbs","VNCins.bat","VNCrem.vbs","VNCrem.bat")
regkeys = Array("SOFTWARE\ORL\WinVNC3\Default","SOFTWARE\ORL\WinVNC3","SOFTWARE\ORL")
Sub exit_(S1)
WSCript.Quit(S1)
End Sub
Sub echo_(S1,S2)
Select Case LCase(S2)
Case "": WScript.StdOut.Write S1
Case "n": WScript.StdOut.Write S1&VBNewLine
Case Else:
Select Case LCase(fd)
Case "-d": MsgBox S1,,ScriptName
Case "-e": WScript.Echo S1
End Select
End Select
End Sub
Sub sleep_(S1,S2)
WScript.StdOut.Write S1
WScript.Sleep S2*1000
End Sub
Sub ShowHelp()
echo_ "Используй: cscript //Nologo "&ScriptName&_
" [-m fast|install|view|remove] [-n SERVERNAME] [-d|-e] [-f] [-h]"&VBNewLine&_
"-m - тип запуска (по умолчанию fast)"&VBNewLine&_
"-n - Имя компьютера или IP"&VBNewLine&_
"-d - использовать dialog вместо echo"&VBNewLine&_
"-e - использовать echo (по умолчанию)"&VBNewLine&_
"-f - полноэкранный режим"&VBNewLine&_
"-h - вывести справку","1"
End Sub
Function read(S1,S2)
read = ""
Select Case LCase(fd)
Case "-d": read = InputBox(S1,ScriptName,S2)
Case "-e":
WScript.Echo S1
read = WScript.StdIn.ReadLine
If read = "" Then read = S2
End Select
End Function
Function RegExpTest(patrn, strng)
Dim regEx, retVal
Set regEx = New RegExp
regEx.Pattern = patrn
regEx.IgnoreCase = False
RegVal = regEx.Test(strng)
RegExpTest = RegVal
End Function
fm = ""
ff = ""
fk = ""
fd = ""
nexts = ""
ArgNum = 0
While ArgNum < objArgs.Count
Select Case LCase(objArgs(ArgNum))
Case "-n": nexts = "fn"
Case "-m": nexts = "fm"
Case "-f": ff = "/fullscreen"
Case "-d": fd = "-d"
Case "-e": fd = "-e"
Case "-h": ShowHelp : exit_ 0
Case Else:
Select Case LCase(nexts)
Case "fn": fn = objArgs(ArgNum) : nexts = ""
Case "fm": fm = objArgs(ArgNum) : nexts = ""
End Select
End Select
ArgNum = ArgNum + 1
Wend
If fm = "" Then
inp = read("Режим запуска:"&VBNewLine&_
"1 - fast (полный цикл)*"&VBNewLine&_
"2 - install (установить)"&VBNewLine&_
"3 - view (смотреть)"&VBNewLine&_
"4 - remove (удалить)","1")
Select Case LCase(inp)
Case "1": fm = "fast"
Case "2": fm = "install"
Case "3": fm = "view"
Case "4": fm = "remove"
End Select
End If
If RegExpTest("^(install|view|remove|fast)$", fm)=0 Then ShowHelp : exit_ 1
If fn = "" Then fn = read("Имя компа (тип запуска "&fm&"): ","")
If fn = "" Then ShowHelp : exit_ 1
' Процедуры
Function TestPing(S1)
Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")
Set colPings = objWMIService.ExecQuery("Select * From Win32_PingStatus where Address = '"&S1&"'")
For Each objStatus in colPings
If IsNull(objStatus.StatusCode) or objStatus.StatusCode<>0 Then
TestPing = 0
Else
TestPing = 1
End If
Next
End Function
Function net_rpc_service(S3,S1,S2)
'S1 имя сервиса; S2 имя компа; S3 действие delete|start|stop|status
net_rpc_service = 1
Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\"&S2&"\root\cimv2")
Set colRunningServices = objWMIService.ExecQuery("Select * from Win32_Service where Name='"&S1&"'")
For Each objService in colRunningServices
Select Case LCase(S3)
Case "delete": net_rpc_service = objService.Delete()
Case "start": net_rpc_service = objService.StartService()
Case "stop": net_rpc_service = objService.StopService()
Case "status": net_rpc_service = 0
End Select
Next
End Function
Function net_rpc_service_create(S1,S2,S3,S4)
'S1 - имя сервиса; S2 - имя сервиса отображаемое; S3 - комада запуска сервиса; S4 - имя компа
net_rpc_service_create = 1
Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\"&S4&"\root\cimv2:Win32_Service")
net_rpc_service_create = objWMIService.Create(S1,S2,S3,16,1,"Manual",false,NULL,NULL,NULL,NULL,NULL)
End Function
Function net_rpc_registry_setvalue(S1,S2,S3,S4,S5)
'S1 HKLM; S2 strKeyPath; S3 dwValueName; S4 dwValue; S5 fn
net_rpc_registry_setvalue = 1
Set oReg=GetObject("winmgmts:{impersonationLevel=impersonate}!\\"&S5&"\root\default:StdRegProv")
oReg.SetDWORDValue S1,S2,S3,S4
oReg.GetDWORDValue S1,S2,S3,S4g
If S4 = S4g Then net_rpc_registry_setvalue = 0
End Function
Function net_rpc_registry(S1,S2,S3,S4)
'S1 enumerate|deletekey; S2 HKLM; S3 strKeyPath; S4 fn
net_rpc_registry = 1
Set oReg=GetObject("winmgmts:{impersonationLevel=impersonate}!\\"&S4&"\root\default:StdRegProv")
Select Case LCase(S1)
Case "enumerate":
Const KQV = &H0001
oReg.CheckAccess S2, S3, KQV, bHasAccessRight
If bHasAccessRight = True Then net_rpc_registry = 0
Case "deletekey":
net_rpc_registry = oReg.DeleteKey(S2,S3)
End Select
End Function
Function smbclient(S1,S2,S3,S4)
'S1 имя шары; S2 направление; S3 локальный ресурс; S4 удаленный ресурс
smbclient = 1
Select Case LCase(S2)
Case "put":
fso.CopyFile S3,S1&"\"&S4,true
If (fso.FileExists(S1&"\"&S4)) Then smbclient = 0
Case "get":
fso.CopyFile S1&"\"&S3,S4,true
If (fso.FileExists(S4)) Then smbclient = 0
End Select
End Function
Sub SrvSet(S1,S2,S3,S4)
'$1 имя сервиса; $2 delete|stop|start; $3 1|0 выйти или нет; $4 код выхода
Select Case LCase(S2)
Case "delete": SetStr="удаления"
Case "start": SetStr="запуска"
Case "stop": SetStr="остановки"
End Select
ret = net_rpc_service("status",S1,fn)
If ret = 0 Then
ret = net_rpc_service(S2,S1,fn)
If ret > 0 Then
echo_ "Ошибка "&SetStr&" сервиса "&S1,"n"
If S3 = 1 Then exit_ S4
End If
End If
End Sub
Sub SrvcVar (S1,S2,S3,S4,S5,S6,S7)
'$1 - имя файла; $2 - имя сервиса; $3 - имя сервиса отображаемое; $4 - комада запуска сервиса
'$5 - дополнительный инф. текст; $6 - 1|0 выйти или нет; $7 - код выхода
WshShell.Run "cmd /c echo 1 > """&srcdir&"\"&S1&"""",0,true
rets = smbclient( "\\"&fn&"\"&dstshare,"put",srcdir&"\"&S1,dstdir&"\"&S1)
If rets > 0 Then echo_ "Ошибка при отправке "&S1,"n" : exit_ S7
retn = net_rpc_service("status",S2,fn)
If retn = 1 Then
retn = net_rpc_service_create(S2,S3,S4,fn)
If retn > 0 Then echo_ "Не удалось зарегить сервис "&S2,"n" : exit_ S7
End If
retn = net_rpc_service("start",S2,fn)
timeout = 0
ret = 100
Do While timeout <= timemax
sleep_ "...",timestep
rets = smbclient("\\"&fn&"\"&dstshare,"get",dstdir&"\"&S1,srcdir&"\"&S1)
If rets = 0 Then Set f = fso.OpenTextFile(srcdir&"\"&S1,1,false) : ret = f.ReadLine
If RegExpTest("^0 *$", ret)=1 Then timeout = timemax
timeout = timeout + timestep
Loop
If ret = 100 Then echo_ "Ошибка при получении "&S1,"n" : exit_ S7
If ret >= 1 Then
echo_ "Ошибка запуска "&S5&" на целевом компе","n"
If S6 = 1 Then exit_ S7
End If
End Sub
' Процедуры 1-12
Sub step1()
' Проверка каталога источника, если не найден, то выход с ошибкой 1:
step_ = 1
echo_ "STEP:"&step_&" ",""
If (Not fso.FolderExists(srcdir)) Then echo_ "Каталог источник не найден","n" : ShowHelp : exit_ step_
' clearlog
echo_ "Ok","n"
End Sub
Sub step2()
' Проверка компа для серверной части, если не задан, то выход с ошибкой 2:
step_ = 2
echo_ "STEP:"&step_&" ",""
If fn = "" Then echo_ "Не указан комп.","n" : exit_ step_
echo_ "Ok","n"
End Sub
Sub step3()
' Проверка компа для серверной части, или не найден, то выход с ошибкой 3:
step_ = 3
echo_ "STEP:"&step_&" ",""
cr = TestPing(fn)
If cr <> 1 Then echo_ "Не пингуется "&fn,"n" : exit_ step_
echo_ "Ok","n"
End Sub
Sub step4()
' Проверка подключения к компу, если нет подключения, то выход с ошибкой 4:
step_ = 4
echo_ "STEP:"&step_&" ",""
ret = False
ret = fso.FolderExists("\\"&fn&"\c$\")
If ret = False Then echo_ "Подключиться не удалось","n" : exit_ step_
' Проверка каталога назначения и, при необходимости, его создание:
If (Not fso.FolderExists("\\"&fn&"\c$\"&dstdir)) Then
On Error Resume Next
Err.Clear
ret = ""
ret = fso.CreateFolder("\\"&fn&"\c$\"&dstdir)
On Error GoTo 0
If ret = "" Or Err.Number <> 0 Then echo_ "Создать каталог назначения не удалось","n" : exit_ step_
End If
echo_ "Ok","n"
End Sub
Sub step5()
' Копирование файлов и проверка результатов копирования, если были ошибки, то выход с ошибкой 5:
step_ = 5
echo_ "STEP:"&step_&" ",""
ret = 0
For Each filename in filelist
reti = 10
If (fso.FileExists(srcdir&"\"&filename)) Then
reti = 0
reti = smbclient("\\"&fn&"\"&dstshare,"put",srcdir&"\"&filename,dstdir&"\"&filename)
End If
ret = ret + reti
Next
If ret > 0 Then echo_ "Ошибка при копировании файлов: "&ret,"n" : exit_ step_
echo_ "Ok","n"
End Sub
Sub 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"
End Sub
Sub step7()
' Зарегить сервис winvnc если он еще не зареген, если не удастся зарегить, то выйти с ошибкой 7:
step_ = 7
echo_ "STEP:"&step_&" ",""
regkey = "SYSTEM\CurrentControlSet\Services"
' Вариант с удаленным запуском WinVNC.exe -install на целевом компе (промежуточный сервис winvncins)
echo_ "Подождите, идет установка",""
SrvcVar srvok,srvcnmi,srvcnmid,srvcnmie,"WinVNC.exe -install",1,step_
retn = net_rpc_registry_setvalue(HKLM,regkey&"\"&srvcnm,"Start",3,fn)
If retn > 0 Then echo_ "Не удалось сменить запуск сервиса "&srvcnm,"n" : exit_ step_
echo_ "Ok","n"
End Sub
Sub step8()
' Старотовать сервис winvnc, если не удалось, то выйти с ошибкой 8:
step_ = 8
echo_ "STEP:"&step_&" ",""
SrvSet srvcnm,"start",1,step_
sleep_ "Подождите, запускаю службу...",timewait
echo_ "Ok","n"
End Sub
Sub step9()
' Подключиться:
step_ = 9
echo_ "STEP:"&step_&" ",""
WshShell.Run HOME&"\bin\vncviewer.exe "&vncparam&" "&ff&" "&fn,5,true
echo_ "Ok","n"
End Sub
Sub step10()
' Остановить сервис winvnc:
step_ = 10
echo_ "STEP:"&step_&" ",""
SrvSet srvcnm,"stop",0,step_
sleep_ "Подождите, останавливаю службу...",timewait
echo_ "Ok","n"
End Sub
Sub step11()
' Удалить сервис winvnc, если не удастся, то выйти с ошибкой 11:
step_ = 11
echo_ "STEP:"&step_&" ",""
' Вариант с удаленным запуском WinVNC.exe -remove на целевом компе (промежуточный сервис winvncrem)
echo_ "Подождите, идет удаление",""
SrvcVar srvok,srvcnmu,srvcnmud,srvcnmue,"WinVNC.exe -remove",0,step_
If ret >= 1 Then echo_ ",пробую удалить принудительно: ","n" : SrvSet srvcnm,"delete",1,step_
echo_ "Ok","n"
End Sub
Sub step12()
' Удалить сервисы промежуточные:
step_ = 12
echo_ "STEP:"&step_&" ",""
For Each srvc in Array(srvcnmr,srvcnmi,srvcnmu)
SrvSet srvc,"delete",0,step_
Next
echo_ "Ok","n"
End Sub
Sub remdir()
' Очитсить реестр и удалить каталог, если не удалось, то выйти с ошибкой 12:
step_ = "remdir"
echo_ "STEP:"&step_&" ",""
For Each regkey in regkeys
retr = net_rpc_registry("enumerate",HKLM,regkey,fn)
If retr = 0 Then
retr = net_rpc_registry("deletekey",HKLM,regkey,fn)
If retr >= 1 Then echo_ "Ошибка очистки реестра HKLM\"®key,"n"
End If
Next
ret = fso.DeleteFolder("\\"&fn&"\c$\"&dstdir)
If ret > 0 Then echo_ "Ошибка при удалении "&dstdir,"n" : exit_ step_
echo_ "Ok","n"
End Sub
' Выполнение
Select Case LCase(fm)
Case "install":
echo_ "Выполняю установку 1-7,12:","n"
step1
step2
step3
step4
step5
step6
step7
step12
Case "remove":
echo_ "Выполняю удаление 1-4,11-12,remdir:","n"
step1
step2
step3
step4
step11
step12
remdir
Case "view":
echo_ "Подключаюсь к удаленному рабочему столу 1-3,8-10:","n"
step1
step2
step3
step8
step9
step10
Case "fast":
echo_ "Выполняю быстрый старт 1-12,remdir:","n"
step1
step2
step3
step4
step5
step6
step7
step8
step9
step10
step11
step12
remdir
End Select
@echo off rem Переменная HOME (путь, где расположены каталоги bin и share\tightvnc_srv_win32) set HOME=C:\usr cscript //Nologo %HOME%\bin\vncadmin.vbs -d %1 %2 %3 %4 %5 %6 %7 %8 pause
@echo off rem Переменная HOME (путь, где расположены каталоги bin и share\tightvnc_srv_win32) set HOME=C:\usr cscript //Nologo %HOME%\bin\vncadmin.vbs -e %1 %2 %3 %4 %5 %6 %7 %8 pause
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"Примечание: