(изменено: Slava.Coder.Vrn, 25 сентября 2007г. 14:57:39)

Тема: TDMS 3.0.99: Невозможно получить доступ к составу объекта из команды, запущенной "бесправным" пользователем

Есть команда

Dim Obj
Dim Objs
Dim Dlg
ThisScript.SysAdminModeOn
ThisObject.Permissions = SysAdminPermissions
Set Dlg = ThisApplication.Dialogs.SelectObjectDlg
Set Objs = ThisObject.ContentAll
MsgBox Objs.Count
For Each Obj In Objs
    'MsgBox Obj.Description
    Dlg.SelectFromObjects.Add(Obj)
Next
Dlg.Show
ThisScript.SysAdminModeOff

Администратор имеет права по умолчанию (роль "разработчик" на корневой объект и все вложенные объекты). Все остальные пользователи имеют роль "Разработчик" только на корневой объект (для которого выполняется команда), на все вложенные объекты у них нет никаких прав.
Если команду запускает администратор, то все работет как надо. Если же команду запускает любой другой пользователь, строчка MsgBox Objs.Count выдает сообщение "0" (ессно, не смотря на то, что в корневом объекте есть множество объектов, на которые у данного пользователя нет никаких прав)
Неужели в начале команды надо добавлять разрешающую роль на активного пользователя, а в конце выполнения команды удалять ее???

Re: TDMS 3.0.99: Невозможно получить доступ к составу объекта из команды, запущенной "бесправным" пользователем

Пока только идеи... Надо копать в сторону динамических выборок...

(изменено: Edhunter, 25 сентября 2007г. 15:42:32)

Re: TDMS 3.0.99: Невозможно получить доступ к составу объекта из команды, запущенной "бесправным" пользователем

Кстати, это не ошибка, так что переезжаем в програмирование   ;)

Re: TDMS 3.0.99: Невозможно получить доступ к составу объекта из команды, запущенной "бесправным" пользователем

Не понял, что делает вышеприведенный код. Создается динамическая выборка, которая ищет все объекты, у которых ObjectDef <> NULL и у которых Description == ThisObject.Description. Что это обозначает?

Re: TDMS 3.0.99: Невозможно получить доступ к составу объекта из команды, запущенной "бесправным" пользователем

Да и почему это не ошибка? Почему если я проставил SysAdminPermissions на объект, я не могу получить доступ к составу объекта? Разьве так было всегда?

Re: TDMS 3.0.99: Невозможно получить доступ к составу объекта из команды, запущенной "бесправным" пользователем

Кстати, еще вопрос - что делает метод "ThisScript.SysAdminModeOn"?

Re: TDMS 3.0.99: Невозможно получить доступ к составу объекта из команды, запущенной "бесправным" пользователем

Кстати, еще вопрос - что делает метод "ThisScript.SysAdminModeOn"?

Выполняет заключённый в тэги кусок кода с правами сисадмина =)

Да и почему это не ошибка? Почему если я проставил SysAdminPermissions на объект, я не могу получить доступ к составу объекта? Разьве так было всегда?

Сколько помню так и было... Права на объект - это ещё не права на его состав.

Код который я написал (и стёр потом) не до конца работает =( Сейчас методом проб и ошибок разбираюсь с методом AddCondition. Извиняюсь что запостил непроверенный код =(

Re: TDMS 3.0.99: Невозможно получить доступ к составу объекта из команды, запущенной "бесправным" пользователем

Чем "ThisScript.SysAdminModeOn" отличается от "Obj.Permissions = SysAdminPermissions"?
Вроде бы понятно, чем отличается. Но на самом деле, согласно логике, как раз-таки если перед вызовом "Obj.Content" сделать вызов "ThisScript.SysAdminModeOn", то "Obj.Content" должен вернуть ВСЕ объекты вне зависимости от проставленных на них прав доступа. Однако, этого не происходит.

Re: TDMS 3.0.99: Невозможно получить доступ к составу объекта из команды, запущенной "бесправным" пользователем

Slava.Coder.Vrn пишет:

Чем "ThisScript.SysAdminModeOn" отличается от "Obj.Permissions = SysAdminPermissions"?

Отличается тем, что на все объекты, которые учавствуют в скрипте даются админские права. Т.е., к примеру,
если у меня есть Obj1 и Obj2, то раньше надо было писать
Obj1.permissions = sysadminpermissions
Obj2.permissions = sysadminpermissions
а сейчас достаточно написать одну строку.

Slava.Coder.Vrn пишет:

"Obj.Content" должен вернуть ВСЕ объекты вне зависимости от проставленных на них прав доступа. Однако, этого не происходит.

Нет, не должен. Тогда получится "дыра" в безопасности.

Re: TDMS 3.0.99: Невозможно получить доступ к составу объекта из команды, запущенной "бесправным" пользователем

Anatoly пишет:

Obj1.permissions = sysadminpermissions
Obj2.permissions = sysadminpermissions

Но получается, чтобы иметь возможность дать админские права, надо обязательно иметь право доступа "просмотр объекта" для объектов Obj1 и Obj2?
Т.е. сейчас нет никаких адекватных средств для выполнения операций с объектами, на которые у активного пользователя нет прав на просмотр объекта?

(изменено: Anatoly, 28 сентября 2007г. 12:03:37)

Re: TDMS 3.0.99: Невозможно получить доступ к составу объекта из команды, запущенной "бесправным" пользователем

Slava.Coder.Vrn пишет:

Т.е. сейчас нет никаких адекватных средств для выполнения операций с объектами, на которые у активного пользователя нет прав на просмотр объекта?

НУ если у пользователя нет прав на видимость => у него нет прав на редактирование => он вообще ничего не знает об этих объектах=>у него не может быть прав. Зачем тогда ему они в команде???

P.S.  видишь хомячка? нет? и я не вижу, а он есть  :))))) (с) - народный анекдот

Re: TDMS 3.0.99: Невозможно получить доступ к составу объекта из команды, запущенной "бесправным" пользователем

Anatoly пишет:

Зачем тогда ему они в команде???

Например чтобы проверить, есть ли в составе какойто объект или нет и в зависимости от этого предпринять разные действия. Много раз на это натыкался.
По поводу дыры, почему например выборка.SysAdminPermissions = true выдающая ВСЕ независимо от прав дырой не считается, а тоже самое по отношению к составу объекта считается?

Re: TDMS 3.0.99: Невозможно получить доступ к составу объекта из команды, запущенной "бесправным" пользователем

MAG пишет:

По поводу дыры, почему например выборка.SysAdminPermissions = true выдающая ВСЕ независимо от прав дырой не считается, а тоже самое по отношению к составу объекта считается?

Решение проблемы: создайте выборку с параметром. Дайте ей сисадминовские права и получайте все объекты в составе!  :)

Re: TDMS 3.0.99: Невозможно получить доступ к составу объекта из команды, запущенной "бесправным" пользователем

Так и решаем, только не удобно это...

В итоге получаем, что никакая это не дыра, а просто недочет.

Re: TDMS 3.0.99: Невозможно получить доступ к составу объекта из команды, запущенной "бесправным" пользователем

MAG пишет:

Так и решаем, только не удобно это...
В итоге получаем, что никакая это не дыра, а просто недочет.

Если разрешить, как Вы говорите, то слетят почти все настройки.
Т.е. необходимо будет проверять у каждого объекта, есть ли право на видимость!

(изменено: MAG, 28 сентября 2007г. 12:39:06)

Re: TDMS 3.0.99: Невозможно получить доступ к составу объекта из команды, запущенной "бесправным" пользователем

Anatoly пишет:

...необходимо будет проверять у каждого объекта, есть ли право на видимость!

Если я правильно понял, ThisScript.SysAdminModeOn подразумевает админские права на все встреченные дальше в скрипте объекты. Кроме того, если написано явное присвоение админских прав, значит тот кто писал знал что делал... Да и в выборках это ведь как-то решено...

Re: TDMS 3.0.99: Невозможно получить доступ к составу объекта из команды, запущенной "бесправным" пользователем

MAG пишет:

Если я правильно понял, ThisScript.SysAdminModeOn подразумевает админские права на все объекты. Кроме того, если написано явное присвоение админских прав, значит то кто писал знал что делал...

Anatoly пишет:

Отличается тем, что на все объекты, которые учавствуют в скрипте даются админские права. Т.е., к примеру,

Re: TDMS 3.0.99: Невозможно получить доступ к составу объекта из команды, запущенной "бесправным" пользователем

Я просто непонял что значит участвуют в скрипте. Если я напишу

thisscript.SysAdminModeOn
...
set SubObj = Obj.Objects(0)
...

SubObj участвует в скрипте?

Re: TDMS 3.0.99: Невозможно получить доступ к составу объекта из команды, запущенной "бесправным" пользователем

MAG пишет:

set SubObj = Obj.Objects(0)
SubObj участвует в скрипте?

SubObj  это ссылка на Obj.Objects(0). А в Obj.Objects(0) нет объектов, которые вы не имеете права видеть. Почему? Все запросы на чтение объектов, удовлетворяющих каким-либо условиям, идут от текущего пользователя. И в них везде стоит проверка прав на видимость.

SysAdminModeOn дает вам неограниченные права на тех объектах, о существовании которых вы знаете. Это в первую очередь права на изменение свойств. Никаких прав на видимость невидимого это не дает.

Anatoly совершенно справедливо посоветовал использовать для получения невидимых объектов выборки, которые запускаются от имени системного администратора. В этом случае все будет корректно.

Re: TDMS 3.0.99: Невозможно получить доступ к составу объекта из команды, запущенной "бесправным" пользователем

MAG пишет:

Например чтобы проверить, есть ли в составе какойто объект или нет и в зависимости от этого предпринять разные действия.

+1. Это часто встречающаяся операция. Поэтому я и сказал

Slava.Coder.Vrn пишет:

Т.е. сейчас нет никаких адекватных средств для выполнения операций с объектами, на которые у активного пользователя нет прав на просмотр объекта

Ключевое слово здесь - "адекватных". Я все понимаю, выборку можно сделать, но это ведь неудобно.

Anatoly пишет:

Если разрешить, как Вы говорите, то слетят почти все настройки.

Ок, значит имхо надо добавить свойство TDMSObjects.Permissions. Или метод ThisScript.AllObjectAccessOn