![]() |
#1 |
Участник
|
Проверка количества лицензий
В связи с ограниченным количеством пользовательских лицензий (Axapta 2009) поступила задача при запуске сеанса определенным пользователем (допустим программист или директор) автоматически завершать одну из активных сессий, чтобы данный пользователь мог всегда иметь доступ в программу.
Можно ли это реализовать? Класс Application доработать не получится, т.к. если лицензий не хватает, мы в него даже не попадаем... |
|
![]() |
#2 |
Участник
|
Цитата:
Я бы мыслил в сторону следующей схемы: Придерживать как минимум одно свободное место для vip-пользователей, искусственно выкидывая входящих пользователей (модификация класса Application). Если место занимает vip-пользователь, то выкидывать кого-то из тех кто уже работает, все равно освобождая одно место для вновь входящих. |
|
![]() |
#3 |
Участник
|
Цитата:
Сообщение от Dolores
![]() В связи с ограниченным количеством пользовательских лицензий (Axapta 2009) поступила задача при запуске сеанса определенным пользователем (допустим программист или директор) автоматически завершать одну из активных сессий, чтобы данный пользователь мог всегда иметь доступ в программу.
Что же касается доступа директора - это вообще интересная тема ![]() PS. Для 2009-й есть дешевые лицензии на тот же Business Connector, часть задач по мониторингу и каким-то регламентным операциям можно выполнять через него, поскольку обычные пользователи используют другой тип лицензий. Также можно настроить автоматическое завершение пользовательских сессий по таймауту и программно ограничить возможность запускать несколько клиентов под одним пользователем. А грубо выкидывать работающих пользователей из системы - это вот как с проходом по цеху в примере выше... |
|
|
За это сообщение автора поблагодарили: S.Kuskov (1). |
![]() |
#4 |
северный Будда
|
Я думаю, что при именно такой реализации вы утонете в море негатива. Как определить, какая именно сессия должна быть завершена? На основании каких критериев?
Я бы лучше копал в сторону мониторинга активности пользователей. Когда лицензий не хватает - очень многие запускают аксапту "на всякий случай", ничего в ней не делая.
__________________
С уважением, Вячеслав |
|
![]() |
#5 |
Участник
|
|
|
|
За это сообщение автора поблагодарили: S.Kuskov (1). |
![]() |
#6 |
Участник
|
А чтобы уменьшить вероятность превышения количества лицензий можно использовать вот это
Автоматическое завершени сессии Чтобы пользователи "ушедшие покурить", отваливались автоматом |
|
![]() |
#7 |
Участник
|
Цитата:
Сообщение от A_BAS
![]() А чтобы уменьшить вероятность превышения количества лицензий можно использовать вот это
Автоматическое завершени сессии Чтобы пользователи "ушедшие покурить", отваливались автоматом |
|
![]() |
#8 |
Участник
|
Цитата:
![]() |
|
![]() |
#9 |
Участник
|
Цитата:
Можно вопрос? - Если у пользователя без его участия строится долгий отчет, запущена долгоиграющая обработка допустим на ночь, сессия завершится по истечении таймера?
На практике я бы не стал устанавливать таймаут для пользователей, которые запускают что-либо на ночь. |
|
![]() |
#10 |
Участник
|
Цитата:
|
|
![]() |
#11 |
Enjoy!
|
Цитата:
Сообщение от Dolores
![]() В связи с ограниченным количеством пользовательских лицензий (Axapta 2009) поступила задача при запуске сеанса определенным пользователем (допустим программист или директор) автоматически завершать одну из активных сессий, чтобы данный пользователь мог всегда иметь доступ в программу.
Можно ли это реализовать? Класс Application доработать не получится, т.к. если лицензий не хватает, мы в него даже не попадаем... ![]() А если он её уже забрал, то не ограничивать. |
|
![]() |
#12 |
Участник
|
А как лучше проводить мониторинг активности пользователей, чтобы определить делает ли пользователь что-то в программе или просто сеанс открыл ? По какой таблице? К журналу базы данных нельзя привязаться, т.к. не все действия пользователей журнализируются...
|
|
![]() |
#13 |
Enjoy!
|
Цитата:
В 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; } 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. |
|
![]() |
#14 |
Administrator
|
Цитата:
Здесь можно снять скриншот экрана у любого пользователя. Второй вариант решения - это написать тулзу а-ля регистратор задач (Task Recorder), которая будет логировать действия пользователя. Соответственно - ее можно вставить в метод \Classes\ClassFactory.formRunClass(), в RunBase - и тогда все эти вызовы можно будет логировать. Но этот вариант решения хорош только в том случае, когда Вам нужно промониторить конкретного пользователя или конкретный объект в АОТе (например, сколькими пользователями используется эта форма). Логировать все подряд по всем объектам - мне кажется будет излишней нагрузкой на систему.
__________________
Возможно сделать все. Вопрос времени |
|