• Добро пожаловать на Форум пользователей ПО АСКОН. Пожалуйста, авторизуйтесь.
 

Уважаемые пользователи,

Хотим проинформировать вас о режиме работы регистрации на нашем сайте.

Зарегистрироваться возможно в рабочие дни, с 8:00 до 20:00 (мск).

Если у вас возникнут вопросы или потребуется дополнительная информация, не стесняйтесь обращаться к нашей службе поддержки. Вы можете связаться с нами по указанным контактным данным на нашем сайте.

Благодарим вас за понимание и сотрудничество. Мы ценим ваше терпение и стремимся предоставить вам лучший опыт использования нашего сервиса.

С уважением,
Команда Ascon

Действия от лица другого пользователя в ЛОЦМАН

Автор mistersviter, 08.09.22, 16:28:51

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

mistersviter

Доброго времени суток. Имеется следующая проблема:
Есть некоторый плагин (написан на C#), который выполняет действия по созданию объектов лоцман, документов лоцман, созданию связей, заполнению атрибутов и т.д.
Все объекты должны создаваться в состоянии "Утвержден". С правами обычного пользователя такой трюк выполнить нельзя, но нужно, чтобы плагин работал имено с учетки пользователей, у которых не подразумевается таких полномочий.
Первое, что пришло в голову - в процессе работы плагина подключать другую учетную запись (с необходимыми правами) в нужный момент.
string currentBase = pluginCall.RunMethod("CurrentBase").ToString();
 
pluginCall.RunMethod("ConnectToDBEx", currentBase, "ADMIN_PLUGIN", "123"); // Подключаемся с админскими правами
 
string currentUser = pluginCall.RunMethod("CurrentUser").ToString();
 
string checkOutName = pluginCall.RunMethod("CheckOut", "", "", "", 0).ToString();
 
pluginCall.RunMethod("ConnectToCheckOut", checkOutName, currentBase);
К сожалению такой план не сработал. Чекаут создается от имени "ADMIN_PLUGIN", но при попытке подключения к нему возникает ошибка, говорящая о попытке обратиться к несуществующему объекту.
На форуме видел несколько тем с похожим вопросом и ответ в них примерно следующий - "Решается так - в плагине создаёте новое подключение к серверу приложений и уже с ним работаете от имени администратора".
Я честно попытался, что-то изобразить, но мои попытки были тщетны. Исходя из вышесказанного, прошу поделиться кодом как создать такое подключение или другими решениями возникшей проблемы.

Chaa

Если версия 2018 и старше, то использовать подключение из Ascon.Plm.ServerApi.dll и работу с датасетом из Ascon.Plm.DataPacket.dll.
https://forum.ascon.ru/index.php?topic=36472

mistersviter

Цитата: Chaa от 09.09.22, 07:17:41Если версия 2018 и старше, то использовать подключение из Ascon.Plm.ServerApi.dll и работу с датасетом из Ascon.Plm.DataPacket.dll.
https://forum.ascon.ru/index.php?topic=36472

Лоцман версии 2018.3. Не нахожу у себя данной библиотеки. Ищу в C:\Program Files (x86)\ASCON\Loodsman\AppServer. Да и в целом по машине с установленным сервером поискал и на машине с клиентом. Я не там ищу?

mistersviter

Цитата: Chaa от 09.09.22, 07:17:41Если версия 2018 и старше, то использовать подключение из Ascon.Plm.ServerApi.dll и работу с датасетом из Ascon.Plm.DataPacket.dll.
https://forum.ascon.ru/index.php?topic=36472

Ну библиотеку Ascon.Plm.ServerApi.dll в итоге нашел и подключил. Подскажите пожалуйста как с помощью нее организовать подключение. У меня в попытках до создания этой темы был вот такой кусок кода:

Type type = Type.GetTypeFromProgID("LoodsmanServerApplication.MainSystem");
IMainSystem mainSystem = (IMainSystem)Activator.CreateInstance(type);
mainSystem.ConnectToDBEx("Shield", "Администратор", "Администратор", out object code, out object message);

Chaa

Примерно так:
using Ascon.Plm.ServerApi;

IConnectionFactory cf = new ConnectionFactory();
IConnection c = cf.CreateConnection("host", 8076 /*port*/);
IMainSystem mainSystem = c.MainSystem;
mainSystem.ConnectToDBEx("Shield", "Администратор", "Администратор", out object code, out object message);
+ Благодарностей: 1

mistersviter

Уважаемый, Chaa, спасибо огромное. Способ, описаный Вами работает. Во всяком случае на 2018.3.
Оставлю тут кусок кода, может кому-то пригодится потом. Выполнение кода из под плагина позволяет, не обладая правами на создание объектов в состоянии "Утвержден", такие объекты таки создавать (ну конечно подключая учетку с админскими правами по ходу пьесы). Не уверен насчет последних двух строчек, но кажется вполне логичным.
using Ascon.Plm.Loodsman.PluginSDK;
using Ascon.Plm.ServerApi;

object errCode;
object errMessage;

IConnectionFactory cf = new ConnectionFactory();
IConnection c = cf.CreateConnection("serverName", 8076 /*port*/);
IMainSystem mainSystem = c.MainSystem;
mainSystem.ConnectToDBEx("dbName", "admin", "pass", out errCode, out errMessage);
string checkOutName = mainSystem.CheckOut("", "", "", 0, out errCode, out errMessage).ToString();
mainSystem.ConnectToCheckOut(checkOutName, "dbName", out errCode, out errMessage);
string objID = mainSystem.NewObject("Деталь", "Утвержден", "КК11.130200.005", 0, out errCode, out errMessage).ToString();
mainSystem.CheckIn(checkOutName, "dbName", out errCode, out errMessage);

c.Close();
c.Dispose();

Добавлю еще от себя, что нашел еще способ выполнить свою задачу, но он пожалуй более затратный по времени выполнения кода. Суть:
Объекты создаются пользователем в том состоянии, на которое есть права, а затем от учетки админа меняем состояния, за счет использования метода UpdateStates можно обойти проблему подключения к чекаутам. Код примерно такой:
pluginCall.RunMethod("ConnectToDBEx", dbName, admin, pass);  // Подключение админки
pluginCall.RunMethod("UpdateStates", ids, ApprovedStateID);  // Смотри в api, принимает список айдишников в виде строки id1,id2,id3,...,idn
pluginCall.RunMethod("ConnectToDB", dbName);                 // Переподключаемся на учетку пользователя

На правильность кода не претендую, но думаю кому-то это может помочь в будущем.

KAV

Цитата: Chaa от 09.09.22, 07:17:41Если версия 2018 и старше, то использовать подключение из Ascon.Plm.ServerApi.dll и работу с датасетом из Ascon.Plm.DataPacket.dll.

А если версия лоцмана 2022?

Chaa


KAV

В Лоцман версии 22 нет библиотеки Ascon.Plm.ServerApi.dll.
И почему в справке "Лоцман API"в примере использования: "Set PLM = CreateObject("LoodsmanServerApplication.MainSystem", "ComputerName")" ?

Chaa

Цитата: KAV от 21.04.23, 14:09:47В Лоцман версии 22 нет библиотеки Ascon.Plm.ServerApi.dll.
Она есть, устанавливается в GAC, регистрирует COM-объект в реестре. Лоцман Клиент работает через эту библиотеку.

Цитата: KAV от 21.04.23, 14:09:47И почему в справке "Лоцман API"в примере использования: "Set PLM = CreateObject("LoodsmanServerApplication.MainSystem", "ComputerName")" ?
Это очень древняя страница справки, в новых версиях установка DCOM опциональна, основной метод подключения - WCF.

KAV

Цитата: Chaa от 21.04.23, 14:27:10Она есть, устанавливается в GAC
Спасибо, нашел(C:\Windows\Microsoft.NET\assembly\GAC_MSIL\Ascon.Plm.ServerApi). А как ее добавить в ссылки проекта на visual studio?

Цитата: Chaa от 21.04.23, 14:27:10Это очень древняя страница справки
Странно, эта документация была в поставке с новой версией лоцман 22.

Цитата: Chaa от 21.04.23, 14:27:10в новых версиях установка DCOM опциональна
Что под этим подразумевается? Через библиотеку "LoodsmanServerApplication.MainSystem" не получится работать?

Chaa

Цитата: KAV от 21.04.23, 15:07:44Что под этим подразумевается? Через библиотеку "LoodsmanServerApplication.MainSystem" не получится работать?
При установке сервера приложений нужно установить кроме собственно службы сервера приложений еще службу "Сервер приложений COM+".

Как добавить в проект сейчас не скажу, но способ должен быть, тем более она зарегистрирована в глобальном кэше сборок.

По поводу документации. Эта страница в SDK версии 8.5 (это 2007 год) выглядит точно так же.

KAV

С библиотекой "Ascon.Plm.ServerApi.dll" (как и с "LoodsmanServerApplication.MainSystem") получается подключиться к серверу приложений (свойство "ApplicationVersion" показывает версию), но при подключении к базе данных методом "ConnectToDBEx" выдает ошибку: "Истек срок действия на продукт Feature ID:646; Error code:41".
В чем может быть проблема?

Chaa

Цитата: KAV от 21.04.23, 17:00:47"Истек срок действия на продукт Feature ID:646; Error code:41".
В чем может быть проблема?
Нужна лицензия "646 ЛОЦМАН:PLM 22 Лицензия на доступ к СП".
В старых версиях сервер приложений брал лицензию Лоцмана если нет специальной лицензии на доступ к серверу приложений, сейчас не берет.

KAV

Цитата: Chaa от 24.04.23, 06:23:04Нужна лицензия "646 ЛОЦМАН:PLM 22 Лицензия на доступ к СП".
А как ее программно получать?

Chaa

Цитата: KAV от 24.04.23, 07:47:15А как ее программно получать?
Ее нужно купить у Аскона. Боюсь что получать ее другим способом незаконно.

Эта проблема огорчает многих пользователей при переходе на новые версии, по поводу LWF мне часто пишут. Пытался с сотрудниками Аскона поговорить по этому поводу, но не нашел понимания. Можете написать в поддержку и поругаться с ними. Говорят, если много обращений по одному вопросу, тогда над ним подумают.

Без нее можно работать с подключением из плагина, если Лоцман Максимальный или есть лицензия на плагины :-)

KAV

Chaa, спасибо за пояснение. Думал что то не так в программе делаю. Узнал, что лицензия "646 ЛОЦМАН:PLM 22 Лицензия на доступ к СП" входит в состав Лоцман Максимальный (у нас же Лоцман Стандартный и ее нет).