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