Тема: TDMS DS 3.0.99 TDMSApplication::ExecuteScript

Доброго времени суток

Суть :
не могу вызвать TDMSApplication::ExecuteScript из клиента на С++ - всегда получаю E_FAIL
Если вызывать из скрипта TDMS - все ОК

Пример:

#import "C:\Program Files\Consistent Software\TDMS 3.0\TDMSOle.dll" rename("LoadIcon", "TDMSLoadIcon") rename("CreateEvent", "TDMSCreateEvent")

int _tmain(int argc, _TCHAR* argv[])
{
    if FAILED(CoInitialize(NULL)) return -1;

    try {
        HRESULT hr = S_OK;
        TDMS::ITDMSApplicationPtr tdms = NULL;

        hr = tdms.CreateInstance(__uuidof(TDMS::TDMSApplication), NULL, CLSCTX_LOCAL_SERVER);
        if FAILED(hr) _com_issue_error(hr);

        hr = tdms->Login(_T("sysadmin"), _T("MySuperPassword"), 
            _T("MyCoolDatabase"), _T("MyMegaServer"), 
            TDMS::tdmDatabaseMSDE2000, TDMS::tdmAuthSQL);
        if FAILED(hr) _com_issue_error(hr);

        hr = tdms->ExecuteScript(_T("CMD_TEST"), _T("Test"));
        if FAILED(hr) _com_issue_error(hr); // вот тут вот и выбрасывается _com_error

    }
    catch(_com_error& e) {
        MessageBox(NULL, e.ErrorMessage(), NULL, MB_OK | MB_ICONEXCLAMATION);

        if (NULL != e.ErrorInfo()) {
            _bstr_t desc;
            e.ErrorInfo()->GetDescription(desc.GetAddress());
            MessageBox(NULL, desc, NULL, MB_OK | MB_ICONEXCLAMATION);
        }
    }

    CoUninitialize();

    return 0;
}

Вопрос:

Это баг или фича ??

Re: TDMS DS 3.0.99 TDMSApplication::ExecuteScript

Это не ошибка. Вызов ExecuteScript снаруже не может быть проверен на права доступа, поэтому запрещён.

Re: TDMS DS 3.0.99 TDMSApplication::ExecuteScript

Edhunter пишет:

Это не ошибка. Вызов ExecuteScript снаруже не может быть проверен на права доступа, поэтому запрещён.


Выполняется метод TDMSApplication::Login => существует TDMSUsers::Current -
Почему нельзя проверить права доступа ?

Re: TDMS DS 3.0.99 TDMSApplication::ExecuteScript

Edhunter пишет:

Это не ошибка. Вызов ExecuteScript снаружи не может быть проверен на права доступа, поэтому запрещен.

Не совсем так, имхо.

ExecuteScript может запустить любой внутренний скрипт TDMS. Во внутренних скриптах достаточно часто используются административные права на объект, права на скрипт или выборку. Когда это происходит снаружи, некто со злым умыслом или по неосторожности может получить несанкционированный доступ или нанести вред окружающей среде.

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

Re: TDMS DS 3.0.99 TDMSApplication::ExecuteScript

Уточню:

McZag пишет:

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

IMHO слово "некто" - неприменимо (см #3).

McZag пишет:

Только резонный вопрос. А на фига это нужно?

Сейчас я использую для реализации двух вариантов пользовательского интерфейса: а) средствами TDMS; б) "user friendly" в виде inproc com server.

Re: TDMS DS 3.0.99 TDMSApplication::ExecuteScript

И так и эдак ваш ответ крутил. Даже не знаю что ответь.

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

Re: TDMS DS 3.0.99 TDMSApplication::ExecuteScript

McZag пишет:

И так и эдак ваш ответ крутил. Даже не знаю что ответь.

Вы видимо очень хороший программист.

:) нет, у нас очень хорошие менеджеры.

McZag пишет:

Связывайтесь с разработчиками и просите, чтобы разрешили вам запускать ExecuteScript.

Запросы на новые "фичи" разве не Вы делаете ?

Re: TDMS DS 3.0.99 TDMSApplication::ExecuteScript

SSV пишет:

Запросы на новые "фичи" разве не Вы делаете ?

Иногда. Но беда в том, что в свое время именно я попросил убрать вызов ExecuteScript и обращения к ряду свойств. Теперь, сами понимаете, не могу же обратно оглобли развернуть

Re: TDMS DS 3.0.99 TDMSApplication::ExecuteScript

SSV пишет:

Выполняется метод TDMSApplication::Login => существует TDMSUsers::Current -
Почему нельзя проверить права доступа ?

Права в TDMS определяются совокупностью 2-х свойств:
1. Роль
2. Статус

Для того, чтобы понять, почему нельзя открыть ExecuteScript снаружи, необходимо, в первую очередь, обратиться к API Help:

object.ExecuteScript (Source, [ProcName], [Param1], [Param2], [Param3], [Param4], [Param5], [Param6], [Param7], [Param8], [Param9], [Param10])
,где
единственным обязательным параметром является:
"Source Обязательный. Значение Variant. Источник скрипта: команда, тип объекта, форма, выборка или код скрипта. "

Таким образом, если разрешить выполнение скрипта извне, то ЛЮБОЙ пользователь пишет простейший код:

For Each ObjDef in Application.ObjectDefs
  For Each Obj in ObjDef.Objects
[b]    Obj.Permissions = SysAdminPermissions
    Obj.Erase[/b]  
  Next
Next

и передаёт его параметром
И данный скрипт успешно удаляет ВСЕ объекты в системе, видимые пользователем.

А теперь ответьте, включить или оставить как есть?

Re: TDMS DS 3.0.99 TDMSApplication::ExecuteScript

Anatoly пишет:

Права в TDMS определяются совокупностью 2-х свойств:
1. Роль
2. Статус

Для того, чтобы понять, почему нельзя открыть ExecuteScript снаружи, необходимо, в первую очередь, обратиться к API Help:

object.ExecuteScript (Source, [ProcName], [Param1], [Param2], [Param3], [Param4], [Param5], [Param6], [Param7], [Param8], [Param9], [Param10])
,где
единственным обязательным параметром является:
"Source Обязательный. Значение Variant. Источник скрипта: команда, тип объекта, форма, выборка или код скрипта. "

Таким образом, если разрешить выполнение скрипта извне, то ЛЮБОЙ пользователь пишет простейший код:

For Each ObjDef in Application.ObjectDefs
  For Each Obj in ObjDef.Objects
[b]    Obj.Permissions = SysAdminPermissions
    Obj.Erase[/b]  
  Next
Next

и передаёт его параметром
И данный скрипт успешно удаляет ВСЕ объекты в системе, видимые пользователем.

А теперь ответьте, включить или оставить как есть?

1) Events останутся в любом случае (если пользователь не системный администратор)
2) Запретить передавать "код скрипта" в функцию.
3) Не вижу ни одного альтернативного решения своей задачи (см выше)

(изменено: Anatoly, 6 августа 2007г. 14:13:22)

Re: TDMS DS 3.0.99 TDMSApplication::ExecuteScript

SSV пишет:

1) Events останутся в любом случае (если пользователь не системный администратор)
2) Запретить передавать "код скрипта" в функцию.
3) Не вижу ни одного альтернативного решения своей задачи (см выше)

Если Вам не нужен 2-й пункт, то, несложно догадаться, что он нужен другим => появится тема "включите обратно "код скрипта"".
Что тогда я отвечу? - Извините, но SSV попросил для него выключить? Это во-первых.
Во вторых, насколько Вы должны понимать, код скрипта не единственная "дырка". Можно выполнить и другие скрипты... и везде, где стоят строки

on error resume next
permissions = sysadminpermissions

код будет выполняться вне зависимости от текущих прав доступа.

McZag пишет:

Вы видимо очень хороший программист.

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

По 3-му пункту: Вы же не попросили дать Вам совет по решению проблемы. Вы утверждаете, что это ошибка - Вам доказали обратное.
Если Вам нужен результат, то опишите цель к которой стремитесь и, с большой степенью вероятности, получите совет, или даже готовое решение.

Re: TDMS DS 3.0.99 TDMSApplication::ExecuteScript

Anatoly пишет:

Если Вам не нужен 2-й пункт, то, несложно догадаться, что он нужен другим => появится тема "включите обратно "код скрипта"".

Пример использования кода в аргументе ExecuteScript, если не сложно.

Anatoly пишет:

Что тогда я отвечу? - Извините, но SSV попросил для него выключить? Это во-первых.

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

Anatoly пишет:

Во вторых, насколько Вы должны понимать, код скрипта не единственная "дырка". Можно выполнить и другие скрипты... и везде, где стоят строки

Сейчас IMHO "код скрипта - единственная "дырка"" , т.к. "другие скрипты..." может создавать только системный администратор, => вызов "снаружи" не отличается от вызова "изнутри".

Anatoly пишет:

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

Не вижу связи с темой

Anatoly пишет:

По 3-му пункту: Вы же не попросили дать Вам совет по решению проблемы. Вы утверждаете, что это ошибка - Вам доказали обратное.

Перечитал тему - не нашел, где я утверждаю, что это ошибка. Я пытаюсь выяснить, почему в TDMS2 реализовано так, а в TDMS3 - иначе. Первый убедительный ответ - возможность передать "код скрипта". И резонный вопрос - а на хрена это надо ??

Anatoly пишет:

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

Цель к которой стремлюсь описана 27.07.2007, 14:35. Результат я получу в любом случае, просто с использованием ExecuteScript усилий придётся приложить существенно меньше по сравнению с альтернативными вариантами.

(изменено: Anatoly, 7 августа 2007г. 09:02:47)

Re: TDMS DS 3.0.99 TDMSApplication::ExecuteScript

SSV пишет:

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

А должны были?

Сейчас IMHO "код скрипта - единственная "дырка"" , т.к. "другие скрипты..." может создавать только системный администратор, => вызов "снаружи" не отличается от вызова "изнутри".
Не вижу связи с темой

Связь с темой в следующей цитате:

1) Events останутся в любом случае (если пользователь не системный администратор)

События то конечно остануться, но никто не отменит SysAdminPermissions. А некоторые события не будут отрабатывать, при разном коде скриптов.

Перечитал тему - не нашел, где я утверждаю, что это ошибка.

Однако запостили Вы её в раздел "Ошибки"

Я пытаюсь выяснить, почему в TDMS2 реализовано так, а в TDMS3 - иначе.

в TDMS2 и в TDMS3 ExecuteScript работает одинаково. Запрет в 2-й версии был введён более 1.5 года назад - и никто не жаловался.

Первый убедительный ответ - возможность передать "код скрипта". И резонный вопрос - а на хрена это надо ??

А остальные ответы Вас не убеждают?
Хорошо, опишу по-подробнее, если Вы не понимаете:
К примеру, есть глобальные команды:
1. Удаление объекта в "корзину"
2. Смена статуса на финальный
3. Создание версии
4. Добавление связей.

Так вот, любой пользователь  пересылает в данную команду Each Obj in ObjDef.Objects.......
В итоге можно парализовать работу TDMS.
Готов предложить спор, что если разрешить вызов, то нижепредставленные 8 строк выведут из строя ЛЮБУЮ Вашу базу:

On Error Resume Next
For Each command in TDMSApplication.Commands
  For Each ObjDef in TDMSApplication.ObjectDefs
    For Each Obj in ObjDef
      TDMSApplication.ExecuteScript command.SysName
    Next
  Next
Next

Причём, после выполнения данного скрипта, Вы никогда не сможете откатиться назад. Т.е. сможете, но только восстановив бэкап. По-другому - никак  ;)

Цель к которой стремлюсь описана 27.07.2007, 14:35. Результат я получу в любом случае, просто с использованием ExecuteScript усилий придётся приложить существенно меньше по сравнению с альтернативными вариантами.

К сожалению цели в вашем первом постинге я не вижу. Опишите проблему и что Вы хотите получить, как её пытаетесь решить. Может всё-таки есть другое, более правильное решение?

Re: TDMS DS 3.0.99 TDMSApplication::ExecuteScript

Anatoly пишет:

А должны были?

Microsoft советуется - "Помогите сделать Офис лучше"

Anatoly пишет:

События то конечно остануться, но никто не отменит SysAdminPermissions. А некоторые события не будут отрабатывать, при разном коде скриптов.

Имеется в виду журнал событий

Anatoly пишет:

Однако запостили Вы её в раздел "Ошибки"

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

Anatoly пишет:

в TDMS2 и в TDMS3 ExecuteScript работает одинаково. Запрет в 2-й версии был введён более 1.5 года назад - и никто не жаловался.

В какой версии TDMS2 и где информация об изменении была опубликована ?

Anatoly пишет:

А остальные ответы Вас не убеждают?
Хорошо, опишу по-подробнее, если Вы не понимаете:
К примеру, есть глобальные команды:
1. Удаление объекта в "корзину"
2. Смена статуса на финальный
3. Создание версии
4. Добавление связей.

Так вот, любой пользователь  пересылает в данную команду Each Obj in ObjDef.Objects.......
В итоге можно парализовать работу TDMS.
Готов предложить спор, что если разрешить вызов, то нижепредставленные 8 строк выведут из строя ЛЮБУЮ Вашу базу:

On Error Resume Next
For Each command in TDMSApplication.Commands
  For Each ObjDef in TDMSApplication.ObjectDefs
    For Each Obj in ObjDef
      TDMSApplication.ExecuteScript command.SysName
    Next
  Next
Next

Причём, после выполнения данного скрипта, Вы никогда не сможете откатиться назад. Т.е. сможете, но только восстановив бэкап. По-другому - никак ;)

Я Вас просил привести пример ситуации, когда единственное решение - передать текст скрипта в функцию ExecuteScript. А в Вашем примере пользователь сможет выполнить команды "руками" (если они глобальные). А зачем пользователю "парализовывать работу TDMS", если 1) в журнале событий останутся записи о том, что диверсию совершил именно этот пользователь; 2) backup базы делается каждый день ?

Anatoly пишет:

К сожалению цели в вашем первом постинге я не вижу. Опишите проблему и что Вы хотите получить, как её пытаетесь решить. Может всё-таки есть другое, более правильное решение?

Посмотрите сообщение #5

(изменено: Anatoly, 7 августа 2007г. 13:20:58)

Re: TDMS DS 3.0.99 TDMSApplication::ExecuteScript

SSV пишет:

Microsoft советуется - "Помогите сделать Офис лучше"

  :D   :D   :D

Имеется в виду журнал событий

Ради интереса, проверьте, что запишется, а что нет... При выполнении команды и процедуры команды... Проверьтё.

Я Вас просил привести пример ситуации, когда единственное решение - передать текст скрипта в функцию ExecuteScript.

Ответ: Приведите пример, когда ВЫ МНЕ МОЖЕТЕ ОБОЙТИСЬ БЕЗ ExecuteScript извне.
Конечно АБСОЛЮТНО ЛЮБАЯ ситуация может быть реализована несколькими способами - НО! - это что-то меняет? Или из-за Вашей прихоти кому-то надо будет менять свои скрипты?

А зачем пользователю "парализовывать работу TDMS",

Вам ответили:

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

Отсюда пойдёт негатив и недовольство => Мы СПЕЦИАЛЬНО убираем у пользователя возможность где-нить накосячить.

Посмотрите сообщение #5:
Сейчас я использую для реализации двух вариантов пользовательского интерфейса: а) средствами TDMS; б) "user friendly" в виде inproc com server.

И что из этого сообщения я должен понять? Всё, что я понял, что Вы пытаетесь написать некую внешнюю приблуду - ничего более я не вижу. Как Вы её реализоваваете, для чего и как.

P.S.

А в Вашем примере пользователь сможет выполнить команды "руками" (если они глобальные).

Расскажите как? Есть большое различие между глобальными командами и командами на панели инструментов.
Более того, в 3-й версии ВСЕ команды - глобальные.

Re: TDMS DS 3.0.99 TDMSApplication::ExecuteScript

Anatoly пишет:

И что из этого сообщения я должен понять? Всё, что я понял, что Вы пытаетесь написать некую внешнюю приблуду - ничего более я не вижу. Как Вы её реализоваваете, для чего и как.

"Приблуд" никогда не писал и не собираюсь. Плагин, который я разработал уже работает более полутора лет в промышленной эксплуатации.

Anatoly пишет:

Или из-за Вашей прихоти кому-то надо будет менять свои скрипты?

Из-за Вашей прихоти мне надо менять свои

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

Некто получить несанкционированный доступ не может. Почему все упорно стараются употребить термин "некто" ? Мне казалось, что в TDMS используется аутентификация на основе хеша - не так ли ?

Anatoly пишет:

Отсюда пойдёт негатив и недовольство => Мы СПЕЦИАЛЬНО убираем у пользователя возможность где-нить накосячить.

Когда я перехожу улицу по пешеходному переходу, меня случайно может сбить машина - пожалуйста, СПЕЦИАЛЬНО уберите у водителей возможность ездить по тем улицам, где хожу я.

Anatoly пишет:

Ради интереса, проверьте, что запишется, а что нет... При выполнении команды и процедуры команды... Проверьтё.

IMHO если записываются разные события при удалении объекта через UI и при вызове TDMSObject::Erase - это баг

Вы не ответили :

В какой версии TDMS2 и где информация об изменении была опубликована ?

(изменено: Anatoly, 7 августа 2007г. 14:13:06)

Re: TDMS DS 3.0.99 TDMSApplication::ExecuteScript

SSV пишет:

Из-за Вашей прихоти мне надо менять свои

Я еще раз повторяю, что данная "дыра в безопасности" была исправлена более 1.5 года назад.

IMHO если записываются разные события при удалении объекта через UI и при вызове TDMSObject::Erase - это баг

А причём тут удаление? У нас вроде можно много как накосячить с админовскими правами, и без удаления объекта!

Вы не ответили :

У меня нет времени понимать эту инфу. Я взял полуторагодовалый билд - там этот Баг был исправлен.
P.S. Вы тоже не дали ответ:

Расскажите как? Есть большое различие между глобальными командами и командами на панели инструментов.

P.P.S. больше не имею желания Вам что-либо доказывать.
Пришел к выводу, что ничего кроме последнего предложения, написанного в постинге #6, Вам посоветовать не могу.

Re: TDMS DS 3.0.99 TDMSApplication::ExecuteScript

"дыра в безопасности"
IMHO "дыра в безопасности" - когда у пользователя есть возможность выполнить произвольный код. Если запретить функции ExecuteScript выполнять поизвольный код - не вижу угрозы безопасности, т.к. 1) все скрипты создаются системным администратором; 2) встроенные средства аудита действий пользователя.

Зачем нужен вызов ExecuteScript "снаружи":
Есть два варианта пользовательского интерфейса: 1) стандартные средства TDMS - объекты, формы ввода, команды (И1); 2) "user friendly" inproc com server (И2). И2 не реализуется средствами И1. И1 не устравает пользователя ввиду сложности процедуры обработки информации. И1 и И2 используют одну и ту же "бизнес-логику" сохраненную в БД.
плюсы: "бизнес-логика" реализуется один раз
минусы: вызов ExecuteScript со стороны И2 запрещён => "бизнес-логика" должна реализовываться дважды: а) в БД на VBScript, поскольку И1 нельзя запретить; б) в И2 (может использоваться практически любой язык программирования), поскольку пользователи работают через И2.

Finaly:
И почему мои клиенты должны платить за разработку и поддержку двух програмных модулей вместо одного ? А потому что Anatoly решил, что улицу мне можно переходить только в скафандре ? Anatoly, Вы мне оплатите половину работ по переводу моих клиентов на TDMS 3.0 ?

P.S Вот такая вот у нас "квалифицированная помощь"
P.S2 Anatoly, не утруждайте себя ответом

(изменено: Anatoly, 8 августа 2007г. 13:55:22)

Re: TDMS DS 3.0.99 TDMSApplication::ExecuteScript

SSV пишет:

P.S2 Anatoly, не утруждайте себя ответом

Отвечу по теме.

И1 не устравает пользователя ввиду сложности процедуры обработки информации.

SSV, Вы извините пожалуйста, но то, что Вы написали - это ТОЛЬКО ВАША проблема. Объясняю - ВАША задача, как програмиста-проектировщика: настроить ТДМС так, чтобы он был МАКСИМАЛЬНО удобен для конечного пользователя. Если Вы не в состоянии настроить ТДМС, чтобы он удовлетворял потребности и капризы пользователя, то не надо в этом винить ТДМС и его разработчиков - Это только ВАШИ ОШИБКИ РЕАЛИЗАЦИИ Технического задания клиента.

(изменено: Mishaf, 10 августа 2007г. 08:54:58)

Re: TDMS DS 3.0.99 TDMSApplication::ExecuteScript

Из всего вышесказанного ясно одно - Вызов ExecuteScript снаружи запрещён. Это не ошибка, а фитча. И будет работать так как есть.
Тему закрываю.