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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 26.11.2014, 11:04   #1  
ex3em is offline
ex3em
Участник
 
38 / 19 (1) ++
Регистрация: 22.07.2008
:( SysExcelApplication в пакетнике
Столкнулся с проблемой если код

X++:
    SysExcelApplication xl;
    SysExcelWorkbook    wbk;
    ;
    
    xl = SysExcelApplication_NET::construct( ClassRunMode::Server );
......
выполнять в классе, с выставленным RunOn Server все отрабатывает.
Но если тот же код запустить в пакетнике, то выполнение валится с ошибкой в журнале

Олицетворенный на сервере (RunAs) сеанс попытался вызвать метод, который доступен только на клиенте.
(S)\Classes\DictClass\makeObject
(S)\Classes\ClassFactory\createClass - line 13
(S)\Classes\ClassFactory\makeObjectOnServer - line 3
(S)\Classes\SysExcelApplication_NET\construct - line 15

где

X++:
public static client server SysExcelApplication_NET construct(ClassRunMode _contructOnTier = ClassRunMode::Client)
{
    SysExcelApplication_NET ret;
    ;
    switch (_contructOnTier)
    {
        case ClassRunMode::Called :
        case ClassRunMode::ClientOrServer :
            ret = new SysExcelApplication_NET();
            break;
        case ClassRunMode::Client :
            ret = classFactory::makeObjectOnClient( classnum(SysExcelApplication_NET) );
            break;
        case ClassRunMode::Server :
            ret = classFactory::makeObjectOnServer( classnum(SysExcelApplication_NET)     //это то место где валится (15 строка)
....

Помогите, уже 3 день пытаюсь в пакетнике запустить Эксель, перелопатил весь форум
Старый 26.11.2014, 11:23   #2  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Помнится, нужно было на всех штатных классах семейства SysExcel перебить свойство RunOn с Client на Called From.
Старый 26.11.2014, 11:30   #3  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,940 / 3229 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Может быть у вас сам класс все же остался client а не called from ?
Если пакетный аос отдельный то можно его рестартовать.
Старый 26.11.2014, 13:04   #4  
ex3em is offline
ex3em
Участник
 
38 / 19 (1) ++
Регистрация: 22.07.2008
перебил свойство RunOn с Client на Called From у всех sysExcel которые были в проекте SysExcel_via_NET
так же заменил в конструкторе SysExcelWorkbook

static client SysExcelWorkbook construct(...
на
static client server SysExcelWorkbook construct(...

и в конструкторе SysExcelWorkbooks тоже
static client
на
static client server

объект SysExcelApplication создается
но теперь почему-то (только в серверном режиме, в клиентском работает) перестает работать код после строки add

X++:
    SysExcelApplication xl;
    SysExcelWorkbook    wbk;
    ;

    xl = SysExcelApplication_NET::construct(ClassRunMode::Server);
    xl.visible( false );
    wbk = xl.workbooks().add(); //здесь перестает выполняться
wbk.saveAs(DEV_xInfoDirectoryServer( DirectoryType::Temp ) + 'test.xls' ); // до этого уже не доходит
пролез дебагером в этом месте затык:
класс SysExcelWorkbooks_NET(установлен CalledFrom)
метод add()
в самом конце

X++:
    return SysExcelWorkbook::construct( version, null, workbooks_net.Add( template ) );
есть подозрение что ломается на workbooks_net.Add
повторюсь, в режиме xl = SysExcelApplication_NET::construct(ClassRunMode::Client);
все проходит отлично

А вот ломается следующим образом - просто перестает выполняться код дальше, как будь-то дальше кода нет. Excel при этом остается в памяти
Старый 26.11.2014, 13:18   #5  
Stitch_MS is offline
Stitch_MS
Участник
Аватар для Stitch_MS
Соотечественники
 
397 / 478 (16) +++++++
Регистрация: 27.02.2006
Адрес: Дания
Попробуйте отловить

X++:
System.Exception e; // declare
;
 
try
{
    ... code that can throw clr error
}
catch (Exception::CLRError)
{
    e = CLRInterop::getLastException();
 
    while( e )
    {
        info( e.get_Message() );
        e = e.get_InnerException();
    }
}
За это сообщение автора поблагодарили: ex3em (1).
Старый 26.11.2014, 14:51   #6  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Цитата:
Сообщение от ex3em Посмотреть сообщение
почему-то (только в серверном режиме, в клиентском работает) перестает работать код после строки add
X++:
xl = SysExcelApplication_NET::construct(ClassRunMode::Server);
xl.visible( false );
wbk = xl.workbooks().add(); //здесь перестает выполняться
wbk.saveAs(DEV_xInfoDirectoryServer( DirectoryType::Temp ) + 'test.xls' ); // до этого уже не доходит
просто перестает выполняться код дальше, как будь-то дальше кода нет. Excel при этом остается в памяти
Есть подозрение, что в этом месте Excel показывает какой-то диалог и ждет ответа. Все диалоги офисных приложений логируются в eventlog, посмотрите там. Попробуйте перед Add() сделать вызов xl.displayAlerts(false). Также см. Сохранение документа Excel
Старый 26.11.2014, 15:26   #7  
ex3em is offline
ex3em
Участник
 
38 / 19 (1) ++
Регистрация: 22.07.2008
попробовал try catch -
catch (Exception::CLRError) - ловится
но без сообщений .
xl.displayAlerts(false); - ставил перед add - не помогло

Также см. Сохранение документа Excel - был изучен вчера, все настройки вчера сделал.

eventlog - то же без сообщений (во всех разделах смотрел)
Старый 26.11.2014, 15:51   #8  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Если при вызове xl.workbooks().add() возникает исключение CLRError, вероятнее всего, проблема в доступе Excel к каким-либо файлам или каталогам. В этой ситуации можно взять Process Explorer и посмотреть, какие неуспешные операции с фалами есть у процесса Excel непосредственно перед "зависанием".
За это сообщение автора поблагодарили: Logger (3), Stitch_MS (3), ex3em (1).
Старый 27.11.2014, 10:35   #9  
ex3em is offline
ex3em
Участник
 
38 / 19 (1) ++
Регистрация: 22.07.2008
Победа, нашелся затык
с помощью Process Explorer выяснилось что в серверном режиме, при создании книги add, Excel активно начинает использовать папку
C:\Windows\SysWOW64\config\systemprofile\AppData\Local\Microsoft\Windows\Temporary Internet Files
все процессы запущенные в серверном режиме выполняются от имени Network Service.
Дать права на папку Temporary Internet Files не удается, нет вкладки Security,
Дал права для Network Service в консоле Local Users And Group - управлении компьютером. Добавил Network Service в группу Power Users. Все заработало.

Спасибо гуру за помощь!!!
без вас я бы не добрался до решения проблемы!
За это сообщение автора поблагодарили: Logger (1).
Старый 27.11.2014, 14:17   #10  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Здорово, что все в итоге заработало, но для истории - небольшие уточнения.
Цитата:
Сообщение от ex3em Посмотреть сообщение
выяснилось что в серверном режиме, при создании книги add, Excel активно начинает использовать папку
C:\Windows\SysWOW64\config\systemprofile\AppData\Local\Microsoft\Windows\Temporary Internet Files
Ну вот, а говорите, что
Цитата:
Сообщение от ex3em Посмотреть сообщение
Сохранение документа Excel - был изучен вчера, все настройки вчера сделал.
А там как раз указывается необходимость настройки доступа на пару каталогов в системном профиле.
Цитата:
Сообщение от ex3em Посмотреть сообщение
все процессы запущенные в серверном режиме выполняются от имени Network Service.
Это не совсем так. В данном случае АОС активирует Excel через DCOM. Под какой учетной записью при этом будет работать Excel, задается в настройках DCOM для него:
Цитата:
Сообщение от gl00mie Посмотреть сообщение
Здесь я исхожу из того, что на вкладке Identity мы выбрали запуск DCOM-сервера под тем пользователем, который собственно его запускает (The launching user) - это логично, раз мы решили ограничить права самого AOS'а.
То, что у вас доступ идет от имени Network Service, говорит о том, что либо в DCOM-настройках указано запускать Excel под Network Service, либо указано запускать его под тем же, кто активирует DCOM-сервер, и при этом под Network Service у вас работает AOS.
Цитата:
Сообщение от ex3em Посмотреть сообщение
Дать права на папку Temporary Internet Files не удается, нет вкладки Security, Дал права для Network Service в консоле Local Users And Group - управлении компьютером. Добавил Network Service в группу Power Users. Все заработало.
Можно дать права на вышележащий каталог
%SystemRoot%\SysWOW64\config\systemprofile\AppData\Local\Microsoft\Windows, а вот добавлять Network Service в группу Power Users - необдуманно с т.з. безопасности и принципа минимально необходимых привилегий. Network Service - это специальная "бесправная" учетная запись, единственное существенное право которой - аутентифицироваться на других хостах под учеткой "своего" хоста. В то же время, входя в Power Users, можно легко стать локальным администратором, а это фактически выводит Network Service на уровень Local System (не путать с Local Service).
За это сообщение автора поблагодарили: Logger (3).
Старый 27.11.2014, 16:33   #11  
ex3em is offline
ex3em
Участник
 
38 / 19 (1) ++
Регистрация: 22.07.2008
Каюсь. Я давал права на данные папки для группы учетных записей AOS. Однако оказалось, прав на эти папки не хватало именно Network Service. Убрал Network Service из группы Power Users - все работает.
Почему идет запуск от Network Service, буду разбираться.
Решение с добавлением в Power Users меня тоже не устраивало.
Спасибо.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Взаимодействие с Excel через .NET (семейство классов SysExcel) gl00mie DAX: Программирование 102 11.08.2022 17:09
Возможно ли создать документ Excel из X++ smailik DAX: Программирование 6 15.05.2012 18:22
hariprasadp: Import Excel file data in to dynamics AX through Dynamics AX Blog bot DAX Blogs 0 17.12.2009 20:05
диалоговое окно при закрытии файла Excel chanchala DAX: Программирование 8 26.08.2008 13:27
"Серверный" экземпляр класса SysExcelApplication Bug DAX: Программирование 4 13.01.2006 13:32

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 08:04.