#ПЕРЕМЕННЫЕ
#Параметры запуска: адрес сервера, основной порт кластера, информационная база, логины, пароли
$LoginDB = 'ЛогинБД' #Логин на доступ к базе данных
$PassDB = 'ПарольБД' #Пароль на доступ к базе данных
$LoginHRN = 'ЛогинХранилища' #Логин на доступ к хранилищу конфигурации
$PassHRN = 'ПарольХранилища' #Пароль на доступ к хранилищу конфигурации
$PassUC = 'ПарольUC' #Пароль разрешения на подключение к БД (UC)
$SrvName = 'ИмяСервера' #Имя сервера
$DBName = 'ИмяБазы' #Имя базы данных
$SrvAddr = 'tcp://' + $SrvName + ':1540' #Сетевой путь к серверу БД для подключения
$MainPort = "1541" #Главный порт для подключения к БД
$ComConnector = New-Object -COMObject "V83.COMConnector" #COM коннектор
$Dir = 'C:\Program Files\1cv8\common\1cestart.exe' #Путь к файлу запуска 1С
$DirLog = 'D:\Scripts\log\' #Путь к каталогу журналов ошибок
$OutLog = '/Out"' + $DirLog + '\logFile_1C.txt" -NoTruncate' #Место хранения лога из 1С, каталог LOG должен быть рядом с файлом ps1
#Строковые параметры. Для удобства дальнейшего использования разобрал на параметры и собираем из них нужную последовательность в массивы ниже:
#Путь запуска и параметры запуска
$EntPath = 'ENTERPRISE /s"' + $SrvName + '\' + $DBName + '"'
$ConfPath = 'CONFIG /s"' + $SrvName + '\' + $DBName + '"'
$PassUCParam = '/UC"' + $PassUC + '"'
#Параметры работы.
$DisableWinAuth = '/WA-'
$DisableUpdateQuestion = '/AU-'
$DisableMasseges = '/DisableStartupMessages'
$DisableUsers = '/C"ЗавершитьРаботуПользователей"'
$EnableUsers = '/C"РазрешитьРаботуПользователей"'
$UpdateFromHRN = '/ConfigurationRepositoryUpdateCfg'
$UpdateDB = '/UpdateDBCfg'
#Доступы к БД и хранилищу
$LoginDBParam = '/n"' + $LoginDB + '"'
$PassDBParam = '/p"' + $PassDB + '"'
$PathHRN = '/ConfigurationRepositoryF"\\' + $SrvName + '\hrn\TLE"'
$LoginHRNParam = '/ConfigurationRepositoryN"' + $LoginHRN + '"'
$PassHRNParam = '/ConfigurationRepositoryP"' + $PassHRN + '"'
$WorkBegin = $True
#Собираем параметры в массивы. Шаг 1 и 4 закомментированы, в них производится отключение пользователей через обработку "блокировка работы пользователей" из интерфейса 1С.
#Мы же будем использовать консоль администрирования 1С и устанавливать блокировки через функцию ниже.
#$Step1 = $EntPath,$LoginDB,$PassDB,$DisableWinAuth,$DisableUpdateQuestion,$DisableMasseges,$DisableUpdateQuestion,$DisableUsers,$PassUCParam
$Step2 = $ConfPath,$LoginDBParam,$PassDBParam,$PathHRN,$LoginHRNParam,$PassHRNParam,$UpdateFromHRN,$PassUCParam,$OutLog
$Step3 = $ConfPath,$LoginDBParam,$PassDBParam,$PathHRN,$LoginHRNParam,$PassHRNParam,$UpdateDB,$PassUCParam,$OutLog
#$Step4 = $EntPath,$LoginDB,$PassDB,$DisableWinAuth,$DisableUpdateQuestion,$DisableMasseges,$DisableUpdateQuestion,$EnableUsers,$PassUCParam
#-----Функция устанавливает блокировки к базе данных и завершает все сеансы пользователей, если переданны соответсвующие параметры
Function BlockDB($AccessUsers,$TerminateSessions,$DropDesigner) {
# Подключение к агенту сервера
$ServerAgent = $ComConnector.ConnectAgent($SrvAddr)
$ClusterFound = $FALSE
$InfoBaseFound = $FALSE
#Получим массив кластеров сервера
$Clasters = $ServerAgent.GetClusters()
foreach ($Claster in $Clasters){
if ($Claster.MainPort -eq $MainPort){
$ClusterFound = $TRUE
break
}
}
if (!($ClusterFound)){
break
}
# Подключаемся к выбранному кластеру
# если у пользователя под которым будет выполняться сценарий нет прав на кластер,
# можно прописать ниже имя пользователя и пароль администратора кластера
$ServerAgent.Authenticate($Claster,"","")
# Получаем список рабочих процессов кластера
$WorkingProcesses = $ServerAgent.GetWorkingProcesses($Claster)
# Проверяем, если запущен конфигуратор, то отменяем дальнейшую работу
$WorkingBase = $ServerAgent.GetInfoBases($Claster)
foreach ($DBase in $WorkingBase){
if($DBase.Name -eq $DBName){
$DBSessions = $ServerAgent.GetInfoBaseSessions($Claster,$DBase)
foreach ($Session in $DBSessions){
if(!($DropDesigner) -and $Session.AppID -eq 'Designer'){
$WorkBegin = $False
$BreakText = 'Отмена работы скрипта. Запущен конфигуратор в сессии - ИД:' + $Session.SessionID + ', пользователь: ' + $Session.userName + ' использует приложение: ' + $Session.AppID + ', начало сеанса: ' + $Session.StartedAt + ', последняя активность: ' + $Session.LastActiveAT
Write-Host $BreakText
}
}
}
}
# Если разрешено блокировать базу, тогда продолжаем работу
if($WorkBegin){
# Включаем и выключаем блокировку сеансов и регламентных заданий
foreach ($WorkingProcess in $WorkingProcesses){
if (!($WorkingProcess.Running -eq 1) ){
continue
}
$CWPAddr = "tcp://"+$WorkingProcess.HostName+":"+$WorkingProcess.MainPort
$CWP = $ComConnector.ConnectWorkingProcess($CWPAddr)
$CWP.AddAuthentication($LoginDB, $PassDB)
$DBs = $CWP.GetInfoBases()
foreach ($DB in $DBs){
if ($DB.Name -eq $DBName ){
# Устанавливаем/снимаем блокировку соединений и рекламентных заданий БД
$DB.SessionsDenied = $AccessUsers
$DB.ScheduledJobsDenied = $AccessUsers
$DB.PermissionCode = $PassUC
$CWP.UpdateInfoBase($DB)
}
}
}
# Завершаем сеансы пользователя, если требуется
if ($TerminateSessions){
foreach ($DBase in $WorkingBase){
if($DBase.Name -eq $DBName){
$DBSessions = $ServerAgent.GetInfoBaseSessions($Claster,$DBase)
foreach ($Session in $DBSessions){
$ServerAgent.TerminateSession($Claster,$Session)
$ExitSessionText = 'Завершена сессия - ИД: ' + $Session.SessionID + ', пользователь: ' + $Session.userName + ', приложение: ' + $Session.AppID + ', начало сеанса: ' + $Session.StartedAt + ', последняя активность: ' + $Session.LastActiveAT
Write-Host $ExitSessionText
}
}
}
}
}
$ComConnector = ""
}
#-----Функция Обновление базы данных
Function UpdateDB{
Start-Process -FilePath $Dir -ArgumentList $Step2 -Wait
Start-Process -FilePath $Dir -ArgumentList $Step3 -Wait
}
#-----Добавимв в лог 1С строку начала операции с датами:
$Date = Get-Date -Format "dd.MM.yyyy HH:mm:ss"
$StringLog1C = "Operation was started at " + $Date + ": " + "`r`n"
$StringLog1C | out-file $DirLog\logFile_1C.txt -append
#-----Выполнение с выводом в лог
Start-Transcript -Path $DirLog\logfilePS.log
BlockDB $True $True $False
Wait-Event -Timeout 15
UpdateDB
BlockDB $False $True $False
#-----Добавим в лог 1С строку окончания операции с датами:
$Date = Get-Date -Format "dd.MM.yyyy HH:mm:ss"
$EndingLog1C = "`r`n" + "Operation was finished at " + $Date
$EndingLog1C | out-file $DirLog\logFile_1C.txt -append
"////////////////////////////////////////`r`n" | out-file $DirLog\logFile_1C.txt -append