![]() |
![]() |
|
Ошибка GetInfoBaseConnections - не устанавливается блокировка соединений | ☑ | ||
---|---|---|---|---|
0
Kiber
10.02.10
✎
12:49
|
Заранее извиняюсь, если это повтор. Гуглил и так и сяк - нашел вопросы без ответов.
Ситуация: ЗУП (2.5.19.3), Платформа (8.1.12.101). Раньше база работала в файловом режиме, затем была перенесена на один сервер 1C application+SQL (условно - сервер (1)), затем на другой (условно - сервер (2)). Проблема наблюдалась еще на (1), и сейчас без изменений на (2). Суть: Не устанавливается блокировка соединений. Симптомы: Из режима придприятие: "Ошибка при вызове контекста (GetInfoBaseConnections): Произошла исключительная ситуация: Недостаточно прав пользователя на информационную базу траляля" Из работы скрита VBS: участок кода: "Connections = WorkingProcessConnection.GetInfoBaseConnections(ibDesc)" сообщение: "Недостаточно прав пользователя на информационную базу траляля" Что пробовал: В режиме предприятие и в режиме COM-объекта устанавливать блокировку. У пользователя полные права на все возможные объекты. Проверил. |
|||
1
Kiber
11.02.10
✎
14:50
|
Дополнительная информация:
Через консоль сервера 1С:Предприятие блокировка корректно устанавливается. Проверил. Помогите кто чем может :) |
|||
2
73
11.02.10
✎
14:56
|
СП:
Получает массив соединений информационной базы. Для выполнения требуются административные права на информационную базу. ЗЫ. По твоему коду не видно, делаешь ли аутентификацию. Что-то типа должно быть: WorkingProcessConnection.AddAuthentication(ИмяАдминаБД, ПарольАдминаБД); |
|||
3
Kiber
11.02.10
✎
15:36
|
Вот собственно сам скритп:
'Cкрипт (только SQL) отключает всех пользователей от ИБ 1С:Предприятия v8.1. 'На сервере подразумевается наличие только одного кластера 'Далеет срипт производит выгрузку баз и содаёт лог '\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ПЕРЕМЕННЫЕ\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ 'задержка выхода пользователей из базы после установления блокировки WaitMinutes = 0.1 'предположительное время работы скрипта в минутах WorkMinutes = 120 'имя пользователя базы 1С:Предприятия Adm_Nm = "Backup" 'пароль пользователя базы 1С:Предприятия Adm_Pw = "<<<<<<<<<<<<<<<<<< PASSWORD >>>>>>>>>>>>>>>>>>>>>>>" 'имя сервера 1С:Предприятия Server_Nm = "1C" 'имя базы 1С:Предприятия к которой подключаемся DB_Name = "backuptest" 'Сообщение блокировки базы Lock_Msg = "БАЗА ЗАКРЫТА НА СОЗДАНИЕ РЕЗЕРВНОЙ КОПИИ. Администратор" 'Код блокировки базы Lock_PrmCode = "1" 'Папка бекапа BackupFolder = "D:\Backup\DT" 'Префикс базы для бекапа BackupPrefix = "[test]" 'Папка лога LogFolder = "D:\Backup\DT" 'Путь к фалу запуска программы 1С one1CPath = """C:\Program Files\1cv81\bin\1cv8.exe""" '\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ 'Формируется полное имя файла выгрузки и лога BackupName = BackupPrefix&"_"&CurrentDTFormat() ' Открываем лог Set LogTextStream = Log_Open_TextStream(LogFolder&"\"&BackupName&".txt") LogTextStream.Write vbCrLf&"--------------- BEGIN ---------------------------------------------"&vbCrLf LogTextStream.Write Now()&vbCrLf LogTextStream.Write " BackupName: '"&BackupName&"'"&vbCrLf LogTextStream.Write " Server_Nm: '"&Server_Nm&"'"&vbCrLf LogTextStream.Write " DB_Name: '"&DB_Name&"'"&vbCrLf LogTextStream.Write " one1CPath: '"&one1CPath&"'"&vbCrLf Dim objConnector Dim objCluster Dim objWPConnection Dim objInfoBase Lock_TimeMnts = WaitMinutes + WorkMinutes Call DB_Find(LogTextStream, Server_Nm, DB_Name, Adm_Nm, Adm_Pw, objConnector, objCluster, objWPConnection, objInfoBase) Call DB_Lock(LogTextStream, objInfoBase, objWPConnection, Lock_TimeMnts, Lock_Msg, Lock_PrmCode) LogTextStream.Write Now()&" Ждем "&WaitMinutes*60&" секунд..."&vbCrLf WScript.Sleep(WaitMinutes*60*1000) Call DB_DropUsers(LogTextStream, objInfoBase, objWPConnection, FlagWasExceptions) If Not FlagWasExceptions Then LogTextStream.Write Now()&" Лог выгрузки: {"&vbCrLf&vbCrLf LogTextStream.Close '------------------------------------------------------------------------------------------------------------------------------- 'Путь к файлу выгрузки BackupPath = "/DumpIB"""&BackupFolder&"\"&BackupName&".dt""" 'Путь к логу LogPath = "/Out"""&LogFolder&"\"&BackupName&".txt"" -NoTruncate" 'Параметры имя кластера\имя базы пользователь пароль код доступа Paramters = "DESIGNER /S"""&Server_Nm&"\"&DB_Name&""" /N"""&Adm_Nm&""" /P"""&Adm_Pw&""" /UC "&Lock_PrmCode&" /Visible" 'Начали выгружаться Set objShell = CreateObject("WScript.Shell") objShell.Run one1CPath&" "&Paramters&" "&LogPath&" "&BackupPath, 2, True Set LogTextStream = Log_Open_TextStream(LogFolder&"\"&BackupName&".txt") LogTextStream.Write vbCrLf&Now()&" }"&vbCrLf LogTextStream.Write Now()&" Проверяем физическое наличие backup'a:"&vbCrLf Set FSO = CreateObject("Scripting.FileSystemObject") If FSO.FileExists(BackupFolder&"\"&BackupName&".dt") Then LogTextStream.Write Now()&" Файл на месте. База выгружена."&vbCrLf Else LogTextStream.Write Now()&" Файл отсутствует! БАЗА НЕ ВЫГРУЖЕНА!!!"&vbCrLf End If Else LogTextStream.Write Now()&" Выгрузка базы отменена по причине исключительной ситуации"&vbCrLf End If Call DB_UnLock(LogTextStream, objInfoBase, objWPConnection) LogTextStream.Write Now()&vbCrLf LogTextStream.Write "--------------- END ---------------------------------------------"&vbCrLf LogTextStream.Close 'Функция возвращает поток для сохранения сообщения в лог Function Log_Open_TextStream(FileName) Set FSO = CreateObject("Scripting.FileSystemObject") IF FSO.FileExists(FileName) THEN Set File = FSO.GetFile(FileName) Set Log_Open_TextStream = File.OpenAsTextStream(8) ELSE Set Log_Open_TextStream = FSO.CreateTextFile(FileName, True) END IF End Function 'Функция возвращает превращает текущую дату в формат 'YYYY-MM-DD_HH' Function CurrentDTFormat() 'Месяц m = Month(Date()) If m < 10 Then m = "0"&m End If 'День d = Day(Date()) If d < 10 Then d = "0"&d End If 'Час h = Hour(Time()) If h < 10 Then h = "0"&h End If 'Возвращаемое значение CurrentDTFormat = Year(Date())&"-"&m&"-"&d&"_"&h End Function ' находит нужную БД на сервере, и возвращает в objConnector, objCluster, objWPConnection, objInfoBase объекты подключения Sub DB_Find(LogTextStream, Server_Nm, DB_Name, Adm_Nm, Adm_Pw, objConnector, objCluster, objWPConnection, objInfoBase) Dim ConnectString Set objConnector = CreateObject("V81.COMConnector") Set objAgent = objConnector.ConnectAgent(Server_Nm) massive_objCluster = objAgent.GetClusters() LogTextStream.Write Now()&" Получен список кластеров, начинаем перебор:"&vbCrLf For Each objCluster In massive_objCluster LogTextStream.Write Now()&" ["&objCluster.Name&"] {"&vbCrLf objAgent.Authenticate objCluster, " ", " " LogTextStream.Write Now()&" Аутентификация кластера пройдена"&vbCrLf massive_objProcess = objAgent.GetWorkingProcesses(objCluster) LogTextStream.Write Now()&" Получен список процессов, начинаем перебор:"&vbCrLf For Each objProcess In massive_objProcess LogTextStream.Write Now()&" HostName: '"&objProcess.HostName&"' Port: '"&objProcess.MainPort&"' {"&vbCrLf ConnectString = objProcess.HostName&":"&objProcess.MainPort Set objWPConnection = objConnector.ConnectWorkingProcess(ConnectString) objWPConnection.AddAuthentication Adm_Nm, Adm_Pw LogTextStream.Write Now()&" Аутентификация процесса пройдена"&vbCrLf massive_objInfoBase = objWPConnection.GetInfoBases() LogTextStream.Write Now()&" Получен список баз, начинаем перебор:"&vbCrLf For Each objInfoBase In massive_objInfoBase LogTextStream.Write Now()&" "&objInfoBase.Name&vbCrLf If UCase(objInfoBase.Name) = UCase(DB_Name) Then 'закрываем теги и выходим из процедуры LogTextStream.Write Now()&" ****** Совпадение!"&vbCrLf LogTextStream.Write Now()&" } HostName: '"&objProcess.HostName&"' Port: '"&objProcess.MainPort&"'"&vbCrLf LogTextStream.Write Now()&" } ["&objCluster.Name&"]"&vbCrLf Exit Sub End If Next 'massive_objInfoBase LogTextStream.Write Now()&" } HostName: '"&objProcess.HostName&"' Port: '"&objProcess.MainPort&"'"&vbCrLf Next 'massive_objProcess LogTextStream.Write Now()&" } ["&objCluster.Name&"]"&vbCrLf Next 'massive_objCluster End Sub 'Процедура устанавливает блокировку ИБ Sub DB_Lock(LogTextStream, objInfoBase, objWPConnection, Lock_TimeMnts, Lock_Msg, Lock_PrmCode) LogTextStream.Write Now()&" Устанавливаем блокировку базы ["&objInfoBase.Name&"] на "&Lock_TimeMnts&" минут:"&vbCrLf objInfoBase.ConnectDenied = True objInfoBase.DeniedFrom = CStr(Now()) objInfoBase.DeniedTo = CStr(DateAdd("n",Lock_TimeMnts,Now())) objInfoBase.DeniedMessage = Lock_Msg objInfoBase.PermissionCode = Lock_PrmCode objWPConnection.UpdateInfoBase(objInfoBase) LogTextStream.Write Now()&" done"&vbCrLf End Sub 'Процедура снимает блокировку ИБ Sub DB_UnLock(LogTextStream, objInfoBase, objWPConnection) LogTextStream.Write Now()&" Снимаем блокировку базы ["&objInfoBase.Name&"]:"&vbCrLf objInfoBase.ConnectDenied = False objWPConnection.UpdateInfoBase(objInfoBase) LogTextStream.Write Now()&" done"&vbCrLf End Sub 'Процедура отключает подключения к БД Sub DB_DropUsers(LogTextStream, objInfoBase, objWPConnection, FlagWasExceptions) LogTextStream.Write Now()&" Получаем список подключений к базе, и отключаем их:"&vbCrLf FlagWasExceptions = False massive_objUserConnection = objWPConnection.GetInfoBaseConnections(objInfoBase) For Each objUserConnection In massive_objUserConnection LogTextStream.Write Now()&" name: '"&objUserConnection.UserName&"', computer:'"&objUserConnection.HostName&"', appID: '"&objUserConnection.AppID&"'"&vbCrLf If (objUserConnection.AppID = "COMConsole") Then LogTextStream.Write Now()&" тип подключения в списке исключений"&vbCrLf ElseIf (objUserConnection.UserName = "Иванов И.И.") or (objUserConnection.UserName = "Петров П.П.") or (objUserConnection.UserName = "Сидоров К.К.") Then FlagWasExceptions = True LogTextStream.Write Now()&" пользователь в списке исключений"&vbCrLf ElseIf (UCase(objUserConnection.HostName) = "IVANOV") or (UCase(objUserConnection.HostName) = "PETROV") or (UCase(objUserConnection.HostName) = "SIDOROV") Then FlagWasExceptions = True LogTextStream.Write Now()&" компьютер в списке исключений"&vbCrLf Else objWPConnection.Disconnect objUserConnection LogTextStream.Write Now()&" disconnected successfully"&vbCrLf End If Next LogTextStream.Write Now()&" Отключили."&vbCrLf End Sub Вот лог: --------------- BEGIN --------------------------------------------- 11.02.2010 14:13:05 BackupName: '[HRM]_2010-02-11_14' Server_Nm: '1C' DB_Name: 'v81_hrm' one1CPath: '"C:\Program Files\1cv81\bin\1cv8.exe"' 11.02.2010 14:13:05 Получен список кластеров, начинаем перебор: 11.02.2010 14:13:05 [Локальный кластер] { 11.02.2010 14:13:05 Аутентификация кластера пройдена 11.02.2010 14:13:05 Получен список процессов, начинаем перебор: 11.02.2010 14:13:05 HostName: '1C' Port: '1562' { 11.02.2010 14:13:07 Аутентификация процесса пройдена 11.02.2010 14:13:07 Получен список баз, начинаем перебор: 11.02.2010 14:13:07 TEST1 11.02.2010 14:13:07 v81_1_2_20_1 11.02.2010 14:13:07 v81_hrm 11.02.2010 14:13:07 ****** Совпадение! 11.02.2010 14:13:07 } HostName: '1C' Port: '1562' 11.02.2010 14:13:07 } [Локальный кластер] 11.02.2010 14:13:07 Устанавливаем блокировку базы [v81_hrm]: После этого выдает Runtime error WSCript.exe Сам участок кода, который выдает ошибку: objInfoBase.ConnectDenied = True Собственно, пытался установить error handler вида: On Error Resume Next Err.Clear objInfoBase.ConnectDenied = True If Err.Number <> 0 Then LogTextStream.Write Now()&" Got error number "&Err.Number&":"&vbCrLf LogTextStream.Write Now()&" "&Err.Description&vbCrLf Err.Clear End If Но ошибка всеравно не handl'ится и в лог ничего не пишется. |
|||
4
Kiber
11.02.10
✎
15:44
|
(3): Извиняюсь, немного не красиво вышло.
Вот скрипт: http://infostart.ru/bitrix/components/bitrix/forum.interface/show_file.php?fid=73700 или http://www.multiupload.com/ZJJFT12HYE Вот лог: http://www.multiupload.com/JMMBWIOT5G После этого выдает Runtime error WSCript.exe Сам участок кода, который выдает ошибку: objInfoBase.ConnectDenied = True Собственно, пытался установить error handler вида: On Error Resume Next Err.Clear objInfoBase.ConnectDenied = True If Err.Number <> 0 Then LogTextStream.Write Now()&" Got error number "&Err.Number&":"&vbCrLf LogTextStream.Write Now()&" "&Err.Description&vbCrLf Err.Clear End If Но ошибка всеравно не handl'ится и в лог ничего не пишется. |
|||
5
73
11.02.10
✎
15:45
|
ХЗ. Могу только повторить:
Пользователь Backup должен быть в списке пользователей базы 1С и обладать административными полномочиями. |
|||
6
Kiber
11.02.10
✎
15:52
|
Назначены все возможные роли, как минимум 1 из которых включает все возможные галочки объектов доступа.
|
|||
7
73
11.02.10
✎
15:55
|
Объекты тут ни при чем. Смотри права на: Конфигурация - Административные функции.
|
|||
8
73
11.02.10
✎
15:57
|
(7)+ Попробуй законнектиться этим пользователем через Консоль Сервера 1СПредприятия и что-нибудь поменять.
|
|||
9
Kiber
11.02.10
✎
16:05
|
Чорт, оказалось всё очень просто....
Неправильный пароль. |
|||
10
Kiber
11.02.10
✎
16:08
|
Спасибо :))))))))
|
|||
11
Kiber
11.02.10
✎
16:08
|
Прошу удалить ветку, ибо бред :)
|
|||
12
Kiber
11.02.10
✎
16:58
|
В общем, по началу у ролей пользователя небыло доступа на внешние подключения.
Затем не совпадал пароль. В итоге, для блокировки я так понял нужен доступ на внешние подключения и Административные функции. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |