UncleFather » 01 июл 2016 08:20, Пт
Задача:
При попытке подключиться к удалённому рабочему столу (серверу терминалов), получаем ошибку:
Удаленный сеанс отключен из-за отсутствия доступных лицензий клиента сервера терминалов для этого компьютера. Обратитесь к администратору сервера.
См. статью Невозможно подключиться к серверу терминалов
Необходимо автоматизировать процесс удаления заданного ключа реестра и последующий запуск клиентского сеанса подключения к удаленному рабочему столу в контексте Администратора.
Решение:
-
Создаем файл с именем «MSLicensing.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 скрипт:
.
-
Полученный в п.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, так как имя файла скрипта мы не меняли):
.
-
А для того, чтобы запускался нужный exe-файл (SFX архив), пишем еще один скрипт «MSLicensing_main.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 скрипт:
.
-
Запускаем полученный 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.
[b][size=150]Задача:[/size][/b]
При попытке подключиться к удалённому рабочему столу (серверу терминалов), получаем ошибку: [quote]Удаленный сеанс отключен из-за отсутствия доступных лицензий клиента сервера терминалов для этого компьютера. Обратитесь к администратору сервера.[/quote]
См. статью [url=http://manaeff.ru/forum/viewtopic.php?p=1206#p1206]Невозможно подключиться к серверу терминалов[/url]
Необходимо автоматизировать процесс удаления заданного ключа реестра и последующий запуск клиентского сеанса подключения к удаленному рабочему столу в контексте Администратора.
[hr][/hr]
[b][size=150]Решение:[/size][/b]
[list=1][*] Создаем файл с именем «[b][i]MSLicensing.vbs[/i][/b]», в который копируем VBS скрипт:
[spoiler title=Листинг VBS скрипта:][code]' Создаем объект 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 [/code][/spoiler]
Скрипт хорошо закомментирован, поэтому дополнительно его пояснять нет смысла
[*] Сохраненный файл «[b][i]MSLicensing.vbs[/i][/b]» с VBS сценарием упаковываем в самораспаковывающийся SFX RAR архив с именем «[b][i]MSLicensing.exe[/i][/b]», [b]добавляя подпись Администратора[/b]. Как это сделать читаем в статье [url=http://manaeff.ru/forum/viewtopic.php?p=1901#p1901]VBS. Как перекомпилировать (конвертировать) VBS в exe[/url] - [b]Решение 2[/b]. На вкладке «[b][i]Установка[/i][/b]» прописываем «[b][i]Выполнить после распаковки[/i][/b]» наш vsb скрипт:
[code]wscript MSLicensing.vbs[/code].
[*] Полученный в п.2 exe-файл, скомпилированный WinRAR-ом для 32-х разрядных сред выполнения, прекрасно в них работает, но в 64-х разрядных средах скрипт «не видит» раздел реестра «[b][i]HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSLicensing\[/i][/b]» и, соответственно не удаляет его. Поэтому, для 64-х разрядных сред компилируем скрипт «[b][i]MSLicensing.vbs[/i][/b]» еще раз аналогичным п.2 образом, но выбирая на вкладке «[b][i]Модуль[/i][/b]», 64-х разрядный модуль, «[b][i]Default64.SFX RAR SFX с GUI для Windows x64 (рус.)[/i][/b]» и, указывая имя SFX архива «[b][i]MSLicensing_x64.exe[/i][/b]». На вкладке «[b][i]Установка[/i][/b]» прописываем «[b][i]Выполнить после распаковки[/i][/b]» наш vsb скрипт (тот же, самый, что и в п.2, так как имя файла скрипта мы не меняли):
[code]wscript MSLicensing.vbs[/code].
[*] А для того, чтобы запускался нужный exe-файл (SFX архив), пишем еще один скрипт «[b][i]MSLicensing_main.vbs[/i][/b]», который будет проверять разрядность операционной системы:
[spoiler title=Листинг VBS скрипта для выбора разрядности ОС:][code]' Включаем обработчик ошибок. При ошибке скрипт вылетать не будет, а будет выполняться следующая команда
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
[/code][/spoiler]
[*] Теперь упаковываем в самораспаковывающийся SFX RAR архив с именем «[b][i]MSLicensing_main.exe[/i][/b]», [b]добавляя подпись Администратора[/b] и используя 32-х разрядный SFX модуль, 3 полученных на предыдущих шагах файла:
[list][*] «[b][i]MSLicensing_main.vbs[/i][/b]»
[*] «[b][i]MSLicensing.exe[/i][/b]»
[*] «[b][i]MSLicensing_x64.exe[/i][/b]»[/list]
На вкладке «[b][i]Установка[/i][/b]» прописываем «[b][i]Выполнить после распаковки[/i][/b]» наш vsb скрипт:
[code]wscript MSLicensing_main.vbs[/code].
[*] Запускаем полученный exe-файл на проблемных компьютерах.[/list]
Алгоритм работы этой структуры такой:
[list=1][*] Запускается 32-х разрядный exe файл (SFX архив), который распаковывает во временную папку три файла:
[list][*] «[b][i]MSLicensing_main.vbs[/i][/b]»
[*] «[b][i]MSLicensing.exe[/i][/b]»
[*] «[b][i]MSLicensing_x64.exe[/i][/b]»[/list]
[*] Модуль SFX запускает только что распакованный «[b][i]MSLicensing_main.vbs[/i][/b]», который выполняет проверку разрядности операционной системы и, в зависимости от результата, запускает либо «[b][i]MSLicensing.exe[/i][/b]», либо «[b][i]MSLicensing_x64.exe[/i][/b]»
[*] Запущенный exe файл (SFX архив), соответствующий разрядности ОС, распаковывает во временную папку файл VBS сценария «[b][i]MSLicensing.vbs[/i][/b]»
[*] Модуль SFX запускает только что распакованный «[b][i]MSLicensing.vbs[/i][/b]», который удаляет ветку «[b][i]MSLicensing[/i][/b]» реестра и запускает сеанс RDP с адресом последнего RDP подключения текущего пользователя.[/list]
Готовый SFX RAR архив (exe - файл) можно скачать здесь:[attachment=0]MSLicensing.rar[/attachment]
[b][color=#00FF00]Обратите внимание:[/color][/b] из-за особенностей форума exe-файл пришлось еще раз упаковать в обычный rar архив. То есть exe - файл находится внутри архива rar.