RSS Подписка на статьи RSS Подписка на комментарии Панель инструментов

Блог профессионалов стал частью сайта технической поддержки DocsVision http://support.docsvision.com. Новые материалы будут появляться уже на этом сайте.

Поиск

Ярлыки

авто генерация кода (1) Администрирование DocsVision (60) Атрибутивный поиск (3) База данных (24) Базы знаний (1) Безопасность (1) Бизнес-процессы (20) Блог (2) Вы увидите это первыми (1) Групповые политики (1) Диаграммы (2) Задания (2) Интеграция (2) Карточки DocsVision (14) Конструктор Решений (11) Маркетинг и продажи (4) Навигатор (3) Новое (3) Новости (32) Опрос (4) Опросы DocsVision (4) Оптимизация (3) Отчеты (2) Ошибки (1) Поддержка (14) Полезные ссылки (1) Представления (4) Производительность (5) Разбор полетов (18) Разработка для Workflow (7) разработка карточек (2) Разработка на платформе DocsVision (41) Разработка решений (43) Расширение платформы (1) Расширенные отчеты (9) Решения на платформе DocsVision (6) Сервисы DocsVision (3) Сканеры (3) Справочник сотрудников (1) Справочник типов (1) Установка (1) Утилиты (13) Шлюз в SharePoint (8) Штрихкод (2) Cкрипты карточек (7) DocsVision внутри (1) DocsVision Live (1) FileStream (1) FireFox (2) Opera (1) Powershell (5) Safari (1) SharePoint2007 (1) SharePoint2010 (2) Silverlight (1) UltraViews (1) Vista (1)

Утилита поиска карточек имеющих определенный набор прав

Для решения одной задачи потребовалась утилита, которая бы выводила список всех карточек, которые имеют определенный набор прав. Такая утилита была создана в службе ТП DocsVision.
(Администраторы далее могут сразу перейти в конец статьи и скачать утилиту)

Поскольку по самим дескрипторам. которые хранятся в базе определить набор прав при помощи T-SQL запроса нельзя, то единственным способом является перебор дескрипторов всех карточек.
Т.о. алгоритм следующий
1. Получение набора карточек CardDataCollection, среди которых нужно сделать выборку только тех, которые имеют нужные права.
2. Для каждой карточки из набора получить SecureCard
3. Из SecureCard получить последовательно SecurityDescriptor и AccessControlList
4. И в полученном AccessControlList проверить совпадения AccessControlEntry из условий поиска.

Какие ограничения присутствуют.
В диалоге "Безопасность" для описания прав - условий поиска нельзя указать, что эти права могут быть унаследованы. Т.е. если в диалоге будет указано искать карточки у которых права назначены для DOMAIN\User1, то будут найдены только те карточки, в которых данный набор задан явно и не отнаследован.
Помимо получения CardDataCollection для каждой карточки приходится получать SecureCard, т.е. идет обращение к серверу, что естественно, его нагружает.
Эту проблему можно обойти получая дескриптор непосредственно из базы:
1. Получаем CardData.ID
2. Из dvsys_instances получаем ссылку на дескриптор безопасности (поле SDID) из dvsys_security
3. Из dvsys_security получаем SecurityDesc (дескриптор Base64String)

Таким образом утилита может послужить примером работы с дескрптором безопасности, классом SecurityManager.
Обратите внимание, что для работы диалога назначения прав нужно наличие схемы безопасности SecuritySchema.xml (не удаляйте этот файл)

Утилита скомпилирована с библиотеками от DocsVision 4.1.1632. Для работы с другими версиями нужно присоединить к проекту библиотеки DocsVision.ObjectManager.Interop.dll и DocsVision.SecurityManager.Interop.dll

Скачать утилиту (утилита для DocsVision 4.1.1632, инструкция и исходный код на VB.NET VisualStudio 2008) Читать дальше

10 коммент.:

redzmey комментирует...

а у вас нет примера как скопировать права с одного объекта на другой? (с папки на карточку)

Михаил Захаров комментирует...

Готового примера нет. Делается, в общем, так же - нужно получить дескриптор одного объекта и присваивается другому. Отличие только в том, что карточка это объект SecureCard, а строка SecureRow.

Если делать в базе, то достаточно чтобы у строки из таблицы "папки", с нужно папкой и у строки из dvsys_instances с карточками было одинаковое значение в поле SDID.

Vadim Skipin комментирует...

На самом деле не стоит самостоятельно трогать колонку SDID в базе, настраивать безопасность следует через API (ну или из UI).
Дескрипторы безопасности довольно тонкая материя и, в частности, могут содержать наследованные/наследуемые элементы - если этого не учитывать, может случиться бяка.

redzmey комментирует...

а как назначить права на секцию "согласования"? я пробовал :
Dim secureTab As DocsVision.Platform.ObjectManager.ISecurable = USession.AccessManager.GetSecureSection(гуид секции согласования, гуид карточки)
но видимо неправильно понимаю параметры для GetSecureSection

Михаил Захаров комментирует...

Если вы хотите назначить права на вкладку карточки документа, то этого сделать нельзя, поскольку карточка имеет упрощенную безопасность. Строки и секции не имеют описателей прав. Т.е. права можно назначить только на карточку целиком.
Посмотрите схему карточки и руководство разработчика.

redzmey комментирует...

"Система позволяет назначать права на все низкоуровневые объекты:
• Типы карточек;
• Карточки;
• Секции;
• Строки;
• Файлы;
• Хранимые процедуры;"
(из руководства разработчика)

Ice комментирует...

да, платформа поддерживает все эти низкоуровневые объекты, но не обязательно решения на ней. А "делопроизводство" - это именно решение.
Упрощённая безопасность - более высокая скорость работы. Если нужно что-то особенное, то надо свои карточки писать... приходится с этим мириться.

P.S. А разве вам не подходит вариант установки прав на вкладку "согласования" через справочник типов?

redzmey комментирует...

к сожалению, не подходит :( т.к. экземпляры создаются программно и права на карточки тоже вешаются программно, так еще и вкладку согласования надо открывать только конкретным группам :(

Ice комментирует...

всё равно не понял, почему не подходит...

>т.к. экземпляры создаются программно и права на карточки тоже вешаются программно
ну пусть себе создаются и пусть права назначаются программно. А права на вкладку в данном виде документа будут назначаться в справочнике типов на все экземпляры карточек в системе.

>так еще и вкладку согласования надо открывать >только конкретным группам :(
Ну можно создать группы в DV и включить туда всех уполномоченных пользователей, которые будут видеть эту вкладку.

В чём затык-то?

Решение какое-то, в большинстве случаев, всё равно найти можно... у меня даже была необходимость добавлять открывшего в группу скриптом при открытии карточки (если свойство не в том состоянии), чтобы он видел некоторые вкладки, а при закрытии - удалять из неё.

Денис комментирует...

Вопрос наверное не совсем в тему, но...

Среди стандартных функций бизнес-процессов есть универсальная, при помощи которой можно назначить права (меня интересуют права на папки, т.к. все папки - это по сути строки секции одной единственной карточки, то собственно права на эти строки). Не раз на форумах сталкивался с тем, что назначить таким образом права или изменить их можно, а вот полностью удалить не получается, т.е. можно конечно снять все флаги для конкретной учетной записи, но сама запись продолжает болтаться в списке. Также говорят, что удалить запись можно только скриптом, причем всех интересуют именно права на карточки, а мне бы хотелось иметь возможность удалять права полностью для выбранной учетной записи на конкретную папку программно, а не руками.

И второе, среди возможных вариантов назначения прав на карточки или на папки есть возможность назначить права для учетной записи (а также записи справочника, группе в справочнике, роли), но нет возможности для назначения прав группе в домене стандартной функцией. А ведь это очень удобно, особенно при разграничении доступа. Как здесь быть?

Отправить комментарий