Соединение с агентом сервера.RegSecurityProfileAddIn

Методы · RegSecurityProfileAddIn

Выполняет регистрацию нового разрешенного внешнего компонента или обновляет существующий.

Синтаксис

RegSecurityProfileAddIn(<Кластер>, <ИмяПрофиля>, <ВнешнийКомпонент>)
Полное описание, параметры и ограничения

Соединение с агентом сервера.RegSecurityProfileAddIn (IServerAgentConnection.RegSecurityProfileAddIn)

Соединение с агентом сервера (IServerAgentConnection)

RegSecurityProfileAddIn (RegSecurityProfileAddIn)

Доступен, начиная с версии 8.3.3.

Синтаксис:
RegSecurityProfileAddIn(<Кластер>, <ИмяПрофиля>, <ВнешнийКомпонент>)
Параметры:

<Кластер> (обязательный)
Тип: Кластер серверов.
Кластер, в котором должен быть зарегистрирован внешний компонент.

<ИмяПрофиля> (обязательный)
Тип: Строка.
Имя профиля безопасности.

<ВнешнийКомпонент> (обязательный)
Тип: Внешний компонент.
Регистрируемый внешний компонент.
Описание:

Выполняет регистрацию нового разрешенного внешнего компонента или обновляет существующий.

Доступность:

Интеграция.

Примечание:
Если внешний компонент с заданным именем существует, то выполняется обновление, в противном случае - добавление.
Если профиль не найден, генерируется исключение.
Использование в версии:

Доступен, начиная с версии 8.3.3.

Методическая информация

Практические примеры

Зарегистрировать собственное разрешение: Внешний компонент, прочитать и явно удалить только его

Полный жизненный цикл реального описания из своего подготовленного шаблона в новом unused-профиле; никаких вымышленных CLSID, хешей или выполнения ресурса.

Где и как запускать

Полный серверный общий модуль УчебныйCOM85 и полный модуль управляемой формы в отдельной файловой учебной ИБ. Свой Windows-агент/RAS, точная платформа8.5.1.1343; перечисленные записи являются только авторским учебным кодом, фактических запусков0.

Подготовка

  1. Работайте только в новой отдельной Windows-VM без рабочих процессов/кластеров. Установленная платформа и заранее зарегистрированный V85.COMConnector должны быть8.5.1.1343 соответствующей разрядности. Регистрацию COM и запуск служб этот BSL не выполняет.

  2. Создайте отдельную файловую ИБ с именем конфигурации УчебныйЖизненныйЦиклCOM85: без данных, каталогов, документов, регистров, подписок, фоновых заданий и расширений. В ней создайте общий модуль УчебныйCOM85: Сервер=Истина, ВызовСервера=Истина, Глобальный=Ложь, Клиент/ВнешнееСоединение=Ложь. Вставьте полностью код одного урока, не смешивайте одинаковые функции разных уроков.

  3. Создайте обработку и управляемую форму с командой Выполнить и полным модулем формы из дополнительного блока. Строковые реквизиты: Операция, ИмяАгента, ПарольАгента, ИмяАдминистратора, ПарольАдминистратора, UUIDОпыта, UUIDКластера, Дополнительно; числовые ПортАгента, ПортRAS, ПортКластера; булевый ПодтвержденСвойСтенд. Поля всех паролей и Дополнительно переведите в режим пароля, значения не сохраняйте в настройках.

  4. В своей VM вручную поднимите один отдельный ragent и один ras с отдельным новым каталогом реестров. RAS должен обслуживать именно этот агент, а не другой локальный сервис. Из реально выбранных администратором свободных портов впишите три разные величины: agent-port для ConnectAgent, ras-port для АдминистрированиеСервера, manager-port для своего кластера. Не подставляйте1545 в ConnectAgent.

  5. До первого создания кластера вручную удалите только автоматически созданный пустой кластер своей новой VM, если он появился. Консоль должна показывать0кластеров; никакие чужие кластеры не допускаются. Первый урок также проверяет нулевой список обоими интерфейсами до RegCluster.

  6. Заведите постоянного своего администратора агента и после создания кластера постоянного своего администратора кластера через консоль. Их реальные новые учебные пароли передавайте форме; учебные временные администраторы в уроке никогда не заменяют постоянных.

  7. Один раз самостоятельно получите UUIDОпыта в своей файловой ИБ выражением Строка(Новый УникальныйИдентификатор), сохраните текст в собственном журнале опыта. Имя кластера: own-com85-cluster-<UUIDОпыта>. После создания сохраните фактический RAS UUIDКластера из результата; имя не заменяет UUID.

  8. Читающая команда Каталог85 не равна доказательству отсутствия production. Изоляция VM и новый реестр обязательны до любого подключения. COM не предоставляет UUID в интерфейсе IClusterInfo: пример сопоставляет его с прочитанным UUID RAS по sole-кластеру, точным loopback/имени/порту.

  9. Запись/применение/отмена регистрации выполняются только отдельной явно выбранной строкой Операция. Не добавляйте автоматические повторы, очистку при исключении или откат чужого состояния. В случае частичного выполнения сохраните UUID и сначала прочитайте фактическое состояние.

  10. Пароли очищаются из реквизитов и локальной структуры, но это не гарантирует стирания строк из памяти. Не выводите ОписаниеОшибки, строки подключения, Password или аргументы операций. Код статически проверяется здесь, но COM/RAS/1С, сеть и процессы не запускались.

  11. Через консоль собственной VM подготовьте unused-профиль own-com85-template-<UUIDОпыта>, Descr=owned-com85-lifecycle:<UUIDОпыта>. Ни одной ИБ он не назначен, ИБ в кластере0. FileSystemFullAccess, COMFullAccess, AddInFullAccess, ExternalAppFullAccess, InternetFullAccess, UnSafeExternalModuleFullAccess, FullPrivilegedMode, CryptographyAllowed, SafeModeProfile должны бытьЛожь.

  12. Для этого урока в шаблоне нужен ровно один собственный ресурс с ключом own-com85-template и тем жеDescr. Подготовьте реальные значения по следующему пункту, не копируйте неизвестные ресурсы рабочего профиля.

  13. Операции: СоздатьРесурс85 создает новый UUID-профиль и разрешение, Каталог85 читает свой результат, УдалитьРесурс85 отдельно снимает регистрацию. После ошибки создания сначала каталог/удаление, не повторная регистрация.

  14. Используйте только собственноручно собранный учебный NativeAPI-компонент либо доверенный официальный SDK-образец, который вы отдельно проверили и поместили в свой каталог VM. Его действительную SHA-1/base64 зарегистрируйте консолью в шаблонном профиле Name=own-com85-template, AddInHash=фактическая сумма. Не скачивайте и не подключайте случайную DLL ради непустого примера. Если такого собственного артефакта нет, сначала подготовьте его, а не подставляйте фиктивный хеш.

Функция Выполнить85(Операция, Данные, Подтверждение) Экспорт
    Если СтрРазделить("СоздатьРесурс85,Каталог85,УдалитьРесурс85", ",").Найти(Операция) = Неопределено Тогда
        ВызватьИсключение "Неизвестная отдельная операция собственного разрешения";
    КонецЕсли;
    Связь = СоединитьсяСоСвоимАгентом85(Данные, Подтверждение);
    Стенд = ПолучитьСвойКластер85(Связь, Данные);
    ИмяШаблона = "own-com85-template-" + Данные.UUIDОпыта;
    ИмяПрофиля = "own-com85-profile-add-in-" + Данные.UUIDОпыта;
    Маркер = "owned-com85-lifecycle:" + Данные.UUIDОпыта;
    КлючРесурса = "own-com85-add-in-" + Данные.UUIDОпыта;
    Шаблон = НайтиСвойПрофиль85(Связь.Агент, Стенд.COM, ИмяШаблона, Маркер);
    Если Шаблон = Неопределено Тогда
        ВызватьИсключение "Подготовьте свой unused-профиль-шаблон с реальными ресурсами";
    КонецЕсли;
    Профиль = НайтиСвойПрофиль85(Связь.Агент, Стенд.COM, ИмяПрофиля, Маркер);
    Если Операция = "СоздатьРесурс85" Тогда
        Если Профиль <> Неопределено Тогда
            ВызватьИсключение "Не перезаписывайте существующий или частично созданный собственный профиль";
        КонецЕсли;
        Образец = Неопределено;
        Для Каждого Кандидат Из Связь.Агент.GetSecurityProfileAddIns(Стенд.COM, ИмяШаблона) Цикл
            Если Кандидат.Name = "own-com85-template" Тогда
                Если Образец <> Неопределено Или Кандидат.Descr <> Маркер Тогда
                    ВызватьИсключение "Свой настоящий шаблон не выбран однозначно";
                КонецЕсли;
                Образец = Кандидат;
            КонецЕсли;
        КонецЦикла;
        Если Образец = Неопределено Тогда
            ВызватьИсключение "Нужен фактически зарегистрированный собственный шаблон этого типа";
        КонецЕсли;
    ПроверитьХеш85(Образец.AddInHash);
        Профиль = Связь.Агент.CreateSecurityProfile();
        Профиль.Name = ИмяПрофиля;
        Профиль.Descr = Маркер;
        Профиль.FileSystemFullAccess = Ложь;
        Профиль.COMFullAccess = Ложь;
        Профиль.AddInFullAccess = Ложь;
        Профиль.ExternalAppFullAccess = Ложь;
        Профиль.InternetFullAccess = Ложь;
        Профиль.UnSafeExternalModuleFullAccess = Ложь;
        Профиль.FullPrivilegedMode = Ложь;
        Профиль.CryptographyAllowed = Ложь;
        Профиль.SafeModeProfile = Ложь;
        Связь.Агент.RegSecurityProfile(Стенд.COM, Профиль);
        Профиль = НайтиСвойПрофиль85(Связь.Агент, Стенд.COM, ИмяПрофиля, Маркер);
        Если Профиль = Неопределено Тогда
            ВызватьИсключение "Регистрация собственного unused-профиля не подтверждена";
        КонецЕсли;
        Ресурс = Связь.Агент.CreateSecurityProfileAddIn();
        Ресурс.Name = КлючРесурса;
        Ресурс.Descr = Маркер;
        Ресурс.AddInHash = Образец.AddInHash;
        Связь.Агент.RegSecurityProfileAddIn(Стенд.COM, ИмяПрофиля, Ресурс);
        Прочитанный = НайтиСвойРесурс85(Связь.Агент, Стенд.COM, ИмяПрофиля, КлючРесурса, Маркер);
        Если Прочитанный = Неопределено Тогда
            ВызватьИсключение "Собственное разрешение не подтверждено повторным чтением";
        КонецЕсли;
        Если Прочитанный.AddInHash <> Ресурс.AddInHash Тогда
            ВызватьИсключение "Фактическое поле AddInHash своего ресурса отличается";
        КонецЕсли;
        Возврат "Создан только own-unused-профиль и один собственный ресурс; назначения ИБ и исполнения нет";
    КонецЕсли;
    Если Профиль = Неопределено Тогда
        Возврат "Собственный новый профиль отсутствует; исходный шаблон не менялся";
    КонецЕсли;
    Ресурс = НайтиСвойРесурс85(Связь.Агент, Стенд.COM, ИмяПрофиля, КлючРесурса, Маркер);
    Если Операция = "Каталог85" Тогда
        Возврат СтрШаблон("Свой unused-профиль=%1; свое разрешение=%2; ИБ=0", ИмяПрофиля, Ресурс <> Неопределено);
    КонецЕсли;
    Если Ресурс <> Неопределено Тогда
        Связь.Агент.UnregSecurityProfileAddIn(Стенд.COM, ИмяПрофиля, КлючРесурса);
        Если НайтиСвойРесурс85(Связь.Агент, Стенд.COM, ИмяПрофиля, КлючРесурса, Маркер) <> Неопределено Тогда
            ВызватьИсключение "Отмена своего разрешения не подтверждена";
        КонецЕсли;
    КонецЕсли;
    Если Связь.Агент.GetSecurityProfileVirtualDirectories(Стенд.COM, ИмяПрофиля).Количество() <> 0 Тогда
        ВызватьИсключение "В собственном профиле появились иные ресурсы: каскадное удаление запрещено";
    КонецЕсли;
    Если Связь.Агент.GetSecurityProfileCOMClasses(Стенд.COM, ИмяПрофиля).Количество() <> 0 Тогда
        ВызватьИсключение "В собственном профиле появились иные ресурсы: каскадное удаление запрещено";
    КонецЕсли;
    Если Связь.Агент.GetSecurityProfileInternetResources(Стенд.COM, ИмяПрофиля).Количество() <> 0 Тогда
        ВызватьИсключение "В собственном профиле появились иные ресурсы: каскадное удаление запрещено";
    КонецЕсли;
    Если Связь.Агент.GetSecurityProfileUnSafeExternalModules(Стенд.COM, ИмяПрофиля).Количество() <> 0 Тогда
        ВызватьИсключение "В собственном профиле появились иные ресурсы: каскадное удаление запрещено";
    КонецЕсли;
    Если Связь.Агент.GetSecurityProfileAddIns(Стенд.COM, ИмяПрофиля).Количество() <> 0 Тогда
        ВызватьИсключение "В собственном профиле появились иные ресурсы: каскадное удаление запрещено";
    КонецЕсли;
    Если Связь.Агент.GetSecurityProfileApplications(Стенд.COM, ИмяПрофиля).Количество() <> 0 Тогда
        ВызватьИсключение "В собственном профиле появились иные ресурсы: каскадное удаление запрещено";
    КонецЕсли;
    Связь.Агент.UnregSecurityProfile(Стенд.COM, ИмяПрофиля);
    Если НайтиСвойПрофиль85(Связь.Агент, Стенд.COM, ИмяПрофиля, Маркер) <> Неопределено Тогда
        ВызватьИсключение "Отмена регистрации пустого собственного профиля не подтверждена";
    КонецЕсли;
    Возврат "Снята только регистрация своего ресурса и пустого own-профиля; шаблон, файлы и приложения не менялись";
КонецФункции

Функция СоединитьсяСоСвоимАгентом85(Данные, Подтверждение)
    ПроверитьСвойПустойСтенд();
    Если ТипЗнч(Подтверждение) <> Тип("Булево") Или Не Подтверждение Тогда
        ВызватьИсключение "Подтвердите отдельную собственную VM без рабочих кластеров";
    КонецЕсли;
    Для Каждого Поле Из СтрРазделить("ПортАгента,ПортRAS,ПортКластера", ",") Цикл
        Порт = Данные[Поле];
        Если ТипЗнч(Порт) <> Тип("Число") Тогда
            ВызватьИсключение "Порт своего процесса должен быть числом";
        КонецЕсли;
        Если Порт < 1 Или Порт > 65535 Или Порт <> Цел(Порт) Тогда
            ВызватьИсключение "Недопустимый фактический порт";
        КонецЕсли;
    КонецЦикла;
    Если Данные.ПортАгента = Данные.ПортRAS Или Данные.ПортАгента = Данные.ПортКластера
        Или Данные.ПортRAS = Данные.ПортКластера Тогда
        ВызватьИсключение "Порты агента, менеджера кластера и ras различаются";
    КонецЕсли;
    Для Каждого Поле Из СтрРазделить("ИмяАгента,ПарольАгента,ИмяАдминистратора,ПарольАдминистратора,UUIDОпыта,UUIDКластера,Дополнительно", ",") Цикл
        Если ТипЗнч(Данные[Поле]) <> Тип("Строка") Тогда
            ВызватьИсключение "Имена, пароли и UUID должны быть строками";
        КонецЕсли;
    КонецЦикла;
    ПроверитьUUID85(Данные.UUIDОпыта);
    СерверRAS = Новый АдминистрированиеСервера("127.0.0.1", Данные.ПортRAS);
    СерверRAS.ВыполнитьАутентификацию(Данные.ПарольАгента, Данные.ИмяАгента);
    Если СерверRAS.ПолучитьВерсию() <> "8.5.1.1343" Тогда
        ВызватьИсключение "RAS обязан обслуживать ровно собственный агент8.5.1.1343";
    КонецЕсли;
    Соединитель = Новый COMОбъект("V85.COMConnector");
    Агент = Соединитель.ConnectAgent("127.0.0.1:" + Формат(Данные.ПортАгента, "ЧГ=0"));
    Агент.AuthenticateAgent(Данные.ИмяАгента, Данные.ПарольАгента);
    Возврат Новый Структура("Агент,RAS,Соединитель", Агент, СерверRAS, Соединитель);
КонецФункции

Процедура ПроверитьUUID85(UUID)
    Проверенный = Новый УникальныйИдентификатор(UUID);
    Если UUID <> Строка(Проверенный) Или UUID = "00000000-0000-0000-0000-000000000000" Тогда
        ВызватьИсключение "Введите канонический собственный ненулевой UUID";
    КонецЕсли;
КонецПроцедуры

Функция ПолучитьСвойКластер85(Связь, Данные, РазрешенаСвояБаза = Ложь)
    ПроверитьUUID85(Данные.UUIDКластера);
    КластерыRAS = Связь.RAS.ПолучитьКластеры();
    Если КластерыRAS.Количество() <> 1 Тогда
        ВызватьИсключение "В агенте должен быть только один собственный кластер";
    КонецЕсли;
    КластерRAS = КластерыRAS[0];
    ИмяКластера = "own-com85-cluster-" + Данные.UUIDОпыта;
    Если Строка(КластерRAS.ИдентификаторКластера) <> Данные.UUIDКластера
        Или КластерRAS.Имя <> ИмяКластера Или КластерRAS.Порт <> Данные.ПортКластера
        Или КластерRAS.ИмяКомпьютера <> "127.0.0.1" Тогда
        ВызватьИсключение "RAS UUID, имя, loopback или порт своего кластера не совпали";
    КонецЕсли;
    КластерRAS.ВыполнитьАутентификацию(Данные.ИмяАдминистратора, Данные.ПарольАдминистратора);
    БазыRAS = КластерRAS.ПолучитьИнформационныеБазы();
    Если Не РазрешенаСвояБаза И БазыRAS.Количество() <> 0 Тогда
        ВызватьИсключение "Этот урок требует полностью пустой кластер";
    КонецЕсли;
    Если РазрешенаСвояБаза Тогда
        Если БазыRAS.Количество() <> 1 Тогда
            ВызватьИсключение "Разрешена только одна специально подготовленная собственная ИБ";
        КонецЕсли;
        Если БазыRAS[0].Имя <> "own-com85-base-" + Данные.UUIDОпыта
            Или (БазыRAS[0].Описание <> "owned-com85-lifecycle:" + Данные.UUIDОпыта
                И БазыRAS[0].Описание <> "owned-com85-lifecycle:" + Данные.UUIDОпыта + ":checked") Тогда
            ВызватьИсключение "Чужая ИБ или неверный маркер собственного стенда";
        КонецЕсли;
    КонецЕсли;
    КластерыCOM = Связь.Агент.GetClusters();
    Если КластерыCOM.Количество() <> 1 Тогда
        ВызватьИсключение "COM и RAS должны видеть один и тот же sole кластер";
    КонецЕсли;
    Кластер = КластерыCOM.Получить(0);
    Если Кластер.ClusterName <> КластерRAS.Имя Или Кластер.HostName <> КластерRAS.ИмяКомпьютера
        Или Кластер.MainPort <> КластерRAS.Порт Тогда
        ВызватьИсключение "Нельзя сопоставить COM-описание с собственным RAS UUID";
    КонецЕсли;
    Связь.Агент.Authenticate(Кластер, Данные.ИмяАдминистратора, Данные.ПарольАдминистратора);
    БазыCOM = Связь.Агент.GetInfoBases(Кластер);
    Если БазыCOM.Количество() <> БазыRAS.Количество() Тогда
        ВызватьИсключение "Состояние собственных ИБ изменилось между чтениями";
    КонецЕсли;
    Основных = 0;
    Вторичных = 0;
    Для Каждого Рабочий Из КластерRAS.ПолучитьРабочиеСерверы() Цикл
        Если Рабочий.ИмяКомпьютера <> "127.0.0.1" Тогда
            ВызватьИсключение "В своём UUID-кластере появился нелокальный рабочий сервер";
        КонецЕсли;
        Если Рабочий.ЦентральныйСервер И Рабочий.Порт = Данные.ПортАгента Тогда
            Основных = Основных + 1;
        ИначеЕсли Не Рабочий.ЦентральныйСервер И Рабочий.Имя = "own-com85-worker-" + Данные.UUIDОпыта
            И Рабочий.Порт <> Данные.ПортАгента Тогда
            Вторичных = Вторичных + 1;
        Иначе
            ВызватьИсключение "Разрешены только собственные основной и UUID-вторичный рабочие серверы";
        КонецЕсли;
    КонецЦикла;
    Если Основных <> 1 Или Вторичных > 1 Тогда
        ВызватьИсключение "Own-топология рабочего стенда изменилась";
    КонецЕсли;
    Возврат Новый Структура("COM,RAS,БазыCOM,БазыRAS", Кластер, КластерRAS, БазыCOM, БазыRAS);
КонецФункции
Процедура ПроверитьСвойПустойСтенд()
    Если Метаданные.Справочники.Количество() <> 0 Или Метаданные.Документы.Количество() <> 0 Или Метаданные.Перечисления.Количество() <> 0 Или Метаданные.РегистрыСведений.Количество() <> 0 Или Метаданные.РегистрыНакопления.Количество() <> 0 Или Метаданные.РегистрыБухгалтерии.Количество() <> 0 Или Метаданные.РегистрыРасчета.Количество() <> 0 Или Метаданные.ПланыВидовХарактеристик.Количество() <> 0 Или Метаданные.ПланыВидовРасчета.Количество() <> 0 Или Метаданные.ПланыСчетов.Количество() <> 0 Или Метаданные.ПланыОбмена.Количество() <> 0 Или Метаданные.Последовательности.Количество() <> 0 Или Метаданные.БизнесПроцессы.Количество() <> 0 Или Метаданные.Задачи.Количество() <> 0 Или Метаданные.ОбщиеРеквизиты.Количество() <> 0 Или Метаданные.ПодпискиНаСобытия.Количество() <> 0 Или Метаданные.РегламентныеЗадания.Количество() <> 0 Или Метаданные.ВнешниеИсточникиДанных.Количество() <> 0 Тогда
        ВызватьИсключение "Нужен только свой новый пустой учебный стенд";
    КонецЕсли;
    Если Метаданные.ЕстьИзмененияРасширениямиКонфигурации() Тогда
        ВызватьИсключение "Свой сеанс не должен изменяться расширениями";
    КонецЕсли;
    Источники = Новый Массив;
    Источники.Добавить(ИсточникРасширенийКонфигурации.БазаДанных);
    Источники.Добавить(ИсточникРасширенийКонфигурации.СеансАктивные);
    Источники.Добавить(ИсточникРасширенийКонфигурации.СеансОтключенные);
    Для Каждого Источник Из Источники Цикл
        Расширения = РасширенияКонфигурации.Получить(, Источник);
        Если ТипЗнч(Расширения) <> Тип("Массив") Тогда
            ВызватьИсключение "Native список расширений должен иметь тип Массив";
        КонецЕсли;
        Если Расширения.Количество() <> 0 Тогда
            ВызватьИсключение "В своём новом стенде нет расширений базы или сеанса";
        КонецЕсли;
    КонецЦикла;
    Если ТранзакцияАктивна() Тогда
        ВызватьИсключение "Чужая или вложенная активная транзакция не допускается";
    КонецЕсли;
КонецПроцедуры

Функция НайтиСвойПрофиль85(Агент, Кластер, Имя, Маркер)
    Найденный = Неопределено;
    Для Каждого Кандидат Из Агент.GetSecurityProfiles(Кластер) Цикл
        Если Кандидат.Name = Имя Тогда
            Если Найденный <> Неопределено Или Кандидат.Descr <> Маркер Тогда
                ВызватьИсключение "Чужой или неоднозначный профиль: изменение запрещено";
            КонецЕсли;
            Если Кандидат.FileSystemFullAccess Или Кандидат.COMFullAccess Или Кандидат.AddInFullAccess
                Или Кандидат.ExternalAppFullAccess Или Кандидат.InternetFullAccess
                Или Кандидат.UnSafeExternalModuleFullAccess Или Кандидат.FullPrivilegedMode
                Или Кандидат.CryptographyAllowed Или Кандидат.SafeModeProfile Тогда
                ВызватьИсключение "Собственный неиспользуемый учебный профиль не должен разрешать полный доступ";
            КонецЕсли;
            Найденный = Кандидат;
        КонецЕсли;
    КонецЦикла;
    Возврат Найденный;
КонецФункции

Функция НайтиСвойРесурс85(Агент, Кластер, ИмяПрофиля, Ключ, Маркер)
    Найденный = Неопределено;
    Для Каждого Кандидат Из Агент.GetSecurityProfileAddIns(Кластер, ИмяПрофиля) Цикл
        Если Кандидат.Name <> Ключ Или Кандидат.Descr <> Маркер Или Найденный <> Неопределено Тогда
            ВызватьИсключение "В своем новом профиле ожидается только один собственный ресурс";
        КонецЕсли;
        Найденный = Кандидат;
    КонецЦикла;
    Возврат Найденный;
КонецФункции

Процедура ПроверитьХеш85(Хеш)
    Если СтрДлина(Хеш) <> 28 Тогда
        ВызватьИсключение "Требуется реальная SHA-1/base64, а не вымышленное имя";
    КонецЕсли;
    Байты = Base64Значение(Хеш);
    Если ТипЗнч(Байты) <> Тип("ДвоичныеДанные") Тогда
        ВызватьИсключение "Хеш обязан декодироваться в двоичные данные";
    КонецЕсли;
    Если Байты.Размер() <> 20 Или Base64Строка(Байты) <> Хеш Тогда
        ВызватьИсключение "Требуется каноническая base64 для20байтовSHA-1";
    КонецЕсли;
КонецПроцедуры
Модуль управляемой формы обработки: команда Выполнить

Обработка.УчебныйCOM85.Форма.Форма: полный модуль формы

Клиентский/серверный модуль управляемой формы отдельной файловой ИБ; процедуры уже содержат директивы. Поля созданы согласно подготовке.

&НаКлиенте
Процедура Выполнить(Команда)
    Данные = Новый Структура;
    Данные.Вставить("ПортАгента", ПортАгента);
    Данные.Вставить("ПортRAS", ПортRAS);
    Данные.Вставить("ПортКластера", ПортКластера);
    Данные.Вставить("ИмяАгента", ИмяАгента);
    Данные.Вставить("ПарольАгента", ПарольАгента);
    Данные.Вставить("ИмяАдминистратора", ИмяАдминистратора);
    Данные.Вставить("ПарольАдминистратора", ПарольАдминистратора);
    Данные.Вставить("UUIDОпыта", UUIDОпыта);
    Данные.Вставить("UUIDКластера", UUIDКластера);
    Данные.Вставить("Дополнительно", Дополнительно);
    ПарольАгента = "";
    ПарольАдминистратора = "";
    Дополнительно = "";
    Попытка
        Ответ = ВыполнитьНаСервере(Операция, Данные, ПодтвержденСвойСтенд);
    Исключение
        Данные.ПарольАгента = "";
        Данные.ПарольАдминистратора = "";
        Данные.Дополнительно = "";
        Сообщить("Операция не подтверждена. Не повторяйте запись автоматически. Проверьте только свой изолированный стенд и ранее записанные UUID.");
        Возврат;
    КонецПопытки;
    Данные.ПарольАгента = "";
    Данные.ПарольАдминистратора = "";
    Данные.Дополнительно = "";
    Сообщить(Ответ);
КонецПроцедуры

&НаСервереБезКонтекста
Функция ВыполнитьНаСервере(Операция, Данные, ПодтвержденСвойСтенд)
    Возврат УчебныйCOM85.Выполнить85(Операция, Данные, ПодтвержденСвойСтенд);
КонецФункции

Разбор по шагам

  1. СоединитьсяСоСвоимАгентом85 проверяет точную платформу, новую пустую конфигурацию и явное подтверждение VM; только затем создает свои два административных подключения.

  2. RAS выполняет проверку точной версии обслуживаемого агента. COM и RAS получают разные порты; COM AuthenticateAgent принимает имя, затем пароль, тогда как RAS ВыполнитьАутентификацию принимает пароль, затем имя.

  3. ПолучитьСвойКластер85 принимает только один кластер: собственный UUID, имя с UUIDОпыта, loopback127.0.0.1 и фактический порт. UUID берется из RAS, не выдумывается как свойство COM-кластера.

  4. До операции повторно проверяется допустимый набор ИБ; по умолчанию0. Постоянная кластерная аутентификация отделена от агентской и не заменяется учетными данными временного создаваемого объекта.

  5. После полного собственного UUID/0ИБ-gate прочитан свой template-профиль и реальный ресурс. Новый профиль получает отдельное имя по UUIDОпыта и виду разрешения.

  6. Все полные разрешения нового профиля отключены; он не назначается ИБ. Новый ресурс получает свой UUID-ключ, точный маркер и реальные значения собственного образца.

  7. RegSecurityProfile регистрирует unused-профиль; RegSecurityProfileAddIn принимает кластер, строковое имя профиля и реально созданный COM-ресурс. После записи все значимые поля сравниваются с повторным чтением.

  8. AddInHash — SHA-1/base64 реального собственного бинарного артефакта. Проверка20байтов — проверка формы, не подписи или доверия; компонент не загружается и не подключается.

  9. AddInFullAccess=Ложь, в unused-профиле допускается только один точный ресурс. Удаляется только новый UUID-ключ, шаблонный ресурс остается.

  10. UnregSecurityProfileAddIn принимает строковый ключ Name, а не неизвестный объект. Перед каскадным UnregSecurityProfile проверены пустые списки всех6видов ресурсов; любые посторонние записи запрещают удаление.

Как проверить результат

  1. Создан только новый UUID-unused-профиль; исходный template-профиль остается без изменений.

  2. Все поля разрешения повторно прочитаны и совпадают; никакой COM-ресурс/компонент/EPF/приложение/HTTP не исполнялись.

  3. После явного удаления собственные ключ и профиль отсутствуют, шаблонный ресурс остается; фактические файлы не удаляются.

Ожидаемый результат

Ученик понимает различие фабрики описания, административного allowlist, использования ресурса и безопасного удаления собственной регистрации.

На что обратить внимание

  1. Это будущий ручной учебный запуск на собственной VM, а не уже выполненная операция. runtimeVerifiedScenarios остается0; статические проверки не гарантируют COM-регистрацию, лицензии или успешный ответ агента.

  2. Проверки выполняются перед вызовами, но не образуют распределенную транзакцию и не исключают гонку. Только один оператор может менять стенд; при любом несоответствии остановитесь.

  3. Не используйте production, копию рабочего реестра или имена чужих пользователей. Нельзя расширять разрешения рабочей базы ради COM-подключения.

  4. UnregSecurityProfile каскадно удаляет все связанные разрешения, поэтому здесь допускается только пустой own-профиль после6проверок.

  5. Регистрация может обновлять одноименный профиль/ресурс. Существующее собственное или чужое имя не перезаписывается.

  6. Форма SHA-1 или CLSID не доказывает доверие артефакту. Реальные собственные образцы обязательны; отсутствие образца не заменяется нулевой/случайной суммой.

Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.

Не хотите разбираться сами?

Адаптируем это решение под вашу базу. Оценка бесплатно.

Оставить задачу

1С, 1С:Предприятие — товарные знаки ООО «1С». Сайт не является официальным представительством фирмы «1С» и не аффилирован с ней.