23.06.2005, 08:46 | #21 |
Administrator
|
и еще маааленькое уточнение... Если сответствующий элемент не найдет в AccessRightsList, то его права наследуются от родителя в дереве (это Menuitem либо SecurityKey, либо FeatureKey)... А в 2.5 насколько я помню у FeatureKey может быть несколько родителей .... А сия инфа лежит исключительно в .aod-файликах
|
|
23.06.2005, 09:49 | #22 |
Участник
|
А можно про эту песню поподробнее
Цитата:
Однако, ответить на вопрос - а кто имеет такой-то доступ к такому-то пункту меню - получить можно. Пишется хранимая процедура, в которой в качестве параметра передается тип элемента и его ID (А вот уж как получить ID -отдельная песня).
В AccessRightsList - тоже только ID пунктов меню. Я писал выше ее структуру. Поэтому если знать какой ID к какому пункту меню относиться, то тогда бы я нашел все группы, которые имеют на него права (в том числе и наследованные), а по группам соответственно пользователей. Готов даже каким-то образом Аксаптовским классом собирать эту информацию и класть в таблицу SQL. Это возможно как-нибудь? Заранее огромное спасибо! |
|
23.06.2005, 10:41 | #23 |
Administrator
|
Если задействовать Аксаптийный класс - то возможно все ... есть такая табличка - \\SystemDocumentaion\Tables\UtilElementsId. Табличка хранится в .aod-файлике. Там есть поле id. Таким образом - аксаптийный класс должен перелить сию табличку в SQL, который уже может все делать.... Единственный нюанс - id-шники могут меняться (опускание в слой, импорт xpo) или же появляться новые (разработка)
|
|
23.06.2005, 12:37 | #24 |
Участник
|
Наверное, есть более героический путь:
обратите внимание на таблицы перекрёстных ссылок xRefNames, xRefPaths, XREFREFERENCES, XREFTABLERELATION, XREFTYPEHIERARCHY Если сумеете поднять "на грудь" 3 миллиона записей, то что-то может получиться. |
|
23.06.2005, 13:01 | #25 |
Administrator
|
У перекрестных ссылок есть один недостаток - нет гарантии актуальности и много ненужной информации. Однако - существеный плюс - можно вообще не лазить в Аксапту
|
|
23.06.2005, 14:21 | #26 |
Участник
|
Цитата:
Если сумеете поднять "на грудь" 3 миллиона записей, то что-то может получиться.
|
|
23.06.2005, 17:13 | #27 |
Участник
|
Все с функциональными ключами все получилось!
Может кто подскажет а как функциональные ключи связаны с пунктами меню? Понимаю, в 2.5 это зашито наверно в .aod, но как вытянуть их средствами Аксапты и положить в таблицу ID пункта меню, ID Функц.ключа ? Просто может это все поможет привести в порядок ту гору прав, уже разданных пользователям и не будет так страшно включать пользователей в новые группы, когда из-за доступа к одному пункту меню они "в подарок" получают доступ к множеству других пунктов. |
|
24.06.2005, 15:40 | #28 |
Administrator
|
Вытащить ID меню можно а) http://www.axforum.info/forums/showt...1524#post71524 - пробежавшись по АОТ, единственное что не надо забывать - что menuitem 3 вида - display, output и action - т.е. они сидят в разных поддеревьях, далее получив объект типа treenode - присвоить его объекту типа MenuFunction
б) попровать для тех же целей сделать выборку из \SystemDocumentaion\Tables\UtilElementsId. Там ID-шник лежит отдельным полем. По ID-шнику сгенерить экземпляр класса MenuFunction. Получив (любым способом) экземпляр класса MenuFunction можно заглянуть в его свойство FeatureKey. Оно возвращает код привязанного FeatureKey. Записав полученные ID меню и ID FeatureKey - можно заполнить искомую табличку |
|
11.11.2006, 21:44 | #29 |
Moderator
|
Экспорт прав всех групп в asg-файлы в заданном каталоге
Ах, какая архиполезнейшая ветка, господа! Прочитал с большим интересом.
Цитата:
X++: static void KKu_Job_6B01_ExportAllUserGroupsToFiles(Args _args) { // сохраняет все права групп пользователей в отдельных файлах в указанном каталоге SysSecurityUserGroup sysSecurity; UserGroupInfo userGroupInfo; userGroupId userGroupId , tmpUserGroupId; domainId domainId , tmpDomainId; str fileName; str filePath = @'C:\YourOwnFolder\ForUserGroups\'; // '//заключительный обратный слэш - обязателен' ; sysSecurity = SysSecurityUserGroup::construct(); domainId = ''; // здесь возможно нужен конкретный домен, если их несколько, // но у меня их нет (в таблице DomainInfo нет записей) - поэтому пустая строка while select userGroupInfo { userGroupId = userGroupInfo.id; fileName = filePath + ( strReplace ( strReplace ( strReplace ( strReplace ( strReplace ( strReplace ( strReplace ( strReplace ( strReplace( userGroupId, '.', '_'), // в качестве имени файла - id группы, очищенный от "нехороших" символов ' ', '_'), ':', '_'), '/', '_'), @'\', '_'), '?', '_'), '*', '_'), '[', '_'), ']', '_') ); tmpUserGroupId = sysSecurity.parmUserGroupId(); tmpDomainId = sysSecurity.parmDomainId(); // ---------------------------------------------------------------------------------------- // выдрано из цикла if (dialog.run()) метода exportWithDialog класса SysSecurityUserGroup // скопировал по-обезьяньи, не особо разбираясь что к чему, но всё работает как мне надо :) sysSecurity.save(); sysSecurity.parmDomainId( domainId ); sysSecurity.parmUserGroupId( userGroupId ); sysSecurity.load(); sysSecurity.export( fileName ); sysSecurity.parmDomainId( tmpDomainId ); sysSecurity.parmUserGroupId( tmpUserGroupId ); sysSecurity.load(); // ---------------------------------------------------------------------------------------- } } Имена файлов формируются автоматически из идентификаторов групп. "Центрально симметричная" конструкция с многократными вызовами функции strReplace занимается очисткой идентификаторов групп от "нехороших" символов с точки зрения имени файла. Как видно в коде, "нехорошие" символы заменяются символами подчеркивания. Степень "нехорошести" - моя субъективная и некоторые символы (пробел, точка) в принципе вполне корректны для имени файла. Просто я предпочитаю, чтобы имя файла состояло только из букв, цифр и подчеркиваний. Вы можете смело сократить или расширить перечень заменямых символов по вашему усмотрению (например, на основании предварительного анализа значений поля Id таблицы UserGroupInfo) Собственно "движок" процесса экспорта заимствован из цикла if (dialog.run()) метода exportWithDialog класса SysSecurityUserGroup. Заимствован неосознанно, без большого понимания что и как происходит именно в этих строчках кода (за неимением времени разбираться). Если кто-то не сочтет за труд немного прокомментировать (или даже оптимизировать) этот фрагмент - заранее премного благодарен! Цитата:
Сообщение от sukhanchik
Внимание - вопрос: вот вы выгрузили права для 5 групп и одного домена. А загружаться они как должны? А если они чуть-чуть отличаются между собой? А если при загрузке вы выделили не те группы/домены (или таковых вообще не существует)? А названия групп/доменов в файле экспорта/импорта не хранятся - т.к. импортировать права можно в другую пару домен/группа. Вопросов тут больше чем ответов.
|
|
|
За это сообщение автора поблагодарили: zemlyn (2), Kabardian (3). |