Уголок СУ-11 на просторах вселенной

вторник, 8 января 2013 г.

VB cкрипт для бэкапа 1С баз, отключает пользователей, блокирует базу, монтирует сетевой диск, выгружает, все закрывает :)


Dim WshNetwork ' объект сети
Dim WshShell ' шел ОС
Dim WshEnv ' переменное окружение шела
Dim ServerName ' DNS имя сервера с 1С
Dim InfoBasesAdminName ' админ базы
Dim InfoBasesAdminPass ' пароль админа базы
Dim ClasterPortNumber ' порт кластера
Dim ClasterAdminName ' админ кластера
Dim ClasterAdminPass ' пароль админа кластера
Dim LockPermissionCode ' код блокировки базы
Dim LockMessageText ' сообщение о блокировке базы
Dim FileName ' имя файла бэкапа
Dim DumpPath ' путь куда бэкапить
Dim ComConnector ' ком объект 1С
Dim ConnectToWProc ' коннектор к 1С процессу
Dim ServerAgent ' адрес агента 1С
Dim PrgDirx86 ' exe 1Ски
Dim CommandExe ' команда на запуск
Dim NetPath ' сетевой путь к бэкапам

Function init()
Set WshNetwork = WScript.CreateObject("WScript.Network")
Set ComConnector = CreateObject("v82.COMConnector")
Set ServerAgent = ComConnector.ConnectAgent(ServerName)
Set WshShell = CreateObject("WScript.Shell")
Set WshEnv = WshShell.Environment
NetPath = "\\192.168.1.1\backups\1C\dt"
ServerName = "srv-1csql"
InfoBasesAdminName = "backuper"
InfoBasesAdminPass = "123backuper"
ClasterPortNumber = 1541
ClasterAdminName = "Administrator"
ClasterAdminPass = "пароль админа кластера"
LockPermissionCode = "12345"
LockMessageText = vbCrLf + "База закрыта на создание резервной копии, примерно, на 10 минут"
DumpPath = "X:"
' получаем exe 1Ски, оно будет делать выгрузку
PrgDirx86 = WshShell.RegRead("HKEY_CLASSES_ROOT\CLSID\{5CD98F13-1050-4b43-84F2-33AD97CFC287}\LocalServer32\")
End Function

Function destroy()
WshNetwork = Null
ComConnector = Null
ServerAgent = Null
ConnectToWProc = Null
WshShell = Null
WshEnv = Null
End Function

Function Base_BKP(InfoBaseName) ' имя базы для бэкапа
Dim FindInfoBase ' признак успешного поиска базы
Dim Clasters ' массив кластеров сервера у агента сервера
Dim Claster ' кластер 1С
Dim WorkingProcesses ' массив рабочих процессов
Dim WorkingProcess ' рабочий процесс в кластере 1С
Dim InfoBases ' массив рабочих баз рабочего процесса
Dim InfoBase ' информационная база
Dim Connections ' массив подключений
Dim Connection ' подключение

FindInfoBase = False
FileName = DumpPath & "\" & InfoBaseName & "_" & _
Right("0" & Day(Now), 2) & "." & Right("0" & Month(Now), 2) & "." & Year(Now) & _
"-" & Right("0" & Hour(Now), 2) & "." & Right("0" & Minute(Now), 2) & "." + Right(Second(Now), 2) & ".dt"          
CommandExe = """" + PrgDirx86 + """ CONFIG /S" + ServerName + "\" + InfoBaseName + _
" /N" + InfoBasesAdminName + " /P" + InfoBasesAdminPass + _
" /UC" + LockPermissionCode + " /DisableStartupMessages /DumpIB " + FileName

Clasters = ServerAgent.GetClusters()
For Each Claster In Clasters
If Claster.MainPort = ClasterPortNumber Then
ServerAgent.Authenticate Claster, ClasterAdminName, ClasterAdminPass ' аутентифицируемся в кластере
WorkingProcesses = ServerAgent.GetWorkingProcesses(Claster) ' получаем список массив рабочих процессов кластера
For Each WorkingProcess In WorkingProcesses
If WorkingProcess.Running = 1 Then
' подключаемся к рабочему процессу
Set ConnectToWProc = ComConnector.ConnectWorkingProcess("tcp://" + WorkingProcess.HostName + ":" + CStr(WorkingProcess.MainPort))
ConnectToWProc.AuthenticateAdmin ClasterAdminName, ClasterAdminPass
          ConnectToWProc.AddAuthentication InfoBasesAdminName, InfoBasesAdminPass
      ' ищим базу данных
      InfoBases = ConnectToWProc.GetInfoBases() ' получаем массив баз данных
      For Each InfoBase In InfoBases
  If UCase(InfoBase.Name) = UCase(InfoBaseName) Then ' нашли нужную нам базу
      FindInfoBase = True
              Exit For
      End If
      Next
End If  
    ' закрываем все активные подключения во всех рабочих процессах
    Connections = ConnectToWProc.GetInfoBaseConnections(InfoBase) ' получаем массив соединений с базой
    For Each Connection In Connections
    If Connection.AppId <> "COMConsole" Then
    ConnectToWProc.Disconnect(Connection) ' разрываем соединения с базой
End If
    Next
Next
End If
Next

If FindInfoBase = True Then
' блокируем базу
InfoBase.ConnectDenied = True        
InfoBase.DeniedFrom = CStr(Now())
   InfoBase.DeniedTo = CStr(Now() + 1 / 300)
   InfoBase.DeniedMessage = LockMessageText
   InfoBase.PermissionCode = LockPermissionCode
   ConnectToWProc.UpdateInfoBase(InfoBase)

 
WshNetwork.MapNetworkDrive DumpPath, NetPath, "false", "CORP\backuper", "123backuper"  
   ' архивируем базу
WshShell.Run CommandExe, 0, True
WshNetwork.RemoveNetworkDrive DumpPath, "true", "true"
' отключаем блокировку базы
InfoBase.ConnectDenied = False
ConnectToWProc.UpdateInfoBase(InfoBase)
FindInfoBase = False
End If
End Function

init()
'Base_BKP("ka_bf")
Base_BKP("new_work")
destroy()