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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 18.11.2008, 13:16   #1  
petergunn is offline
petergunn
Участник
 
118 / 274 (10) ++++++
Регистрация: 30.08.2005
Адрес: Tyumen
Тестирование прав пользователей. DAX 4.0.
С согласия автора первоначальной реализации, после некоторой модификации выкладываю проект для тестирования прав групп пользователей и настроек RLS использовавшийся на внедрении Dynamics Ax 4.0. Фактически это программный запуск клиента Dynamics Ax под некоторым логином (что ранее практиковалось консультантами в 3.0 для целей проверки прав).
Основная идея реализации основана на временной подмене SID для тестируемого логина пользователя Dynamics Ax:
Amand: Доступ в Microsoft Dynamics AX 4.0 без Active Directory

В параметрах необходимо указать конфигурационный файл (экспортировать из Microsoft Dynamics AX Configuration Utility) с которым запускалось приложение.
Вложения
Тип файла: zip SharedProject_UserRunAs.zip (5.8 Кб, 358 просмотров)
За это сообщение автора поблагодарили: mazzy (2), belugin (6), Pustik (3), sukhanchik (8), Logger (6), jasper (1), farlander (1), longson (2), shogel (1), V777 (1).
Старый 07.02.2009, 13:55   #2  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,311 / 3547 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Навеяло этой темой. Решил выложить модификацию сей утилиты (да простят меня ее авторы, что я ее немного переработал)
Исходная версия утилиты работала следующим образом:
1. Подменялся SID у нужного пользователя
2. Запускалась новая Аксапта с параметром /WAIT, т.е. исходное приложение ожидало завершение нового приложения
3. SID менялся обратно.

У данного алгоритма есть 2 существеных недостатка.
1. Если что-то где-то как-то сбойнет и исходное приложение вылетит до завершения нового, то потом придется ручками в БД возвращать на место SIDы
2. Как показала практика - не стоит трогать SID у пользователя Admin, т.к. это может привести к результатам из п.1

Ну и конечно - хочется чтобы была одна кнопка на стандартной форме пользователей.

В связи с этим - алгоритм изменился на следующий:
1. Идет проверка на запрет запуска утилиты из под Admin-а и от имени Admin-а
2. Подменяется SID у тестируемого пользователя (как было)
3. Если Аксапта запускалась через конфигурационный файл (в командной строке был указан axc-шник) - то новая Аксапта запускается с этим же конфигурационным файлом. Если конфигурационного файла не было - то Аксапта запускается с тем же портом, что и исходная, но в usr-слое и другими параметрами по умолчанию. Аксапта запускается без параметра WAIT, т.е. исходное приложение не ожидает завершения нового.
4. После запуска новой Аксапты исходная система "ловит" новую запись этого SIDа, сделанную в таблице SysClientSessions. В процессе "ловли" она ждет 10 секунд появления этой записи. Если не дожидается - то выдает запрос - "Подождать/Отменить?", после чего либо снова ждет, либо возвращает SIDы на место. В любом случае - либо после отмены в запросе, либо после перехвата записи - исходный SID возвращается на место.

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

Ну и конечно все вынесено в отдельную кнопку, которая вешается на стандартную форму SysUserInfo (\Администрирование\Пользователи).
Вложения
Тип файла: zip SysRunAsAxInstance.zip (8.7 Кб, 312 просмотров)
__________________
Возможно сделать все. Вопрос времени
За это сообщение автора поблагодарили: raz (10), Pustik (3), Logger (2).
Старый 07.02.2009, 15:47   #3  
Vadik is offline
Vadik
Модератор
Аватар для Vadik
Лучший по профессии 2017
Лучший по профессии 2015
 
3,631 / 1849 (69) ++++++++
Регистрация: 18.11.2002
Адрес: гражданин Москвы
Я сейчас наверное какую-нибудь глупость спрошу, но Run as на уже настроенном ярлыке чем не устраивает?
__________________
-ТСЯ или -ТЬСЯ ?
Старый 07.02.2009, 16:03   #4  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,311 / 3547 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Необходимость сей утилиты осознаешь - когда настраиваешь права пользователей.

RunAs обладает 2 недостатками:
1. Нужно знать пароль пользователя (внедренец будет собирать пароли пользователей, особенно после запуска?)
2. Нужно иметь этого пользователя в AD (заказчик прям так и кидается дать внедренцу полные права в AD ). Либо (если дело происходит на локале) - надо создавать кучу пользователей самому (особенно, если тестируется функционал, напрямую зависящий от различных ролей пользователей)
А так - можно иметь тестового пользователя и на нем отлаживать права групп пользователей, рлсы и т.д.
__________________
Возможно сделать все. Вопрос времени
Старый 09.02.2009, 10:18   #5  
Ivanhoe is offline
Ivanhoe
Участник
Аватар для Ivanhoe
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
4,143 / 2156 (80) +++++++++
Регистрация: 29.09.2005
Адрес: Санкт-Петербург
Цитата:
Сообщение от Vadik Посмотреть сообщение
Я сейчас наверное какую-нибудь глупость спрошу, но Run as на уже настроенном ярлыке чем не устраивает?
А можно по-подробнее, как сделать Run as на ярлыке? На ax32.exe - понятно, а как на *.axc? или на *.cmd, когда много разных версий Аксапты?
__________________
Ivanhoe as is..
Старый 09.02.2009, 11:17   #6  
AlexArh is offline
AlexArh
Участник
 
26 / 25 (1) +++
Регистрация: 29.01.2006
Цитата:
Сообщение от Ivanhoe Посмотреть сообщение
А можно по-подробнее, как сделать Run as на ярлыке? На ax32.exe - понятно, а как на *.axc? или на *.cmd, когда много разных версий Аксапты?
Вместо прямого запуска *.axc используйте ярлык на ax32.exe с указанием файла конфигурации в качестве параметра. Что то вроде:
"C:\Program Files\Microsoft Dynamics AX\40\Client\Bin\Ax32.exe" "Путь\Конфиг_Файл.axc"
За это сообщение автора поблагодарили: Ivanhoe (1).
Старый 09.02.2009, 13:00   #7  
blokva is offline
blokva
Пенсионер
Аватар для blokva
SAP
NavAx Club
 
743 / 167 (7) ++++++
Регистрация: 04.06.2003
Адрес: Беларусь
Цитата:
Сообщение от Ivanhoe Посмотреть сообщение
А можно по-подробнее, как сделать Run as на ярлыке? На ax32.exe - понятно, а как на *.axc? или на *.cmd, когда много разных версий Аксапты?
можно, например, вот такой .cmd файлик забомбить:
PHP код:
runas /savecred /user:userName@domainName "\"C:\Program Files\Microsoft Dynamics AX\40\Client\Bin\Ax32.exe\" \"С:\Program Files\Microsoft Dynamics AX\40\Client\work4.axc\"" 
первый раз спросит пароль а потом запомнит (если политика позволяет конечно )
__________________
Законы природы еще никто не отменял!
А еще у меня растет 2 внучки!!! Кому интересно подробности тут:
http://www.baby-shine.com/
За это сообщение автора поблагодарили: Logger (2), Ivanhoe (1).
Старый 30.03.2012, 18:51   #8  
Link is offline
Link
Британский учённый
Аватар для Link
Соотечественники
 
568 / 523 (19) +++++++
Регистрация: 25.11.2005
Адрес: UK
Записей в блоге: 9
Цитата:
Сообщение от sukhanchik Посмотреть сообщение
Навеяло этой темой. Решил выложить модификацию сей утилиты (да простят меня ее авторы, что я ее немного переработал)
Исходная версия утилиты работала следующим образом:
1. Подменялся SID у нужного пользователя
2. Запускалась новая Аксапта с параметром /WAIT, т.е. исходное приложение ожидало завершение нового приложения
3. SID менялся обратно.

У данного алгоритма есть 2 существеных недостатка.
1. Если что-то где-то как-то сбойнет и исходное приложение вылетит до завершения нового, то потом придется ручками в БД возвращать на место SIDы
2. Как показала практика - не стоит трогать SID у пользователя Admin, т.к. это может привести к результатам из п.1

Ну и конечно - хочется чтобы была одна кнопка на стандартной форме пользователей.

В связи с этим - алгоритм изменился на следующий:
1. Идет проверка на запрет запуска утилиты из под Admin-а и от имени Admin-а
2. Подменяется SID у тестируемого пользователя (как было)
3. Если Аксапта запускалась через конфигурационный файл (в командной строке был указан axc-шник) - то новая Аксапта запускается с этим же конфигурационным файлом. Если конфигурационного файла не было - то Аксапта запускается с тем же портом, что и исходная, но в usr-слое и другими параметрами по умолчанию. Аксапта запускается без параметра WAIT, т.е. исходное приложение не ожидает завершения нового.
4. После запуска новой Аксапты исходная система "ловит" новую запись этого SIDа, сделанную в таблице SysClientSessions. В процессе "ловли" она ждет 10 секунд появления этой записи. Если не дожидается - то выдает запрос - "Подождать/Отменить?", после чего либо снова ждет, либо возвращает SIDы на место. В любом случае - либо после отмены в запросе, либо после перехвата записи - исходный SID возвращается на место.

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

Ну и конечно все вынесено в отдельную кнопку, которая вешается на стандартную форму SysUserInfo (\Администрирование\Пользователи).
Спасибо!
Обновил для 2009 версии. Тестировалось на SP1 RU7.
Вложения
Тип файла: xpo SharedProject_DEV_RunAs.xpo (69.2 Кб, 696 просмотров)
__________________
Людям физического труда для восстановления своих сил нужен 7-8 часовой ночной сон. Людям умственного труда нужно спать часов 9-10. Ну а программистов будить нельзя вообще.
За это сообщение автора поблагодарили: coolibin (2), propeller (1).
Старый 25.12.2012, 10:06   #9  
kalex is offline
kalex
Участник
 
132 / 20 (1) +++
Регистрация: 18.05.2002
Адрес: Москва
Перенес проект на AX 2012
Тот же самый проект, перенесенный на AX 2012.
Вложения
Тип файла: xpo SharedProject_DEV_RunAs_AX2012.xpo (88.5 Кб, 499 просмотров)
За это сообщение автора поблагодарили: Logger (3).
Старый 19.11.2014, 16:13   #10  
Oz is offline
Oz
Участник
Аватар для Oz
 
293 / 51 (2) ++++
Регистрация: 22.08.2002
Адрес: Москва
Цитата:
Сообщение от kalex Посмотреть сообщение
Тот же самый проект, перенесенный на AX 2012.
Коллеги! А есть ли у кого-нибудь положительный опыт использования это утилиты на DAX 2012?
Как я вижу, сессия под другим пользователем запускается. Однако, так как непосредственно после её старта запускающая сессия должна возвращать SID'ы пользователей на место, запущенная сессия оказывается нежизнеспособна - любые попытки что то открыть на ней приводят к немедленному падению.
Удалось ли кому-нибудь побороть этот эффект и таки воспользоваться этой полезной фичей?
__________________
Здесь могла быть Ваша реклама!
За это сообщение автора поблагодарили: Logger (1).
Старый 19.11.2014, 16:31   #11  
Ivanhoe is offline
Ivanhoe
Участник
Аватар для Ivanhoe
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
4,143 / 2156 (80) +++++++++
Регистрация: 29.09.2005
Адрес: Санкт-Петербург
У меня работает. После переноса на 2012 какую-то мелочь пришлось поправить в коде.
__________________
Ivanhoe as is..
Старый 19.11.2014, 16:56   #12  
Oz is offline
Oz
Участник
Аватар для Oz
 
293 / 51 (2) ++++
Регистрация: 22.08.2002
Адрес: Москва
Т.е. таких проблем сразу не было?
Уточню: у вас DAX 2012 R3?
Старый 19.11.2014, 17:22   #13  
Link is offline
Link
Британский учённый
Аватар для Link
Соотечественники
 
568 / 523 (19) +++++++
Регистрация: 25.11.2005
Адрес: UK
Записей в блоге: 9
Если вам нужно тестирование прав, то для 2012 МС выпустил утилиту Security Development Tool . Мы используем на R2, полёт нормальный.
__________________
Людям физического труда для восстановления своих сил нужен 7-8 часовой ночной сон. Людям умственного труда нужно спать часов 9-10. Ну а программистов будить нельзя вообще.
За это сообщение автора поблагодарили: Oz (1), Logger (2).
Старый 19.11.2014, 19:36   #14  
Ivanhoe is offline
Ivanhoe
Участник
Аватар для Ivanhoe
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
4,143 / 2156 (80) +++++++++
Регистрация: 29.09.2005
Адрес: Санкт-Петербург
Утилита хороша, но как проверить в ней пересечение нескольких ролей?

Привожу код метода, который у меня работал и на R2, и сейчас работает на R3.

X++:
public boolean runas(UserId _userId)
{
    UserInfo                            locUserInfo;
    UserInfo                            tmpUserInfo;

    UserInfo                            userInfoRunAs;
    UserInfo                            tmpUserInfoRunAs;

    FileName                            fileConfiguration;
    int                                 iResult;
    int64                               numSessions;
    SysClientSessions                   sysClientSessions;
    int                                 timeStart;
    OverwriteSystemfieldsPermission     permission;
    xInfo                               xInfo = new xInfo();

    #WinAPI
    #Admin
    ;

    if(_userid == curuserid() || _userId == #AdminUser || curuserid() == #AdminUser)
    {
        throw error("!!!"); // тут метка про невозможность запуска
    }

    permission = new OverwriteSystemfieldsPermission();
    permission.assert();

    tmpUserInfo.setTmp();  //  для временного хранения текущего состояния
    tmpUserInfoRunAs.setTmp();
    try
    {
        ttsbegin;
        locUserInfo = xUserInfo::find(true, curuserid());
        tmpUserInfo.data(locUserInfo);

        userInfoRunAs = xUserInfo::find(true, _userId);
        tmpUserInfoRunAs.data(userInfoRunAs);

        //  подменить network привязку login'а
        userInfoRunAs.networkDomain = locUserInfo.networkDomain;
        userInfoRunAs.networkAlias = locUserInfo.networkAlias;
        userInfoRunAs.sid = locUserInfo.sid;
        userInfoRunAs.enable = NoYes::Yes;

        if(userInfoRunAs.validateWrite())
           userInfoRunAs.update();

        //  отключить активность текущего пользователя
        locUserInfo.sid = '';
        locUserInfo.enable = NoYes::No;

        if(locUserInfo.validateWrite())
           locUserInfo.update();
        ttscommit;
    }
    catch
    {
        return false;
    }


    fileConfiguration = '"' + xInfo::configuration() + '"';
    if (!WinApi::fileExists(fileConfiguration))
    {
        fileConfiguration = '-aos2=' + strreplace(conpeek(SysEmailSMTPPassword::currentAOSInstance(), 1), '@', ':');
    }
    select count(RecId) from sysClientSessions
        where sysClientSessions.userId    == userInfoRunAs.Id   &&
              sysClientSessions.sid       == userInfoRunAs.sid  &&
              sysClientSessions.Status    == 1;
    numSessions = sysClientSessions.RecId;
    iResult = WinAPI::shellExecute(xInfo::componentName(), fileConfiguration, '', #ShellExeOpen, #SW_SHOWNORMAL, false);

    if (iResult)
    {
        sysClientSessions.disableCache(true);
        timeStart = timenow();
        do
        {
            select count(recId) from sysClientSessions
                where sysClientSessions.userId    == userInfoRunAs.Id   &&
                      sysClientSessions.sid       == userInfoRunAs.sid  &&
                      sysClientSessions.Status    == 1;
            if (abs(timenow() - timeStart) > 10)
            {
                if (box::yesNo("...", DialogButton::No) == DialogButton::Yes) // тут текст, что клиент не успел стартовать - ждать еще или нет
                {
                    timeStart = timenow();
                }
                else
                {
                    break;
                }
            }
        }
        while (sysClientSessions.RecId <= numSessions);
    }

    //  восстановить исходное состояние данных
    ttsbegin ;
    locUserInfo        = xUserInfo::find(true, curuserid());
    locUserInfo.enable = tmpUserInfo.enable;
    locUserInfo.sid    = tmpUserInfo.sid;
    locUserInfo.defaultPartition = tmpUserInfo.defaultPartition;

    if(locUserInfo.validateWrite())
       locUserInfo.update();

    userInfoRunAs                   = xUserInfo::find(true, _userId);
    userInfoRunAs.networkDomain     = tmpUserInfoRunAs.networkDomain;
    userInfoRunAs.networkAlias      = tmpUserInfoRunAs.networkAlias;
    userInfoRunAs.sid               = tmpUserInfoRunAs.sid;
    userInfoRunAs.enable            = tmpUserInfoRunAs.enable;
    userinfoRunAs.defaultPartition  = tmpUserInfoRunAs.defaultPartition;

    if(userInfoRunAs.validateWrite())
       userInfoRunAs.update();
    ttscommit;

    CodeAccessPermission::revertAssert();

    return !iResult;
}
__________________
Ivanhoe as is..
За это сообщение автора поблагодарили: Oz (2), Logger (1).
Старый 25.11.2014, 08:53   #15  
Lusietta is offline
Lusietta
Участник
 
4 / 10 (1) +
Регистрация: 18.02.2014
Добрый день, а как бы реализовать этот проект в 3.0?
Старый 25.11.2014, 10:22   #16  
raz is offline
raz
NavAx
Аватар для raz
NavAx Club
Лучший по профессии 2014
Лучший по профессии 2009
 
1,494 / 1065 (38) ++++++++
Регистрация: 22.07.2003
Адрес: МО
Цитата:
Сообщение от Lusietta Посмотреть сообщение
Добрый день, а как бы реализовать этот проект в 3.0?
Повторный логин без перезапуска аксапты
Старый 27.11.2014, 10:11   #17  
Lusietta is offline
Lusietta
Участник
 
4 / 10 (1) +
Регистрация: 18.02.2014
спасибо, буду пробовать
Старый 15.12.2014, 15:15   #18  
Link is offline
Link
Британский учённый
Аватар для Link
Соотечественники
 
568 / 523 (19) +++++++
Регистрация: 25.11.2005
Адрес: UK
Записей в блоге: 9
Цитата:
Сообщение от Ivanhoe Посмотреть сообщение
Утилита хороша, но как проверить в ней пересечение нескольких ролей?
Я добавляю нужные роли к тестируемой в узел Sub Roles. Так можно тестировать сразу несколько ролей. В принципе достаточно удобно.
__________________
Людям физического труда для восстановления своих сил нужен 7-8 часовой ночной сон. Людям умственного труда нужно спать часов 9-10. Ну а программистов будить нельзя вообще.
За это сообщение автора поблагодарили: Logger (3), Ivanhoe (3).
Теги
rls, run as, тестирование прав, права доступа, ax2009, ax4.0

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Организация доступа внешних веб-пользователей к DAX 4.0 alex55 DAX: Администрирование 1 07.06.2009 17:48
aEremenko: Тестирование производительности в DAX 4.0 Blog bot DAX Blogs 0 12.03.2008 16:05
при построении перекрёстных ссылок выдаётся сообщение об ошибках mmmax DAX: Программирование 10 21.01.2005 12:42
После установки прав на группу пользователей в 3-уровневой, просматриваю еще раз..... Сергей Щербак DAX: Администрирование 3 09.04.2004 16:56
Проблема при настройке прав пользователей на функциональные ключи? Мирослав DAX: Администрирование 1 17.07.2002 15:42
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

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

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