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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 06.08.2014, 14:54   #1  
Dolores is offline
Dolores
Участник
Аватар для Dolores
 
65 / 14 (1) ++
Регистрация: 15.07.2010
Проверка количества лицензий
В связи с ограниченным количеством пользовательских лицензий (Axapta 2009) поступила задача при запуске сеанса определенным пользователем (допустим программист или директор) автоматически завершать одну из активных сессий, чтобы данный пользователь мог всегда иметь доступ в программу.
Можно ли это реализовать?
Класс Application доработать не получится, т.к. если лицензий не хватает, мы в него даже не попадаем...
Старый 06.08.2014, 15:22   #2  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,427 / 1771 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от Dolores Посмотреть сообщение
Класс Application доработать не получится, т.к. если лицензий не хватает, мы в него даже не попадаем...
Я думаю, что выкинуть пользователя из аксапты внешними средствами не получится.
Я бы мыслил в сторону следующей схемы:
Придерживать как минимум одно свободное место для vip-пользователей, искусственно выкидывая входящих пользователей (модификация класса Application). Если место занимает vip-пользователь, то выкидывать кого-то из тех кто уже работает, все равно освобождая одно место для вновь входящих.
Старый 06.08.2014, 16:06   #3  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5788 (200) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Цитата:
Сообщение от Dolores Посмотреть сообщение
В связи с ограниченным количеством пользовательских лицензий (Axapta 2009) поступила задача при запуске сеанса определенным пользователем (допустим программист или директор) автоматически завершать одну из активных сессий, чтобы данный пользователь мог всегда иметь доступ в программу.
Программист в той же рабочей системе обычно не является приоритетным пользователем - у него есть разработка и тест. Если доступ нужен администратору Аксапты - тогда еще может быть, и то вопрос, зачем. Очень многие вещи можно решать извне системы, включая мониторинг активности и проч., а для работ наподобие переноса модификаций или настройки прав доступа можно выделить регламентированное временное окно, которое должно приходиться на периоды минимальной активности пользователей.
Что же касается доступа директора - это вообще интересная тема По аналогии с каким-нить производственным процессом: надо директору пройти по цеху - а там толпа рабочих суетится, ну так ведь можно охрану позвать, пускай вытолкают кого-нить взашей. Ничего что рабочий в это время на станке детальку вытачивал, или в форму расплавленный металл заливал, или краник цистерны с реагентами закручивал, и в итоге работа пропала...

PS. Для 2009-й есть дешевые лицензии на тот же Business Connector, часть задач по мониторингу и каким-то регламентным операциям можно выполнять через него, поскольку обычные пользователи используют другой тип лицензий. Также можно настроить автоматическое завершение пользовательских сессий по таймауту и программно ограничить возможность запускать несколько клиентов под одним пользователем. А грубо выкидывать работающих пользователей из системы - это вот как с проходом по цеху в примере выше...
За это сообщение автора поблагодарили: S.Kuskov (1).
Старый 06.08.2014, 22:54   #4  
pitersky is offline
pitersky
северный Будда
Аватар для pitersky
Ex AND Project
Соотечественники
 
1,486 / 408 (16) +++++++
Регистрация: 26.09.2007
Адрес: Солнечная система
Я думаю, что при именно такой реализации вы утонете в море негатива. Как определить, какая именно сессия должна быть завершена? На основании каких критериев?
Я бы лучше копал в сторону мониторинга активности пользователей. Когда лицензий не хватает - очень многие запускают аксапту "на всякий случай", ничего в ней не делая.
__________________
С уважением,
Вячеслав
Старый 07.08.2014, 00:00   #5  
Omeo is offline
Omeo
Участник
 
129 / 50 (2) ++++
Регистрация: 18.03.2004
Адрес: Moscow
Цитата:
Сообщение от Dolores Посмотреть сообщение
Можно ли это реализовать?
я это делал не с помощью классов и тд, а просто заходил с помощью MSSQL Management Studio и удалял понравившуюся (или непонравившуюся) запись в SYSCLIENTSESSIONS

думаю, можно организовать что то в этом направлении
За это сообщение автора поблагодарили: S.Kuskov (1).
Старый 07.08.2014, 11:10   #6  
A_BAS is offline
A_BAS
Участник
Аватар для A_BAS
 
77 / 48 (2) +++
Регистрация: 19.04.2012
А чтобы уменьшить вероятность превышения количества лицензий можно использовать вот это
Автоматическое завершени сессии

Чтобы пользователи "ушедшие покурить", отваливались автоматом
Старый 07.08.2014, 11:54   #7  
Player1 is offline
Player1
Участник
Самостоятельные клиенты AX
 
305 / 137 (5) +++++
Регистрация: 21.04.2008
Цитата:
Сообщение от A_BAS Посмотреть сообщение
А чтобы уменьшить вероятность превышения количества лицензий можно использовать вот это
Автоматическое завершени сессии

Чтобы пользователи "ушедшие покурить", отваливались автоматом
Можно вопрос? - Если у пользователя без его участия строится долгий отчет, запущена долгоиграющая обработка допустим на ночь, сессия завершится по истечении таймера?
Старый 07.08.2014, 12:10   #8  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,427 / 1771 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от Player1 Посмотреть сообщение
Можно вопрос? - Если у пользователя без его участия строится долгий отчет, запущена долгоиграющая обработка допустим на ночь, сессия завершится по истечении таймера?
Долгие отчеты, и долгоиграющие обработки должны выполняться в пакетном режиме на сервере а не локально у пользователя.
Старый 07.08.2014, 15:04   #9  
A_BAS is offline
A_BAS
Участник
Аватар для A_BAS
 
77 / 48 (2) +++
Регистрация: 19.04.2012
Цитата:
Можно вопрос? - Если у пользователя без его участия строится долгий отчет, запущена долгоиграющая обработка допустим на ночь, сессия завершится по истечении таймера?
Эксперименты показывают что отчет строится, но сразу после вывода на экран сессия срубается.
На практике я бы не стал устанавливать таймаут для пользователей, которые запускают что-либо на ночь.
Старый 07.08.2014, 18:30   #10  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5788 (200) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Цитата:
Сообщение от Player1 Посмотреть сообщение
Если у пользователя без его участия строится долгий отчет, запущена долгоиграющая обработка допустим на ночь, сессия завершится по истечении таймера?
Выход по таймауту обрабатывается только в периоды простоя и никакие обработки не прерывает. Однако, хочу предостеречь на тему выставления слишком большого (больше 15-и минут) таймаута: при такой настройке весь этот функционал может не заработать, см. вот эти рассуждения.
Старый 07.08.2014, 20:16   #11  
iCloud is offline
iCloud
Enjoy!
Аватар для iCloud
MCP
Злыдни
 
195 / 108 (4) +++++
Регистрация: 06.03.2012
Адрес: Moscow/Ukraine/Malta
Цитата:
Сообщение от Dolores Посмотреть сообщение
В связи с ограниченным количеством пользовательских лицензий (Axapta 2009) поступила задача при запуске сеанса определенным пользователем (допустим программист или директор) автоматически завершать одну из активных сессий, чтобы данный пользователь мог всегда иметь доступ в программу.
Можно ли это реализовать?
Класс Application доработать не получится, т.к. если лицензий не хватает, мы в него даже не попадаем...
Сделайте, чтобы последнюю лицензию мог забрать только определенный человек - директор
А если он её уже забрал, то не ограничивать.
Старый 19.08.2014, 12:49   #12  
Dolores is offline
Dolores
Участник
Аватар для Dolores
 
65 / 14 (1) ++
Регистрация: 15.07.2010
А как лучше проводить мониторинг активности пользователей, чтобы определить делает ли пользователь что-то в программе или просто сеанс открыл ? По какой таблице? К журналу базы данных нельзя привязаться, т.к. не все действия пользователей журнализируются...
Старый 19.08.2014, 15:29   #13  
iCloud is offline
iCloud
Enjoy!
Аватар для iCloud
MCP
Злыдни
 
195 / 108 (4) +++++
Регистрация: 06.03.2012
Адрес: Moscow/Ukraine/Malta
Цитата:
Сообщение от 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   #14  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,273 / 3466 (122) ++++++++++
Регистрация: 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, время: 13:45.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.