Alexander A Manaeff -

 
 

VBS. Боремся с ошибкой при подключении к серверу терминалов

Здесь обсуждаются вопросы по программированию на Visual Basic.

Модератор: UncleFather

VBS. Боремся с ошибкой при подключении к серверу терминалов

Сообщение UncleFather » 01 июл 2016 08:20, Пт

Задача:

При попытке подключиться к удалённому рабочему столу (серверу терминалов), получаем ошибку:
Удаленный сеанс отключен из-за отсутствия доступных лицензий клиента сервера терминалов для этого компьютера. Обратитесь к администратору сервера.

См. статью Невозможно подключиться к серверу терминалов

Необходимо автоматизировать процесс удаления заданного ключа реестра и последующий запуск клиентского сеанса подключения к удаленному рабочему столу в контексте Администратора.




Решение:


  1. Создаем файл с именем «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

    Скрипт хорошо закомментирован, поэтому дополнительно его пояснять нет смысла

  2. Сохраненный файл «MSLicensing.vbs» с VBS сценарием упаковываем в самораспаковывающийся SFX RAR архив с именем «MSLicensing.exe», добавляя подпись Администратора. Как это сделать читаем в статье VBS. Как перекомпилировать (конвертировать) VBS в exe - Решение 2. На вкладке «Установка» прописываем «Выполнить после распаковки» наш vsb скрипт:
    Код: Выделить всё
    wscript MSLicensing.vbs
    .

  3. Полученный в п.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
    .

  4. А для того, чтобы запускался нужный 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


  5. Теперь упаковываем в самораспаковывающийся SFX RAR архив с именем «MSLicensing_main.exe», добавляя подпись Администратора и используя 32-х разрядный SFX модуль, 3 полученных на предыдущих шагах файла:
    • «MSLicensing_main.vbs»
    • «MSLicensing.exe»
    • «MSLicensing_x64.exe»
    На вкладке «Установка» прописываем «Выполнить после распаковки» наш vsb скрипт:
    Код: Выделить всё
    wscript MSLicensing_main.vbs
    .

  6. Запускаем полученный exe-файл на проблемных компьютерах.


Алгоритм работы этой структуры такой:
  1. Запускается 32-х разрядный exe файл (SFX архив), который распаковывает во временную папку три файла:
    • «MSLicensing_main.vbs»
    • «MSLicensing.exe»
    • «MSLicensing_x64.exe»
  2. Модуль SFX запускает только что распакованный «MSLicensing_main.vbs», который выполняет проверку разрядности операционной системы и, в зависимости от результата, запускает либо «MSLicensing.exe», либо «MSLicensing_x64.exe»
  3. Запущенный exe файл (SFX архив), соответствующий разрядности ОС, распаковывает во временную папку файл VBS сценария «MSLicensing.vbs»
  4. Модуль SFX запускает только что распакованный «MSLicensing.vbs», который удаляет ветку «MSLicensing» реестра и запускает сеанс RDP с адресом последнего RDP подключения текущего пользователя.


Готовый SFX RAR архив (exe - файл) можно скачать здесь:
MSLicensing.rar
(702.04 КБ) Скачиваний: 99

Обратите внимание: из-за особенностей форума exe-файл пришлось еще раз упаковать в обычный rar архив. То есть exe - файл находится внутри архива rar.
Аватара пользователя
UncleFather
Site Admin
 
Сообщения: 1325
Зарегистрирован: 17 авг 2004 16:20, Вт

Вернуться в Visual Basic

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

Alexander A Manaeff -
@Mail.ru .