AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
DAX
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 18.08.2011, 16:23   #1  
novic is offline
novic
Axapta Retail User
Axapta Retail User
 
168 / 25 (0) +++
Регистрация: 14.04.2005
Програмно изменить createdBy
Добрый день!
Можно ли записать автора создавшего строку через job
X++:
    rhrmStaffListHistory.overwriteSystemfields(true);
    rhrmStaffListHistory.StartDate = startDate;
    rhrmStaffListHistory.StaffListRefRecId = rhrmStafflist.RecId;
    rhrmStaffListHistory.HistoryType = RHRMStaffListHistoryType::Disable;
    rhrmStaffListHistory.(fieldnum(rhrmStaffListHistory, createdBy)) = curuserid();
    rhrmStaffListHistory.doInsert();
так не получается.
Старый 18.08.2011, 16:35   #2  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,430 / 1772 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Только посредством прямого SQL

Если вам нужно не изменить уже вставленную запись, а подменить значение уже при вставке записи, то как вариант
можно запустить выполнение кода делающего вставку записи под нужной учёткой при помощи функции runAs.

Последний раз редактировалось S.Kuskov; 18.08.2011 в 16:42.
Старый 18.08.2011, 17:02   #3  
Mykola Galak is offline
Mykola Galak
Участник
 
40 / 39 (2) +++
Регистрация: 24.01.2008
Адрес: Copenhagen
Ваш код будет отлично работать если его выполнить на сервере. Джоб который запускается не через менюайтем всегда выполняется на клиенте. Соответственно задача сводится к тому как запустить код из джоба на сервере. Могу предложить два варианта:
1) вынести код из джоба в серверный метод. Вызвать этот серверный метод из джоба
2) создать меню айтем. Выставить ему свойство RunOn = Server. Открыть менюайтем, который в свою очередь запустит джобик на сервере
За это сообщение автора поблагодарили: S.Kuskov (3).
Старый 19.08.2011, 08:08   #4  
novic is offline
novic
Axapta Retail User
Axapta Retail User
 
168 / 25 (0) +++
Регистрация: 14.04.2005
Проделал предложенные варианты: - получаю ошибку -
"Сбой запроса на разрешение типа "OverwriteSystemfieldsPermission"."
DAX2009
Старый 19.08.2011, 08:14   #5  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,430 / 1772 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от novic Посмотреть сообщение
Проделал предложенные варианты: - получаю ошибку -
"Сбой запроса на разрешение типа "OverwriteSystemfieldsPermission"."
DAX2009
Вот что находит Google по запросу "OverwriteSystemfieldsPermission" http://blog.equalized.be/tag/overwri...ldspermission/
X++:
if(isRunningOnServer() && CurUserId() == "Admin")
{
    new OverwriteSystemfieldsPermission().assert();
 
    salesLine.overwriteSystemfields(true);
    
    salesLine.(fieldnum(SalesTable,CreatedDateTime))    = str2datetime( "2010/04/03 11:00:00" ,321 );
    salesLine.doInsert();
    salesLine.overwriteSystemfields(false);
 
    CodeAccessPermission::revertAssert();
}
Старый 19.08.2011, 08:31   #6  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,283 / 3491 (123) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Цитата:
Сообщение от novic Посмотреть сообщение
Проделал предложенные варианты: - получаю ошибку -
"Сбой запроса на разрешение типа "OverwriteSystemfieldsPermission"."
DAX2009
это значит, что что-то было не на сервере.
Нижеприведеннный пример замечательно работает с "клиентским" курсором (т.е. с курсором из формы)
X++:
static server void saveRecord(Common _record)
{
    ;
    new OverwriteSystemfieldsPermission().assert();
    _record.overwriteSystemfields(true);
    _record.update();
    _record.overwriteSystemfields(false);
    CodeAccessPermission::revertAssert();
}
__________________
Возможно сделать все. Вопрос времени
Старый 19.08.2011, 09:25   #7  
driller is offline
driller
Сам.AX
Аватар для driller
Самостоятельные клиенты AX
SAP
 
78 / 54 (2) ++++
Регистрация: 11.04.2007
Адрес: Санк-Петербург
Цитата:
Сообщение от novic Посмотреть сообщение
Можно ли записать автора создавшего строку через job
Простите, я может чего-то не понял, или ваш пример сильно утрирован.
В чём проблема то, разве createdBy не будет всегда равен curserid()?
Если же нет, зачем и по какому принципу вы собираетесь присваивать создателя записи,
или же ваш следующий вопрос будет звучать - как после всех темных дел почистить SysDatabaseLog…
Очень уж как то, вся эта затея подозрительно выглядит.
__________________
"Считать метафору доказательством, поток праздных слов источником истины, а себя оракулом - это заблуждение, свойственное всем нам."
Поль Валери
За это сообщение автора поблагодарили: S.Kuskov (1).
Старый 19.08.2011, 09:56   #8  
novic is offline
novic
Axapta Retail User
Axapta Retail User
 
168 / 25 (0) +++
Регистрация: 14.04.2005
дело было в этом -
new OverwriteSystemfieldsPermission().assert();


Спасибо. все получилось.



2 driller:
я хочу знать, кто запустил job создающий строку. job запускается по кнопке на форме.

Последний раз редактировалось novic; 19.08.2011 в 10:08.
Старый 19.08.2011, 10:04   #9  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,430 / 1772 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от novic Посмотреть сообщение
я хочу знать, кто запустил job создающий строку. job запускается по кнопке не форме.
И всего-то. Тогда всё на мнооого проще. Включите на таблице свойство CreatedBy
Старый 19.08.2011, 10:28   #10  
novic is offline
novic
Axapta Retail User
Axapta Retail User
 
168 / 25 (0) +++
Регистрация: 14.04.2005
Эх, Семен Семеныч... Как же я не заметил то, что оно выключено )
Старый 19.08.2011, 10:55   #11  
driller is offline
driller
Сам.AX
Аватар для driller
Самостоятельные клиенты AX
SAP
 
78 / 54 (2) ++++
Регистрация: 11.04.2007
Адрес: Санк-Петербург
Цитата:
Сообщение от novic Посмотреть сообщение
я хочу знать, кто запустил job создающий строку. job запускается по кнопке на форме.
Ещё раз простите, видно уже стареть стал, заговоры везде мерещатся

Просто вы своих в познаниях как то умудрились перепрыгнуть через одну ступеньку, упустив из виду это свойство таблицы,
и сразу взялись за полухакерских методы overWriteSystemFields().

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

Цитата:
Сообщение от novic Посмотреть сообщение
Эх, Семен Семеныч... Как же я не заметил то, что оно выключено )
Да оно вроде как даже не появляется в таблице без этого свойства.
__________________
"Считать метафору доказательством, поток праздных слов источником истины, а себя оракулом - это заблуждение, свойственное всем нам."
Поль Валери
Старый 19.08.2011, 13:18   #12  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5788 (200) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Цитата:
Сообщение от driller Посмотреть сообщение
А в отношении возможности жонглирования с createdBy, считаю что это дыра в безопасности системы
Отчего же? Если у кода есть возможность создавать записи через AOS и менять системные поля за счет доступности разрешения OverwriteSystemfieldsPermission, то с таким же успехом этот код может получить разрешение SqlStatementExecutePermission и изменить данные прямым SQL-запросом, минуя все аудиторские следы, журналы БД и проч.
Цитата:
Сообщение от driller Посмотреть сообщение
как можно верить аудиторскому следу, если с этим полем можно играть, как вздумается даже на уровне приложения,
и просто не могу представить
Аудиторский след отражает действия пользователя, а не программного кода, который пользователь выполняет. Для полноты ощущений там еще вроде есть возможность подписывать "следы" с помощью ЭЦП, что в общем случае одной подменой системного поля не обойдешь. А уж что программисты в приложении наворотили, это совсем другое дело. Может, при нажатии на безобидную кнопку где-нить в закрытых периодах проводки меняются или новые создаются в обход всех проверок стандартного приложения... Пользователь может об этом не знать, но это ведь не значит, что он из-за этого не должен фигурировать в авторах создания/изменения записей.
Цитата:
Сообщение от driller Посмотреть сообщение
для каких благих целей это можно использовать
Пример "подмены" значений системных полей можно найти в логировании входа пользователей в систему: там дата/время создания записей журнала работы пользователей немного корректируется. Аналогично, подмена автора создания записи может использоваться для "логирования" того, что действие произведено "в интересах" того или иного, а не текущего, пользователя, хотя это, конечно, какой-то нереалистичный сценарий. В любом случае, насколько я знаю, ядро не позволяет штатными средствами изменить системные поля с автором/датой/временем создания уже существующих записей - это намного важнее с точки зрения безопасности.
В целом, насколько я могу судить, в той же 4.0/2009 изменения с т.з Trustworthy Computing были продиктованы примерно такими соображениями:
  • Dynamics AX все больше становится интегрирована с внешними приложениями, подчас даже написанными сторонними разработчиками, не относящимися напрямую к организации, внедрившей у себя Dynamics AX;
  • если взаимодействие ограничивается обменом данными, то тут хватает обычной бизнес-логики для их проверки, и ничего дополнительно делать не нужно;
  • если взаимодействие идет, скажем, через Business Connector, то выполняемая бизнес-логика разделяется на две части: та, которая есть в приложении Dynamics AX, и та, которой в этом приложении нет, потому что она "зашита" в программу, дергающую Business Connector, а его можно "науськать" выполнить что угодно, в обход всех существующих в приложении Dynamics AX проверок.
  • из предыдущего пункта следует, что в общем случае "доверять" можно лишь коду, выполняемому на сервере, потому что сервер выполняет код приложения Dynamics AX, написанный "в интересах" организации и удовлетворяющий ее требованиям по безопасности и разного рода проверкам и ограничениям; если же на сервере нужно выполнить сторонний код (через COM/DLL/.NET), то на это опять же явно нужно запросить разрешение и в приложении указать, что разработчик отдает себе отчет в том, что он делает.
Именно исходя из таких соображений, по-моему:
  • все проверки и запросы разрешений, связанные с Code Access Security, актуальны только для серверного кода;
  • часть разрешений в принципе не может быть получена клиентским кодом (OverwriteSystemfieldsPermission, SqlStatementExecutePermission, SkipAOSValidationPermission, Uncheck::TableSecurityPermission и т.д.), и, соотв., определенный функционал не может выполняться на клиенте;
  • доступ к ряду таблиц принудительно проверяется на AOS'е с помощью методов aosValidateXX(), в т.ч. доступ на чтение данных.
Т.е. в ядре были реализованы механизмы для принудительного выноса части бизнес-логики на сервер с тем, чтобы эта логика была реализована в приложении Dynamics AX. Никому и в голову не приходило, что может понадобиться защищать систему на базе Dynamics AX от ее же собственного приложения, в котором кто-то что-то может наворотить полухакерскими методами. Для этого предназначен "ручной" контроль (просмотр) модификаций, поднимаемых на рабочее приложение, если эти модификации разработаны сторонними подрядчиками, а также проверка людей при приеме на работу, если модификации разрабатываются штатными сотрудниками.
За это сообщение автора поблагодарили: Pustik (2), sukhanchik (2), driller (2).
Старый 05.07.2012, 13:40   #13  
Pustik is offline
Pustik
Участник
 
807 / 372 (14) ++++++
Регистрация: 04.06.2004
Цитата:
Сообщение от driller Посмотреть сообщение
для каких благих целей это можно использовать,
Вот сегодня тоже была необходимость в такой нужде.У руководства появилось желание видеть дату создания номенклатуры, скажем для своих каких-то внутренних целей. А в справочнике номенклатур это поле установлено не было. Естественно всем очень хотелось видеть и дату создания старых номенклатур. Выручило то, что за номеклатурным справочником велся лог на создание номенклатуры. Чтобы привести все к человеческому виду, решили включить поле createdDateTime в номенклатурный справочник,а для старых номенклатур пробежаться job-ом по справочнику, заглянуть в лог на создание и вручную проставить дату создания из лога.

И вот сегодня натолкнулись на особенность, что системные поля createdBy и createdDateTime упорно не хотят обновляться, в то время как ModifiedBy и ModifiedDateTime успешно изменяются. Используем конструкцию :
X++:
static server void saveRecord(Common _record)
{
    ;
    new OverwriteSystemfieldsPermission().assert();
    _record.overwriteSystemfields(true);
    _record.update();
     CodeAccessPermission::revertAssert();
}
Есть подозрения, что в ядре поля типа created... просто исключены из списка обновляемых полей когда происходит update, они присутствуют в списке только при вставке (insert). С одной стороны вроде бы похоже на умную идею намертво закрыть возможность редактирования системных полей created..., c другой нафига оставили overwriteSystemfields с возможностью редактировать поля modified...
AX2009 RU5
__________________
-Ты в гномиков веришь?
-Нет.
-А они в тебя верят, смотри, не подведи их.

Последний раз редактировалось Pustik; 05.07.2012 в 13:59.
Старый 05.07.2012, 14:35   #14  
George Nordic is offline
George Nordic
Модератор
Аватар для George Nordic
Злыдни
 
4,479 / 1250 (50) ++++++++
Регистрация: 17.12.2003
Адрес: Moscow
Записей в блоге: 9
SQL.

С Уважением,
Георгий
Старый 05.07.2012, 15:01   #15  
Pustik is offline
Pustik
Участник
 
807 / 372 (14) ++++++
Регистрация: 04.06.2004
Цитата:
Сообщение от George Nordic Посмотреть сообщение
SQL.
Вы имеете в виду, что причина лежит в SQL?
После запуска Job-a
X++:
ttsbegin;
select forupdate Table1;
    Table1.Field1 = 'ggg';
    Table1.(fieldnum(Table1, modifiedBy)) = '11111';
    Table1.(fieldnum(Table1, createdBy)) = '11111';
    Utility_AN::OverwriteSystemfields(Table1);
    ttscommit;
трассировкой на SQL-е мы получили такое
..........UPDATE TABLE1 SET FIELD1=@P1,RECVERSION=@P2,MODIFIEDBY=@P3WHERE (((DATAAREAID=@P4) AND (RECID=@P5)) AND (RECVERSION=@P6))..............

а где CREATEDBY? Сама Аксапта не послала SQL-ю команду обновить CREATEDBY.

PS (метод OverwriteSystemfields один в один как я указал выше)
__________________
-Ты в гномиков веришь?
-Нет.
-А они в тебя верят, смотри, не подведи их.

Последний раз редактировалось Pustik; 05.07.2012 в 15:04.
Старый 05.07.2012, 15:21   #16  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
Цитата:
Сообщение от Pustik Посмотреть сообщение
Вы имеете в виду, что причина лежит в SQL?
Думаю они имели ввиду, что решать проблему следуют используя прямой сиквел...
__________________
Zhirenkov Vitaly
Старый 05.07.2012, 15:41   #17  
Pustik is offline
Pustik
Участник
 
807 / 372 (14) ++++++
Регистрация: 04.06.2004
Цитата:
Сообщение от ZVV Посмотреть сообщение
Думаю они имели ввиду, что решать проблему следуют используя прямой сиквел...
Деваться то конечно не куда больше. Но после кареты в телегу пересаживаться не очень хочется
__________________
-Ты в гномиков веришь?
-Нет.
-А они в тебя верят, смотри, не подведи их.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Достаточно ли изменить дату в таблицах inventTrans, inventTransPosting, VendPackingSlipJour? DmitryS DAX: Программирование 3 18.09.2008 14:37
Как изменить фамилию гл.буха в счет-фактуре? AX 3.0. Подскажите... Бриллиантик DAX: Функционал 5 07.05.2008 11:50
Кто может быть в состоянии изменить разрешение сгруппировать Admin? ist DAX in English 12 08.08.2007 00:36
Обработка накладной – функция изменить дату Sanya DAX: Функционал 2 05.08.2005 12:50
Как программно изменить к-во в строке заказа в форме SalesTable BorDark DAX: Программирование 2 13.01.2005 17:02

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 23:24.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.