|
Не выкидывает всех из баз VBS | ☑ | ||
---|---|---|---|---|
0
udarnic77
12.10.16
✎
08:52
|
Приветствую уважаемый форум!
Задача - еженочная выгрузка аз в DT. Есть скрипт на VBS, который успешно задачу выполняет на различных базах (в том числе полностью самописных программистом). Но, с некоторых пор (подозрение на обновление платформы до версии 8.3.8.1747) некоторые клиенты остаются подключенными и, соответственно, выгрузка не выполняется из-за невозможности установить монопольное соединение. Если выкинуть оставшихся клиентов руками в консоли администрирования сервера - скрипт отрабатывает. Тело скрипта такое: [code] BasesList = "c:\script\backup\bases_to_backup.txt" 'Cписок баз, одна строка - одна база ' Например: ' base1 ' base2 ' base3 '''''''''''''' Set FSO = CreateObject("Scripting.FileSystemObject") If FSO.FileExists(BasesList) Then Set Fstring = FSO.OpenTextFile(BasesList, 1) Do iString = Fstring.ReadLine If Len(Trim(iString)) <> 0 Then Call ArcBackups(iString) Loop While Not Fstring.AtEndOfStream Fstring.Close End If Sub ArcBackups(BaseName) 'имя пользователя базы 1С:Предприятия UserName = "root" 'пароль пользователя базы 1С:Предприятия UserPass = "password" 'имя сервера 1С:Предприятия ServerName = "srv2" 'имя базы 1С:Предприятия к которой подключаемся BaseName получаем как аргумент ' Код доступа к базе, нужен для доступа к ЗАБЛОКИРОВАННОЙ для новых подключений базе LockPermissionCode = "123456" ' BckpDir - папка назначения, куда будем складывать выгрузки BckpDir = "\\Backup\Backup_1C\DT\"& BaseName &"\" ' LogDir - папка куда будет писаться лог выгрузки и обновления LogDir = "\\Backup\Backup_1C\DT\"& BaseName &"\log\" LockMessageText = "БАЗА ЗАКРЫТА НА СОЗДАНИЕ РЕЗЕРВНОЙ КОПИИ И ОБНОВЛЕНИЕ." Dim Connector Dim AgentConnection Dim Cluster Dim WorkingProcess Dim WorkingProcessConnection Dim ibDesc Dim connections Dim ConnectString Set connector = CreateObject("v83.COMConnector.1") Set AgentConnection = Connector.ConnectAgent(ServerName) Set Cluster = AgentConnection.GetClusters()(0) AgentConnection.Authenticate Cluster, " ", " " Processes = AgentConnection.GetWorkingProcesses(Cluster) Dim j 'Перебираем все процессы в кластере For j = LBound(Processes) To UBound(Processes) Set WorkingProcess = AgentConnection.GetWorkingProcesses(Cluster)(j) 'Проверяем на наличие остановленых процессов If (WorkingProcess.MainPort <> "0") Then ConnectString = WorkingProcess.HostName & ":" & WorkingProcess.MainPort Set WorkingProcessConnection = Connector.ConnectWorkingProcess(ConnectString) WorkingProcessConnection.AddAuthentication UserName, UserPass InfoBases = WorkingProcessConnection.GetInfoBases() For Each InfoBase In InfoBases ' Ищем нужную базу If UCase(InfoBase.Name) = UCase(BaseName) Then ' Устанавливаем запрет на подключение новых соединений InfoBase.ConnectDenied = True InfoBase.DeniedFrom = CStr(Now()) ' Запрет действует 15 минут, если скрипт не отработает нормально InfoBase.DeniedTo = CStr(Now() + 1 / 96 * 1) InfoBase.DeniedMessage = LockMessageText InfoBase.PermissionCode = LockPermissionCode WorkingProcessConnection.UpdateInfoBase (InfoBase) End If Next Set ibDesc = WorkingProcessConnection.CreateInfoBaseInfo() ibDesc.Name = BaseName Connections = WorkingProcessConnection.GetInfoBaseConnections(ibDesc) 'Удаление всех соединений заданной ИБ сервера 1С Dim i Dim Connection For i = LBound(Connections) To UBound(Connections) Set Connection = connections(i) If (Connection.AppID <> "COMConsole") Then WorkingProcessConnection.Disconnect Connection End If Next End If Next ''''''''''''''''''''''''''''' 'проверяем существование папки для бэкапа и, если ее нет, создаем Dim objFSO, objFolder, strDirectory strDirectory = BckpDir Set objFSO = CreateObject("Scripting.FileSystemObject") If Not objFSO.FolderExists(strDirectory) Then Set objFolder = objFSO.CreateFolder(strDirectory) End If ' проверяем существование папки для лога и, если ее нет, создаем Dim obj2FSO, obj2Folder, str2Directory str2Directory = LogDir Set obj2FSO = CreateObject("Scripting.FileSystemObject") If Not obj2FSO.FolderExists(str2Directory) Then Set obj2Folder = objFSO.CreateFolder(str2Directory) End If 'Задаем формат имени файла бэкапа База_Дата_Час_Минута_ИмяСервера FileName = BaseName & "_" & DateValue(date) & "_" & Hour(Now) & "_" & Minute(Now) & "_" & ServerName 'строка запуска выгрузки strComm = """C:\Program Files (x86)\1cv8\8.3.8.1747\bin\1cv8.exe"" CONFIG /S"& ServerName &"\"& BaseName &" /N"& UserName &" /P"& UserPass &" /UC"& LockPermissionCode &" /DumpIB "& BckpDir & FileName &".dt /Out "& LogDir & FileName &"_dump.log""" ' строка запуска обновления ' strComm2 = """C:\Program Files (x86)\1cv8\8.3.8.1747\bin\1cv8.exe"" CONFIG /S"& ServerName &"\"& BaseName &" /N"& UserName &" /P"& Userpass &" /UC"& LockPermissionCode &" /UpdateDBCfg /Out "& LogDir & FileName &"_update.log""" Set oWshShell = CreateObject("WScript.Shell") ' запуск выгрузки с ожиданием ее завершения oWshShell.Run strComm, 0, true ' запуск обновления с ожиданием его завершения ' oWshShell.Run strComm2, 0, true ' Отключаем блокировку базы InfoBases = WorkingProcessConnection.GetInfoBases() For Each InfoBase In InfoBases ' Ищем нужную базу If UCase(InfoBase.Name) = UCase(BaseName) Then ' Отключаем запрет на подключение новых соединений InfoBase.ConnectDenied = False 'InfoBase.DeniedMessage = "" 'InfoBase.PermissionCode = "" WorkingProcessConnection.UpdateInfoBase (InfoBase) End If Next End Sub [/code] |
|||
1
Armando
12.10.16
✎
09:20
|
Надо удалять сеансы, а не соединения
|
|||
2
udarnic77
12.10.16
✎
11:06
|
Пожалуйста, подскажите как это сделать в VBS
|
|||
3
Armando
12.10.16
✎
11:45
|
вот кусок моего скрипта
Sub TerminateSessions() Dim SessionInfo For Each SessionInfo in AgentConnection.GetInfoBaseSessions(ClusterInfo, InfoBaseShort) If Not SessionInfo.AppID = "COMConsole" Then AgentConnection.TerminateSession ClusterInfo, SessionInfo End If Next End Sub |
|||
4
udarnic77
12.10.16
✎
13:44
|
Можете показать весь скрипт, пожалуйста!
|
|||
5
Armando
12.10.16
✎
14:01
|
||||
6
udarnic77
12.10.16
✎
15:38
|
Спасибо.
Мой скрипт более "линейный", а знаний в VBS пока не хватает, чтобы вписать в свой скрипт разрыв всех сеансов к определенной базе. Буду очень благодарен если кто-то поможет вписать... |
|||
7
Armando
13.10.16
✎
11:34
|
Скорее всего этот скрипт писался для старых версий платформы, когда еще не было понятия Сеанс. Тут не просто вписать, а переписать скрипт надо с сохранением логики. В твоем скрипте идет перебор соединений в каждом рабочем процессе, с разрывом соединения. А надо перебирать сеансы кластера и удалять подходщие по условию.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |