Как то наткнулся на просторах интернета на vbs-скрипт который разгоняет пользователей...
Немного помыслив, понял, надо дорабатывать, итог такой - мы выгоняем всех пользователей из базы 1С, на любом кластере, на любом рабочем процессе, т.е. обходим всё что может использовать одна информационная база.
Собственно сам скрипт VBS:
Cкрипт (только SQL) отключает всех пользователей от ИБ 1С:Предприятия V8-V83.
Option Explicit
Dim UserName
Dim UserPass
Dim ServerName
Dim BaseName
'имя пользователя базы 1С:Предприятия
UserName = ""
'пароль пользователя базы 1С:Предприятия
UserPass = ""
'имя кластера 1С:Предприятия
ServerName = ""
'имя базы 1С:Предприятия к которой подключаемся
BaseName = ""
Dim Connector
Dim AgentConnection
Dim Cluster
Dim Clusters
Dim WorkingProcess
Dim WorkingProcesses
Dim WorkingProcessConnection
Dim ibDesc
Dim Connections
Dim Connection
Dim ConnectString
Set Connector = CreateObject("V82.COMConnector") ' указать в зависимости от вашей версии платформы V8, V81, V82, V83
Set AgentConnection = Connector.ConnectAgent(ServerName)
Clusters = AgentConnection.GetClusters()
Dim Q,W,I
For Q = LBound(Clusters) to UBound(Clusters)
Set Cluster = Clusters(Q)
'Указываем доступ к консоли 1С:Предприятия (только в том случае если определён администратор кластера, иначе прописать просто " " (пробелы))
AgentConnection.Authenticate Cluster, " ", " "
WorkingProcesses = AgentConnection.GetWorkingProcesses(Cluster)
For W = LBound(WorkingProcesses) to UBound(WorkingProcesses)
Set WorkingProcess = WorkingProcesses(W)
ConnectString = WorkingProcess.HostName & ":" & WorkingProcess.MainPort
Set WorkingProcessConnection = Connector.ConnectWorkingProcess(ConnectString)
WorkingProcessConnection.AddAuthentication UserName, UserPass
Set ibDesc = WorkingProcessConnection.CreateInfoBaseInfo()
ibDesc.Name = BaseName
Connections = WorkingProcessConnection.GetInfoBaseConnections(ibDesc)
For I = LBound(Connections) To UBound(Connections)
Set Connection = Connections(I)
' Соединения вида COM-Соединение - не трогаем т.к. скорее всего это мы и есть, при желании можно добавить свои условия
If (Connection.AppID "COMConsole") then
WorkingProcessConnection.Disconnect Connection
End if
Next
Next
Next
Функция в 1Ске:
Ну скажем так, ниже функция разгона описана, единственное то, что в неё нужно передавать данные, их немного(можно передавать структуру, я передаю ссылку из справочника базы ):
БазаИсточник.ВерсияПлатформы = // V8, V81, V82, V83
БазаИсточник.КластерСерверов // собственно имя кластера в котором находится наша база
БазаИсточник.ПользовательАдминистратор // имя пользователя администратора в этой базе
БазаИсточник.ПарольПользователяАдминистратора // пароль пользователя администратора в этой базе
БазаИсточник.ИмяБазыВКластере // собственно имя базы в кластере 1С
Я на возврат этой функции использую массив данных, чтобы можно было проанализировать нужно ли повторно запускать эту функцию:
// Коды возвратов ошибок и условий выполнения
// 1 = выполнено без ошибок, информации для вывода нет
// 2 = не выполнено, результат пустой, есть информация для пользователя
// 3 = выполнено, с ошибками (грубо говоря - "не до конца", пример - не завершены все сеансы пользователей), если повторить операцию, то возможно всё получится :)
// 4 = выполнено, без ошибок, есть дополнительная информация для пользователя
Собственно сама функция убивания сеансов с рабочей базой:
Функция РазорватьВсеСоединенияСБазой(БазаИсточник,ТолькоКонфигуратор=Ложь) Экспорт // только конфигуратор используем для того чтобы обновить конфу СообщениеНаВозврат = ""; КодВозвратаОшибки = 1; Результат = Неопределено; ВсегоСоединенийСИнформационнойБазой = 0; КоличествоНеЗавершенныхСоединений = 0; ВыполнениеФункций = Истина; Попытка Connector = Новый COMОбъект(БазаИсточник.ВерсияПлатформы + ".COMConnector"); Исключение СообщениеНаВозврат = (ОписаниеОшибки()); КодВозвратаОшибки = 2; Результат = Ложь; Goto ~ОтправитьРезультат; КонецПопытки; Попытка AgentConnection = Connector.ConnectAgent(БазаИсточник.КластерСерверов); Исключение СообщениеНаВозврат = (ОписаниеОшибки()); КодВозвратаОшибки = 2; Результат = Ложь; Goto ~ОтправитьРезультат; КонецПопытки; Попытка Clusters = AgentConnection.GetClusters(); Исключение СообщениеНаВозврат = (ОписаниеОшибки()); КодВозвратаОшибки = 2; Результат = Ложь; Goto ~ОтправитьРезультат; КонецПопытки; Попытка // на все кластеры одна попытка, пусть будет так Для Каждого Cluster из Clusters Цикл AgentConnection.Authenticate(Cluster,"",""); // аутентифицируемся в кластере, паролей нет, работаем под Админом :) Connections = AgentConnection.GetConnections(Cluster); // получаем все соединения с кластером, массив() ДатаСоединения = ТекущаяДата(); WorkingProcesses = AgentConnection.GetWorkingProcesses(Cluster); // получаем все рабочие процессы текущего кластера Для Каждого WorkingProcess из WorkingProcesses Цикл Если WorkingProcess.MainPort = 0 Тогда Прервать; КонецЕсли; // не знаю почему, но в конце всегда 0 порт ConnectString = "" + WorkingProcess.HostName + ":" + WorkingProcess.MainPort + ""; ConnectString = СтрЗаменить(Строка(ConnectString),Символы.НПП,""); WorkingProcessConnection = Connector.ConnectWorkingProcess(ConnectString); // все соединения с рабочим процессом WorkingProcessConnection.AddAuthentication(БазаИсточник.ПользовательАдминистратор,БазаИсточник.ПарольПользователяАдминистратора ); // авторизуемся с базой ibDesc = WorkingProcessConnection.CreateInfoBaseInfo(); ibDesc.Name = БазаИсточник.ИмяБазыВКластере; WorkingConnections = WorkingProcessConnection.GetInfoBaseConnections(ibDesc); Для Каждого WorkingConnect из WorkingConnections Цикл // перебор и убитие всех сеансов, которые не относятся к текущему пользователю ! // 21.03.2013 нас не трогаем, определяем по типу соединения и имени пользователя // 27.03.2013 - да нифига! у нас может быть больше 1 Com-соединения с текущий момент с базой, поэтому надо получать его ID-сеанса! Если Нрег(WorkingConnect.UserName) = Нрег(БазаИсточник.ПользовательАдминистратор) и Нрег(WorkingConnect.AppID) = "comconsole" и (ДатаСоединения - Нрег(WorkingConnect.ConnectedAt)) 0 Тогда СообщениеНаВозврат = "Не удалось выгнать всех пользователей, количество незавершенных процессов: " + Строка(КоличествоНеЗавершенныхСоединений); КодВозвратаОшибки = 3; // выполнено с ошибками, общий результат = Ложь! Результат = Ложь; КонецЕсли; Если КоличествоНеЗавершенныхСоединений = 0 Тогда СообщениеНаВозврат = "Количество завершенных соединений: " + Строка(ВсегоСоединенийСИнформационнойБазой); КодВозвратаОшибки = 4; // выполнено без ошибок, есть информация пользователю, общий результат = Истина! Результат = Истина; КонецЕсли; ~ОтправитьРезультат: МассивНаВозврат = Новый Массив(); МассивНаВозврат.Добавить(Результат); МассивНаВозврат.Добавить(КодВозвратаОшибки); МассивНаВозврат.Добавить(СообщениеНаВозврат); // Подчищаем переменные WorkingProcesses = Undefined; Connector = Undefined; AgentConnection = Undefined; Clusters = Undefined; Connections = Undefined; WorkingConnections = Undefined; WorkingProcessConnection = Undefined; WorkingConnect = Undefined; Возврат МассивНаВозврат; КонецФункции