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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 07.08.2014, 20:16   #1  
iCloud is offline
iCloud
Enjoy!
Аватар для iCloud
MCP
Злыдни
 
195 / 112 (4) +++++
Регистрация: 06.03.2012
Цитата:
Сообщение от Dolores Посмотреть сообщение
В связи с ограниченным количеством пользовательских лицензий (Axapta 2009) поступила задача при запуске сеанса определенным пользователем (допустим программист или директор) автоматически завершать одну из активных сессий, чтобы данный пользователь мог всегда иметь доступ в программу.
Можно ли это реализовать?
Класс Application доработать не получится, т.к. если лицензий не хватает, мы в него даже не попадаем...
Сделайте, чтобы последнюю лицензию мог забрать только определенный человек - директор
А если он её уже забрал, то не ограничивать.
Старый 19.08.2014, 12:49   #2  
Dolores is offline
Dolores
Участник
Аватар для Dolores
 
65 / 14 (1) ++
Регистрация: 15.07.2010
А как лучше проводить мониторинг активности пользователей, чтобы определить делает ли пользователь что-то в программе или просто сеанс открыл ? По какой таблице? К журналу базы данных нельзя привязаться, т.к. не все действия пользователей журнализируются...
Старый 19.08.2014, 15:29   #3  
iCloud is offline
iCloud
Enjoy!
Аватар для iCloud
MCP
Злыдни
 
195 / 112 (4) +++++
Регистрация: 06.03.2012
Цитата:
Сообщение от Dolores Посмотреть сообщение
А как лучше проводить мониторинг активности пользователей, чтобы определить делает ли пользователь что-то в программе или просто сеанс открыл ? По какой таблице? К журналу базы данных нельзя привязаться, т.к. не все действия пользователей журнализируются...
На случай если пользователь ничего не делает - есть timeout сессии, тут придумывать не нужно.

В AX 2012 следующие методы реализуют подсчет числа активных сессий:
Info::licensedUsers(),
Info::licensedComUsers(),
так же в Info::licensedUsersTotal() идет подсчет.
Есть замечательный класс SysUserOnline:
X++:
server static container getAllOnlineUserInfo()
{
    int num;
    int idleTicks;
    container users;
    xSession session;
    UserInfo userInfo;
    AOSClientMode clientMode;
    SysClientSessions clientSessions;
    ;

    num = 0;

    // SessionId field is not recognized
    // BP deviation documented
    while select clientSessions where
    //clientSessions.Status == SessionState::Running || clientSessions.Status == SessionState::Killed
    clientSessions.Status == SessionStatus::Running
    || clientSessions.Status == SessionStatus::Killed
    || clientSessions.Status == SessionStatus::MarkedAsKill
    {
        session = new xSession(clientSessions.SessionId);
        if(clientSessions.UserId)
        {
            select firstonly userInfo
                where userInfo.Id == clientSessions.UserId;

            if (userInfo) //If no SYS_OPEN_DOMAIN access they should not be shown
            {
                num++;
                clientMode = AOSClientMode::Thin;
                idleTicks = 0;

                users += [[clientSessions.SessionId,
                           clientSessions.UserId,
                           clientSessions.ClientType,
                           DateTimeUtil::applyTimeZoneOffset(clientSessions.LoginDateTime, DateTimeUtil::getUserPreferredTimeZone()),
                           clientSessions.ClientComputer,
                           session.databaseSpid(),
                           userInfo.Name,
                           clientMode,
                           idleTicks
                           ]];
            }
        }
    }
    users = [users,num];
    return users;
}
Ограничить количество входов одного пользователя. В классе Info:
X++:
void startupPost()
{
    int         counter;
    int         num = 0;
    int         maxSessions = Info::licensedUsersTotal();
    xSession    session;
    UserInfo    userInfo;
    UserId      currentUserId;
    ;

    currentUserId = curuserid();
    for(counter = 1; counter < maxSessions;counter++ )
    {
        session = new xSession(counter, true);
        if(session && session.userId())
        {
            select firstOnly userInfo
                where userInfo.id == session.userId();

            if (userInfo && (currentUserId == session.userId()))
            {  
                num++ ;
            }
        }
    }

    if (num > 1)
    {
        if(ox::yesno("Вы пытаетесь посторно войти пот тем же именем пользователя, а это не разрешается. Все равно войти?",
                   DialogButton::Yes, "Войти", "Выйти") == DialogButton::No)
        {
            infolog.shutDown(true);
        }
    }
}

Последний раз редактировалось iCloud; 19.08.2014 в 15:33.
Старый 19.08.2014, 15:54   #4  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,343 / 3563 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Цитата:
Сообщение от Dolores Посмотреть сообщение
А как лучше проводить мониторинг активности пользователей, чтобы определить делает ли пользователь что-то в программе или просто сеанс открыл ? По какой таблице? К журналу базы данных нельзя привязаться, т.к. не все действия пользователей журнализируются...
Один из вариантов решения - в этой теме Функционал отправки клиентских сообщений и не только
Здесь можно снять скриншот экрана у любого пользователя.

Второй вариант решения - это написать тулзу а-ля регистратор задач (Task Recorder), которая будет логировать действия пользователя.
Соответственно - ее можно вставить в метод \Classes\ClassFactory.formRunClass(), в RunBase - и тогда все эти вызовы можно будет логировать.
Но этот вариант решения хорош только в том случае, когда Вам нужно промониторить конкретного пользователя или конкретный объект в АОТе (например, сколькими пользователями используется эта форма). Логировать все подряд по всем объектам - мне кажется будет излишней нагрузкой на систему.
__________________
Возможно сделать все. Вопрос времени
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Проверка количества товара с помощью методов в InventSum MaxHammer DAX: Программирование 9 28.02.2013 12:37
Проверка ВР не заглядывает внутрь расширенных типов-массивов glibs DAX: Программирование 0 26.01.2010 20:16
Проверка целостности coja DAX: Администрирование 6 06.09.2006 13:14
Проверка количества в заказе PMS DAX: Программирование 2 01.11.2005 09:58
Проверка количества компаний в 3.0 CIS SP3 Valery DAX: Администрирование 16 20.04.2005 17:29

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

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

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