На первый взгляд задача не очень сложная. Запуск из 1С другого приложения возможен, надо просто передать в параметрах запуска путь к файлу с настроенным подключением. Создать файл подключения *.rdp, добавить в него сохраненный пароль и запустить. Но на деле начинаются появляться нюансы.
Немного погуглив нашел несколько статей, из которых стало понятно, что пароль шифруется с помощью функции CryptProtectData из библиотеки crypt32.dll и записывается в соответствующий параметр файла *.rdp. Нашлись и инструменты для выполнения этой задачи.
Примерный код запуска из 1С выглядит так:
ЗапуститьПриложение(СтрокаКоманды, [ТекущийКаталог], [ДождатьсяЗавершения], [КодВозврата])
Ок. Вроде работает.
Оказалось есть проблема при подключении к серверам где политиками безопасности запрещено подключение с сохраненным паролем. Если запустить приложение mstsc.exe с параметром запуска указывающим на файл *.rdp с сохраненным паролем, то все равно появится запрос на ввод пароля.
Что делать? (Вопрос риторический).
Внешнюю компоненту. Которая сделает все за вас :)
И так, ТЗ.
Создать внешнюю компоненту 1С, для выполнения следующих задач:
1. Запуск подключения по RDP.
2. Не предоставлять пользователю пароль подключения.
3. Автоматический ввод пароля при появлении окна запроса.
4. Подавление дополнительных окон запросов. (выяснилось в процессе).
5. Выполнение кодирования/декодирования строки с паролем для сохранения в базе данных.
Задача есть, приступаем к выполнению ...
(some time passed)
ВК.
Имеет следующие методы:
ПодключитьУРС(srv, dmn, usr, psw, gwrdp, plg) (ConnectRD(srv, dmn, usr, psw, gwrdp, plg)) - Запуск RDP подключения.
Параметры запуска:
srv - адрес сервера. Обязательный параметр.
dmn - Домен пользователя.
usr - Имя пользователя. Обязательный параметр.
psw - Пароль (зашифрованный методом Кодировать ). Обязательный параметр.
gwrdp - адрес шлюза RDP.
plg - набор коллекции (функция RD Connection Broker Load Balancing, которая позволяет при подключении пользователя к ферме перенаправить его на наименее загруженный сервер фермы. Строка в формате: "tsv://MS Terminal Services Plugin.1.Development". Параметр в файле: loadbalanceinfo:s:)
Кодировать (Encode) - Шифрование строки с паролем. Для сохранения в 1С.
Декодировать (Decode) - Обратный процесс шифрования. В работе не используется. Но можно восстановить зашифрованный пароль
ПолучитьОшибку(GetLastError) - Получение номера и описания последней возникшей ошибки.
Приступаем к реализации в 1С.
Добавим универсальности в наш "проект". Создадим расширение конфигурации, в котором реализуем весь функционал.
На выходе получили расширение со следующими объектами
Общий макет - RDPClient_Макет, в который загрузили нашу внешнюю компоненту.
Справочник - RDPClient_Клиенты, в нем будем хранить настройки подключений. Справочник привязали к справочнику контрагентов.
Тут надо бы внести некоторую ясность. Пароль не сохраняется в безе в открытом виде. А вместо пароля сохраняется его Шифр, подготовленный компонентой. При подключении в компоненту передается Шифр. Таким образом пользователь не видит реального пароля.
И сама обработка подключения - RDPClient_Connect.
Теперь немного о процессе подключения, который был реализован в компоненте.
Запуская процесс подключения, компонента подготавливает RDP файл во временной папке и запускает процесс MSTSC.EXE с параметром указывающим на путь к файлу и удаляет файл после запуска. Если сервер принимает подключения с сохраненным паролем, то процесс без запросов продолжается. Если же сервер попросит ввести пароль, то компонента сама введет его в окно и продолжит запуск соединения.
Вот, пожалуй, и все. За предоставленное расширение прошу строго не судить, делалось только для примера использования.
Тестировалось на ERP и УНФ. При установке расширения, возможно, потребуется указать соответствие справочника Контрагенты. Думаю, заработает и в других конфигурациях, где есть справочник Контрагенты.
Проверено на следующих конфигурациях и релизах:
- 1С:ERP Управление предприятием 2, релизы 2.5.11.56