Эх. Тряхну стариной. Вот код, который запускался из startup Applicationa и следил, если ли уже открытые сесси у данного пользователя. Если есть, то по запросу убивал. Для верности было сочетание terninate + notify. Просто terminate не всегда убивал сессии. Попробйте!
PHP код:
//SP0003_CheckSessions_GNRD
void checkAllOpenSessions_flx()
{
int counter = 0;
int maxSessions;
int curSessionId = new xSession().sessionId();
container users;
int sesId;
userId userId;
ClientType clientKind;
date loginDate;
int loginTime;
str clientComputerName;
str databaseSpid;
userName userName;
AOSClientMode clientMode;
int idleTicks;
str info;
Session sessionToTerm;
AOSSessionInfo testSession;
;
[ users, maxSessions ] = SysUsersOnline::getAllOnlineUserInfo();
for(counter = 1; counter <= maxSessions; counter++)
{
[ sesId,
userId,
clientKind,
loginDate,
loginTime,
clientComputerName,
databaseSpid,
userName,
clientMode,
idleTicks
] = conPeek(users, counter);
if (userId == '-AOS-')
continue;
if (sesId != curSessionId && userId == curuserid())
{
info = strfmt("????????! ? ???????????? %1 (%2) ??? ???? ???????? ?????? ? ??????? %3 ???????? ? ?????????? %4 %5 ????? ? %6. ??????? ?????? ???????",
UserName,
UserId,
sesId,
clientComputerName,
loginDate,
time2str(loginTime,1,1));
if (Box::yesNo(info,DialogButton::Yes,"????????! ???? ???????? ??????!","?? - ??????? ?????? ?????? (?????????????), ??? - ??????????") == DialogButton::Yes)
{
sessionToTerm = new Session(sesId);
sessionToTerm.terminate();
info = strfmt("????????! ???? ?????? ???? ???????? ? ?????????? %1!", clientComputerName);
testSession = new AOSSessionInfo(sesId);
if (testSession)
AOSSessionInfo::sendMessage(sesId, "????????!", info);
sessionToTerm.notify();
sessionToTerm = NULL;
}
}
}
}
С Уважением,
Георгий