09.04.2009, 09:26 | #1 |
Участник
|
Сбой запроса на разрешение типа "FileIOPermission"
Добрый день.
Помогите, пожалуйста, с таким вопросом: Есть небольшой класс-наследник RunBaseBatch, выгружающий данные в текстовый документ. При запуске его вручную - все выполняется прекрасно, при запуске его в пакетном режиме вываливается ошибка: "Ошибка времени выполнения: AsciiIo Объект не инициализирован" При этом в инфолог пишется следующее: "Сбой запроса на разрешение типа "FileIOPermission". Вот код метода выгрузки: X++: void exportSmth() { str fileName; FileIoPermission perm; ; fileName = "c:\\test.txt"; perm = new FileIoPermission(fileName, "W"); perm.assert(); file = new AsciiIO(fileName,"W"); file.write("test"); CodeAccessPermission::revertAssert(); } Поиском пользовался, ответа в других темах, как мне показалось, не нашел. |
|
09.04.2009, 09:40 | #2 |
Участник
|
Цитата:
Из-под кого запускается пакетный режим? Есть ли у этого "кого" права на запись в этот файл? |
|
|
За это сообщение автора поблагодарили: Silphidae (1). |
09.04.2009, 09:58 | #3 |
Участник
|
Да, запускается на сервере. Из под кого знаю. Права у него есть. Спасибо.
Последний раз редактировалось Silphidae; 09.04.2009 в 10:03. |
|
09.04.2009, 10:03 | #4 |
Участник
|
Да, еще вот. Если я захожу на сервер под пользователем, который запускает пакетную обработку, и запускаю этот класс вручную - все делается нормально.
|
|
09.04.2009, 10:03 | #5 |
MCITP
|
Цитата:
Пользователь ОС, под которым запускается АОС...
__________________
Zhirenkov Vitaly |
|
|
За это сообщение автора поблагодарили: Silphidae (1). |
10.04.2009, 15:53 | #6 |
Участник
|
Проблема все еще не решена. Помогите, пожалуйста.
|
|
10.04.2009, 15:58 | #7 |
MCTS
|
Можно попробовать:
1) Перенести file = new AsciiIO(fileName,"W"); перед созданием perm = new FileIoPermission(fileName, "W"); либо перед perm.assert(); 2) Перенести объявление file из Classdeclaration внутрь этого метода. 3) Писать не в корневую директорию C: а скажем в папку C:\\Temp |
|
|
За это сообщение автора поблагодарили: Silphidae (1). |
10.04.2009, 16:05 | #8 |
MCTS
|
Еще вариант, если это только в пакете используется, так дайте классу модификатор client.
|
|
10.04.2009, 16:27 | #9 |
Участник
|
Предложенные три варианта не помогли.
А про модификатор можно подробнее, пожалуйста? |
|
10.04.2009, 16:50 | #10 |
Боец
|
А с правами точно всё ок?
Вставьте в код, где идет работа с файлом строки: info ("User: " + curUserId()); info(isRunningOnServer() ? "Server" : "client"); Если увидите эти инфологи - посмотрите, какой пользователь и права на доступ к файлу\директории |
|
|
За это сообщение автора поблагодарили: Poleax (1), Silphidae (1). |
10.04.2009, 17:24 | #11 |
Участник
|
У пользователя права есть. А вот isRunningOnServer() вернула true. Выходит, проблема именно в том, что класс запускается на сервере. Только не знаю, как ее решить.
|
|
10.04.2009, 17:52 | #12 |
Боец
|
Решается просто. Метод, который создаёт объект класса (обычно main или construct) должен выполняться на клиенте. А для этого должен иметь модификатор client:
X++: client static void main(Args args) X++: client static Tutorial_RunbaseBatch construct() Последний раз редактировалось DSPIC; 10.04.2009 в 17:55. |
|
|
За это сообщение автора поблагодарили: Silphidae (1). |
11.04.2009, 17:44 | #13 |
MCTS
|
Цитата:
А про модификатор можно подробнее, пожалуйста?
Цитата:
Возможно, ещё понадобится перекрыть метод canSwapBetweenCS и вернуть true
Однако, есть возможность запускать в пакете класс, так чтобы он работал и на сервере. Смотрите, под каким пользователем запускается АОС (у меня, network service). Добавляете этого пользователю в соответствующую группу в консоли управления компьютером (можно прямо в Администраторы). Перезапускаете АОС. Теперь файл в корневой директории диска С должен создаваться без проблем. Если же файл создавать не в корневой директории, а в папке, то все работает и без этого. В любом случае, проблема была связана с правами в винде. |
|
11.04.2009, 19:02 | #14 |
Боец
|
Цитата:
не понадобится. Там и так по умолчанию true возвращается.
"Возможно, ещё понадобится перекрыть метод canSwapBetweenCS и вернуть FALSE" |
|
13.04.2009, 12:35 | #15 |
Участник
|
Спасибо. Решение выставить свойство класса Run On в значение Client вместе с модификатором Client в main (хотя, возможно, это излишне) оказалось правильным. Спасибо еще раз.
|
|
13.04.2009, 13:37 | #16 |
MCTS
|
Цитата:
оказалось правильным.
|
|
13.04.2009, 14:11 | #17 |
Участник
|
Если уж на то пошло, вы считаете что давать учетной записи от которой запущен AOS права локального администратора на сервере
Цитата:
Очень спорный совет с точки зрения безопасности.
__________________
Dynamics AX 4.0 SP2 |
|
|
За это сообщение автора поблагодарили: Eldar9x (1), Silphidae (1). |
13.04.2009, 14:30 | #18 |
MCTS
|
Цитата:
Очень спорный совет с точки зрения безопасности.
Цитата:
Добавляете этого пользователю в соответствующую группу в консоли управления компьютером (можно прямо в Администраторы)
|
|
|
За это сообщение автора поблагодарили: Silphidae (1). |
Теги |
asciio, ax4.0, fileiopermission, security, безопасность |
|
|