Имя: Пароль:
1C
 
Ошибка 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
В общем, по началу у ролей пользователя небыло доступа на внешние подключения.
Затем не совпадал пароль.
В итоге, для блокировки я так понял нужен доступ на внешние подключения и Административные функции.
Я не хочу быть самым богатым человеком на кладбище. Засыпать с чувством, что за день я сделал какую-нибудь потрясающую вещь — вот что меня интересует. Стив Джобс