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"Примечание: