Задача:
При попытке подключиться к удалённому рабочему столу (серверу терминалов), получаем ошибку:
Удаленный сеанс отключен из-за отсутствия доступных лицензий клиента сервера терминалов для этого компьютера. Обратитесь к администратору сервера.
См. статью Невозможно подключиться к серверу терминалов
Необходимо автоматизировать процесс удаления заданного ключа реестра и последующий запуск клиентского сеанса подключения к удаленному рабочему столу в контексте Администратора.
Решение:
-
Создаем файл с именем «MSLicensing.vbs», в который копируем VBS скрипт:
Листинг VBS скрипта:
Код: Выделить всё
' Создаем объект WScript.Shell Set objWSh = CreateObject("WScript.Shell") ' Метод удаления раздела objWSh.RegDelete не прокатывает из-за защиты системы Windows ' даже при запуске в контексте Администратора 'objWSh.RegDelete "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSLicensing\" ' Поэтому просто удаляем раздел MSLicensing из командной строки командой REG DELETE, ' не показывая окна и дожидаясь окончания выполнения команды objWSh.Run "cmd /c REG DELETE HKLM\SOFTWARE\Microsoft\MSLicensing /f", 0, true ' Ждем пару секунд WScript.Sleep 2000 ' Считываем из реестра адрес последнего RDP подключения текущего пользователя strA = objWSh.RegRead("HKCU\Software\Microsoft\Terminal Server Client\Default\MRU0") ' Запускаем сеанс RDP objWSh.Run "mstsc -v:" + strA, 1, false
Скрипт хорошо закомментирован, поэтому дополнительно его пояснять нет смысла
-
Сохраненный файл «MSLicensing.vbs» с VBS сценарием упаковываем в самораспаковывающийся SFX RAR архив с именем «MSLicensing.exe», добавляя подпись Администратора. Как это сделать читаем в статье VBS. Как перекомпилировать (конвертировать) VBS в exe - Решение 2. На вкладке «Установка» прописываем «Выполнить после распаковки» наш vsb скрипт:
Код: Выделить всё
wscript MSLicensing.vbs
.
-
Полученный в п.2 exe-файл, скомпилированный WinRAR-ом для 32-х разрядных сред выполнения, прекрасно в них работает, но в 64-х разрядных средах скрипт «не видит» раздел реестра «HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSLicensing\» и, соответственно не удаляет его. Поэтому, для 64-х разрядных сред компилируем скрипт «MSLicensing.vbs» еще раз аналогичным п.2 образом, но выбирая на вкладке «Модуль», 64-х разрядный модуль, «Default64.SFX RAR SFX с GUI для Windows x64 (рус.)» и, указывая имя SFX архива «MSLicensing_x64.exe». На вкладке «Установка» прописываем «Выполнить после распаковки» наш vsb скрипт (тот же, самый, что и в п.2, так как имя файла скрипта мы не меняли):
Код: Выделить всё
wscript MSLicensing.vbs
.
-
А для того, чтобы запускался нужный exe-файл (SFX архив), пишем еще один скрипт «MSLicensing_main.vbs», который будет проверять разрядность операционной системы:
Листинг VBS скрипта для выбора разрядности ОС:
Код: Выделить всё
' Включаем обработчик ошибок. При ошибке скрипт вылетать не будет, а будет выполняться следующая команда On Error Resume Next ' Перебираем коллекцию класса WMI Win32_ComputerSystem, предоставляющего сведения о программно-аппаратной ' конфигурации компьютера при помощи моникера "WinMgmts:" For Each objOStype in GetObject("winmgmts:").InstancesOf ("Win32_ComputerSystem") ' Получаем тип используемой системы и присваиваем его строковой переменной strOSbit strOSbit = objOStype.SystemType Next ' Создаем объект WScript.Shell Set objWSh = CreateObject("WScript.Shell") ' Если переменная strOSbit равна строке "x86-based pc" If LCase(strOSbit) = "x86-based pc" Then ' Значит у нас 32-х разрядная система и мы запускаем exe-файл скомпилированный при помощи 32-х разрядного модуля SFX WinRAR objWSh.Run "MSLicensing.exe", 0, true End If ' Если переменная strOSbit равна строке "x64-based pc" If LCase(strOSbit) = "x64-based pc" Then ' Значит у нас 64-х разрядная система и мы запускаем exe-файл скомпилированный при помощи 32-х разрядного модуля SFX WinRAR objWSh.Run "MSLicensing_x64.exe", 0, true End If
-
Теперь упаковываем в самораспаковывающийся SFX RAR архив с именем «MSLicensing_main.exe», добавляя подпись Администратора и используя 32-х разрядный SFX модуль, 3 полученных на предыдущих шагах файла:
-
«MSLicensing_main.vbs»
-
«MSLicensing.exe»
-
«MSLicensing_x64.exe»
На вкладке «Установка» прописываем «Выполнить после распаковки» наш vsb скрипт:
Код: Выделить всё
wscript MSLicensing_main.vbs
.
-
-
Запускаем полученный exe-файл на проблемных компьютерах.
Алгоритм работы этой структуры такой:
-
Запускается 32-х разрядный exe файл (SFX архив), который распаковывает во временную папку три файла:
-
«MSLicensing_main.vbs»
-
«MSLicensing.exe»
-
«MSLicensing_x64.exe»
-
-
Модуль SFX запускает только что распакованный «MSLicensing_main.vbs», который выполняет проверку разрядности операционной системы и, в зависимости от результата, запускает либо «MSLicensing.exe», либо «MSLicensing_x64.exe»
-
Запущенный exe файл (SFX архив), соответствующий разрядности ОС, распаковывает во временную папку файл VBS сценария «MSLicensing.vbs»
-
Модуль SFX запускает только что распакованный «MSLicensing.vbs», который удаляет ветку «MSLicensing» реестра и запускает сеанс RDP с адресом последнего RDP подключения текущего пользователя.
Готовый SFX RAR архив (exe - файл) можно скачать здесь:
Обратите внимание: из-за особенностей форума exe-файл пришлось еще раз упаковать в обычный rar архив. То есть exe - файл находится внутри архива rar.