|
Завершение работы пользователей | ☑ | ||
---|---|---|---|---|
0
az2002
26.10.11
✎
09:15
|
А че половина сеансов не закрывается?
Процедура КнопкаВыполнитьНажатие(Кнопка) БС=ПолучитьБлокировкуСеансов(); БС.КодРазрешения="123"; БС.Конец=ТекущаяДата()+300; БС.Начало=ТекущаяДата(); БС.Сообщение="включена блокировка"; БС.Установлена=Истина; УстановитьБлокировкуСеансов(БС); ТекущийРежим =ПолучитьБлокировкуСеансов(); //БлокировкаУстановлена = ТекущийРежим.Установлена; БлокировкаУстановлена =истина; ВремяНачалаБлокировки = ТекущийРежим.Начало; ИнтервалОтключения = - 30; ТекущийМомент = ТекущаяДата(); Если БлокировкаУстановлена и (НЕ ЗначениеЗаполнено(ВремяНачалаБлокировки) ИЛИ ВремяНачалаБлокировки - ТекущийМомент <= ИнтервалОтключения) Тогда ОтключитьОбработчикОжидания("ЗавершитьРаботуПользователей"); ПодстрокиСтрокиСоединения = ОбщегоНазначения.РазложитьСтрокуВМассивПодстрок(СтрокаСоединенияИнформационнойБазы(),";"); Если ПодстрокиСтрокиСоединения.Количество()> 1 и Лев(ПодстрокиСтрокиСоединения[0], 5) = "Srvr=" и Лев(ПодстрокиСтрокиСоединения[1], 4) = "Ref=" Тогда ИмяСервера = Сред(ПодстрокиСтрокиСоединения[0],7, СтрДлина(ПодстрокиСтрокиСоединения[0]) - 7); ИмяИБ = Сред(ПодстрокиСтрокиСоединения[1],6, СтрДлина(ПодстрокиСтрокиСоединения[1]) - 6); ПодстрокиПараметровЗапуска = ОбщегоНазначения.РазложитьСтрокуВМассивПодстрок(ПараметрЗапуска,";"); Попытка ComConnector = Новый COMОбъект("v82.COMConnector"); РазделительПорта = Найти(ИмяСервера, ":"); Если РазделительПорта > 0 Тогда ИмяСервера = Сред(ИмяСервера, 1, (РазделительПорта - 1)); НомерПортаКластера = Число(Сред(ИмяСервера, (РазделительПорта + 1))); Иначе НомерПортаКластера = ComConnector.RMngrPortDefault; КонецЕсли; // Подключение к агенту сервера ServerAgent = ComConnector.ConnectAgent(ИмяСервера); // Получим массив кластеров сервера у агента сервера Clasters = ServerAgent.GetClusters(); // Найдем необходимый нам кластер Для Каждого Claster Из Clasters Цикл Если Claster.MainPort <> НомерПортаКластера Тогда Продолжить; КонецЕсли; // Аутефикация к найденному кластеру Если ПодстрокиПараметровЗапуска.Количество() > 2 и Врег(ПодстрокиПараметровЗапуска[0]) = Врег("ЗавершитьРаботуПользователей") Тогда ServerAgent.Authenticate(Claster, ПодстрокиПараметровЗапуска[1], ПодстрокиПараметровЗапуска[2]); Иначе ServerAgent.Authenticate(Claster, "", ""); КонецЕсли; // Получаем список рабочих процессов WorkingProcesses = ServerAgent.GetWorkingProcesses(Claster); Для Каждого WorkingProcess Из WorkingProcesses Цикл Если WorkingProcess.Running <> 1 Тогда Продолжить; КонецЕсли; // Для каждого рабочего процесса создаем соединение с рабочим процессом ConnectToWorkProcess = ComConnector.ConnectWorkingProcess("tcp://" + WorkingProcess.HostName + ":" + Формат(WorkingProcess.MainPort, "ЧГ=0")); Если ПодстрокиПараметровЗапуска.Количество() > 2 и Врег(ПодстрокиПараметровЗапуска[0]) = Врег("ЗавершитьРаботуПользователей") Тогда ConnectToWorkProcess.AddAuthentication(ПодстрокиПараметровЗапуска[1], ПодстрокиПараметровЗапуска[2]); Иначе ConnectToWorkProcess.AddAuthentication(ИмяПользователя(), ""); КонецЕсли; // Получаем список ИБ рабочего процесса InfoBases = ConnectToWorkProcess.GetInfoBases(); Для Каждого InfoBase Из InfoBases Цикл // Ищем нужную базу Если InfoBase.Name = ИмяИБ Тогда // Получаем массив соединений с ИБ Connections = ConnectToWorkProcess.GetInfoBaseConnections(InfoBase); Для Каждого Connection Из Connections Цикл Если ИмяПользователя() <> connection.userName Тогда // Разрываем Connections с ИБ СтрСообщения = "Разрывается соединение: Пользователь " + Connection.UserName + ", компьютер " + Connection.HostName + ", установлено " + Connection.ConnectedAt + ", режим " + Connection.AppID; ЗаписьЖурналаРегистрации("Завершение работы пользователей", УровеньЖурналаРегистрации.Информация, , , СтрСообщения); ConnectToWorkProcess.Disconnect(Connection); КонецЕсли; КонецЦикла; КонецЕсли; КонецЦикла; КонецЦикла; КонецЦикла; Исключение ЗаписьЖурналаРегистрации("Завершение работы пользователей", УровеньЖурналаРегистрации.Ошибка, , , ОписаниеОшибки()); КонецПопытки; КонецЕсли; Соединения = ПолучитьСоединенияИнформационнойБазы(); Если Соединения.Количество() > 1 Тогда Сообщение = "Не удалось завершить работу пользователей:"; Для каждого Соединение Из Соединения Цикл Если Не Соединение.НомерСоединения = НомерСоединенияИнформационнойБазы() Тогда Сообщение = Сообщение + Символы.ПС + " - " + Соединение; КонецЕсли; КонецЦикла; Сообщить(Сообщение, СтатусСообщения.Внимание); ЗаписьЖурналаРегистрации("Завершение работы пользователей", УровеньЖурналаРегистрации.Предупреждение, , , Сообщение); Иначе Сообщить("Завершение работы пользователей выполнено успешно.", СтатусСообщения.Информация); КонецЕсли; КонецЕсли; КонецПроцедуры |
|||
1
John83
26.10.11
✎
09:17
|
прога спрашивает "сохранить документ", "выйти из программы"
|
|||
2
az2002
26.10.11
✎
09:37
|
Сеанс удаляется сервером,
вручную через консоль сеансы отключаются за пару секунд. Я правильно понимаю, что вот это означает тоже что руками открыть консоль, выделить сеанс и удалить? ComConnector = Новый COMОбъект("v82.COMConnector"); ConnectToWorkProcess = ComConnector.ConnectWorkingProcess("tcp://" + WorkingProcess.HostName + ":" + Формат(WorkingProcess.MainPort, "ЧГ=0")); ConnectToWorkProcess.Disconnect(Connection); |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |