Скрипт — выгонялка пользователей + резервная копия базы.

В Клиент-серверном режиме работы базы часто возникает необходимость выгонять пользователей чтобы сделать обновление, резервные копии и т.п. Для ленивых, которым неудобно всех выгонять "руками" или ждать окончания рабочего дня, предлагается простой скрипт, который всё сделает за вас.

Скрипт работает очень просто. За вас автоматически авторизуется на кластере серверов и  отключает всех пользователей базы. После чего делается бэкап данных.

Для работы скрипта необходимо зарегистрировать библиотеку ComCntr.dll (Для инициализации объекта V82.Comconnector). Для Windows server 2008 необходимо зарегистрировать COM+ компоненту на основе этой библиотеки.

Скрипт рекомендуется повесить в рассписание сервера.

Ниже приводится пример скрипта (.VBS) для двух баз — зарплаты и бухгалтерии.

‘Скопируйте этот скрипт в текстовый файл txt и поменяйте расширение на VBS

‘Скрипт выгодняет принудительно пользователей из базы данных посредством подключения к кластеру серверов
‘После того как будут выгнаны все пользователи, делается резервное копирование в папку «D:1c_backup»
‘Сохраненные файлы датируются текущей датой, неактуальные копии НЕ УДАЛЯЮТСЯ

‘Процедура закрытия соединений. Создастся служебные пользователи администратора COM.По завершении процедуры они убьются сами
Sub CloseConnection()
    Dim Connector, Agent, Cluster, WorkProcess, WorkProcessConnection, Base, Connections, i, CurrentConnection
    Dim BaseList

    ‘Идентификаторы баз в кластере серверов
    BaseName = «zarp»
    BaseNameAcc = «buhg»

    Set Connector = CreateObject(«V82.COMConnector»)

    ‘Селект текущего кластера серверов
    Set Agent = Connector.ConnectAgent(«127.0.0.1»)
    Set Cluster = Agent.GetClusters()(0)

    Agent.Authenticate Cluster, «aleksei», «7344»

    ‘Получение рабочего процесса кластера
    For Each WorkProcess In Agent.GetWorkingProcesses(Cluster)

            ConnectString = WorkProcess.HostName & «:» & WorkProcess.MainPort

            Set WorkProcessConnection = Connector.ConnectWorkingProcess(ConnectString)

            ‘Установка аутентификации в базах. В бухгалтерии и зарплате создан логин «Алексей»
            WorkProcessConnection.AddAuthentication «Алексей», «tystik1233»

           ‘Получение списков баз на сервере    
            BaseList = WorkProcessConnection.GetInfoBases()

            ‘Отключение пользователей из Зарплаты
            For i = LBound(BaseList) To UBound(BaseList)
                If BaseList(i).Name = BaseName Then
                        Set Base = BaseList(i)

                        ‘Получение соединений с базой, отрубаем всех ктоме COM-Администраторов, он вырубится когда закончится скрипт        
                        Connections = WorkProcessConnection.GetInfoBaseConnections(Base)

                        For j = LBound(Connections) To UBound(Connections)
                            Set CurrentConnection = Connections(j)
                            If CurrentConnection.AppID <> «COMConsole» Then
                         ‘MSGBOX «Пользователь зарплаты : » & CurrentConnection.UserName
                         WorkProcessConnection.Disconnect CurrentConnection
                            End If
                        Next

                   End If
 
                ‘Отключение пользователей из бухгалтерии
                If BaseList(i).Name = BaseNameAcc Then
                        Set Base = BaseList(i)

                    ‘Получение соединений с базой, отрубаем всех ктоме COM-Администраторов, он вырубится когда закончится скрипт
                        Connections = WorkProcessConnection.GetInfoBaseConnections(Base)

                        For l = LBound(Connections) To UBound(Connections)
                            Set CurrentConnection = Connections(l)
                            If CurrentConnection.AppID <> «COMConsole» Then
                         ‘MSGBOX «Пользователь бухгалтерии : » & CurrentConnection.UserName
                         WorkProcessConnection.Disconnect CurrentConnection
                            End If
                        Next
                End If
            Next    

    Next
End Sub

‘Резервная копия, создается файл *.dt по формату ПрефиксБазы_+ТекущаяДата.dt
Sub BackUp()

    ‘Папка архив
    Dim Folder
    Dim FileNameSalary
    Dim FileNameAcc
    Dim WSShell
    
    Folder = «»»D:1c_backup»

    ‘Создание шела для выполнения команд windows
    Set WshShell = Wscript.CreateObject(«Wscript.Shell»)

    ‘Копирование зарплаты
    FileNAmeSalary = Folder & «salarySalary_» & Date() & «.dt»»»
    CmdLine = «»»C:Program Files (x86)1cv828.2.17.143in1cv8.exe»» DESIGNER /S «»127.0.0.1zarp»» /N «»Алексей»» /P «»tystik1233″» /DUMPIB » & FileNameSalary
    WshShell.Run CmdLine, 1, True    
    ‘MSgBox CmdLine
    
    ‘копирование бухгалтерии
    FileNameAcc = Folder & «accAcc_» & Date() & «.dt»»»
    
    CmdLine = «»»C:Program Files (x86)1cv828.2.17.143in1cv8.exe»» DESIGNER /S «»127.0.0.1uhg»» /N «»Алексей»» /P «»tystik1233″» /DuMPIB » & FileNameAcc
    WshShell.Run CmdLine, 1, True    
    ‘MsgBox CmdLine

End Sub

‘# Основной модуль работы программы, сначала выгоняются юзеры, потом делаются бэкапы
CloseConnection
BackUp

 

 

10 Comments

  1. bforce

    Предлагаю разукрасить код, а то грустно смотрится 😎

    http://s-c.me/scme.aspx

    Reply
  2. Borometr

    Много раз слышал фразу, что «выгружать клиент-серверную базу нужно средствами СУБД». Честно говоря не понимал почему. Недавно выгрузил клиент-серверную ЗБУ через конфигуратор, загрузил её во вновь созданную базу уже файловую. Смотрю, а объекты то не все в базе и есть некие отличия от оригинала базы. Почему так получилось, ума не приложу.

    Reply
  3. OrsoBear

    Еще бы готовый комплект с инструкцией.. а то в теории не сразу все понятно. Пришлось еще описания искать.

    Но все равно спасибо.

    Reply
  4. rus128

    огромное количество ошибок.

    читается с трудом.

    Reply
  5. Al-X

    Да, хотелось бы готовый скрипт. А то простое копирование, как-то не совсем работает.

    Reply
  6. gala2009

    не проверяла, но скрипт нужный

    Reply
  7. 1cmax

    куча всякого добра на эту тему давно написано

    Reply
  8. DERL

    Спасибо! Выгонялка очень понадобилась. До этого всегда пользовался Egida Backup, но она очень часто говорит что не нашла бэкап файл во временной директории, а другие архиваторщики не умеют выгонять пользователей или делают это не за бесплатно )).

    Подкорректировал ваш скрипт и все работает.

    Reply
  9. 1_C

    Не выгоняет пользователей под тонким клиентом ,как решить эту проблему??

    Reply
  10. DERL

    (9) я для этого использую метод TerminateSession агента

    вот пример:

    Dim objFSO

    Dim objFile

    Dim LogFileName

    Dim Result

    Sub CloseConnection()

    Dim Connector, Agent, Cluster, WorkProcess, WorkProcessConnection, Base, Connections, i, CurrentConnection

    Dim BaseList

    ‘Идентификаторы баз в кластере серверов

    BaseName = «Base8»

    Set Connector = CreateObject(«V82.COMConnector»)

    ‘Селект текущего кластера серверов

    Set Agent = Connector.ConnectAgent(«MyServer»)

    Set Cluster = Agent.GetClusters()(0)

    Agent.Authenticate Cluster, «Admin», «pass1»

    MassBase = Agent.GetInfoBases(Cluster)

    For i = LBound(MassBase) To UBound(MassBase)

    Set Base = MassBase(i)

    ‘MsgBox Base.Name

    If Base.Name = «Base1CV8» Then

    Sessions = Agent.GetInfoBaseSessions(Cluster, Base)

    For k = LBound(Sessions) To UBound(Sessions)

    Set ThisSession = Sessions(k)

    If ThisSession.AppID <> «COMConsole» Then

    Agent.TerminateSession Cluster, ThisSession

    ‘MsgBox «User: » & ThisSession.UserName & » App ID: » + ThisSession.AppID

    End If

    Next

    Exit For

    End If

    Next

    End Sub

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *