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

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


Модератор: UncleFather

Аватара пользователя
UncleFather
Site Admin
Сообщения: 1503
Зарегистрирован: 17 авг 2004 16:20, Вт
Контактная информация:

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

Сообщение UncleFather »

Задача:

При попытке подключиться к удалённому рабочему столу (серверу терминалов), получаем ошибку:

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

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

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


Решение:

  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 КБ) 394 скачивания

Обратите внимание: из-за особенностей форума exe-файл пришлось еще раз упаковать в обычный rar архив. То есть exe - файл находится внутри архива rar.


Alexander A. Manaeff©

Понравилась статья? Будем крайне признательны за репосты в соцсетях! Материально поддержать проект можно здесь

Мои странички:
ВКонтакте
Одноклассники
Youtube
Facebook
Instagram

Изображение
Изображение
Изображение
Изображение