Отключение пользователей, установка блокировки начала сеансов и архивация клиент-серверных баз силами PowerShell

1) Отключение работающих пользователей;
2) Установка блокировки начала сеансов (устанавливается на 2 часа);
3) Архивация баз;
4) Удаление старых архивов.

Все это в одном скрипте на PowerShell.

За основу взята данная публикация.

Скрипт позволяет провести все указанные выше операции, снабжен комментариями и, благодаря тому, что PowerShell является неотъемлемой компонентой системы начиная с Win7 (так же доступен и в более ранних ОС), может быть легко и быстро адаптирован под нужды каждого.

В данном случае приведен пример архивации одной базы и удаление ее архивов старше 60 дней. В случае аварийного завершения скрипта блокировка начала сеансов будет снята через 2 часа.

# Описание функций

function PerformBackup([string]$IBConnectionString, [string]$IBName ,[string]$User, [string]$Pass = "", [string]$BackupDirectory, [string]$ClasterUser = "", [string]$ClasterPass = "")
{
# Удалим сессии
# Аутентификация к выбранному кластеру
# если у пользователя под которым будет выполняться сценарий нет прав на кластер,
# можно прописать ниже имя пользователя и пароль администратора кластера
$ServerAgent.Authenticate($Claster, $ClasterUser, $ClasterPass)

# Получаем список сессий кластера и прерываем их
$Sessions = $ServerAgent.GetSessions($Claster)
if (!($Sessions.Count -eq 0))
{
write-host "Разрывается" $Sessions.Count "сессий базы" $InfoBaseName
foreach ($Session in $Sessions)
{
$ServerAgent.TerminateSession($Claster, $Session)
}
}

# Устанавливаем блокировку начала сеансов
write-host "Установлена блокировка начала сеансов к базе $IBName";
ChangeConnectDenied $IBName $True $User $Pass

# Создаем бэкап
write-host "Создание бэкапа базы $IBName";
$curtime = Get-Date -Format 'dd.MM.yyyy';
$arglist = "CONFIG /s """+$IBConnectionString+$IBName+"""  /N """+$User+""" /P """+$Pass+""" /DisableStartupMessages /Out """+$BackupDirectory+"log_"+$curtime+".txt"" /DumpIB """+$BackupDirectory+$curtime+".dt"" /UC ""GodMode = On""";
Start-Process -wait (Get-Alias -name exe82).definition -ArgumentList $arglist;

write-host "Архив базы $IBName успешно скопирован в файл $BackupDirectory$curtime.dt";

# Снимаем блокировку начала сеансов
write-host "Блокировка начала сеансов к базе $IBName снята";
ChangeConnectDenied $IBName $False $User $Pass
}

function ChangeConnectDenied([string]$InfoBaseName, [bool]$ConnectDenied, [string]$User = "", [string]$Pass = "")
{
# Получаем список рабочих процессов кластера
$WorkingProcesses = $ServerAgent.GetWorkingProcesses($Claster)

foreach ($WorkingProcess in $WorkingProcesses)
{
if (!($WorkingProcess.Running -eq 1))
{
continue
}

$CWPAddr = "tcp://"+$WorkingProcess.HostName+":"+$WorkingProcess.MainPort
$CWP = $V82Com.ConnectWorkingProcess($CWPAddr)
$CWP.AddAuthentication($User, $Pass)

$InfoBases = $CWP.GetInfoBases()

foreach ($InfoBase in $InfoBases)
{
if ($InfoBase.Name -eq $InfoBaseName)
{
$InfoBaseFound = $TRUE
break
}
}

if (!($InfoBaseFound))
{
write-host "Не найдена указанная в параметрах запуска ИБ..."
break
}

# Устанавливаем/снимаем блокировку соединений ИБ
$InfoBase.ConnectDenied = $ConnectDenied
$InfoBase.PermissionCode = "GodMode = On";
$InfoBase.DeniedFrom = Get-Date -Format "yyyy-MM-dd HH:mm:ss";
$InfoBase.DeniedTo = (Get-Date).AddHours(2).ToString("yyyy-MM-dd HH:mm:ss") # Блокировка автоматически будет снята через 2 часа
$CWP.UpdateInfoBase($InfoBase)
}
}

function DeleteOldArchives([string]$BackupFolderPath, [int]$StorageDays)
{
$AbsStorageDays = [Math]::Abs($StorageDays)
$CurrentDate = Get-Date
$OldDate = $CurrentDate.AddDays($StorageDays)
write-host "Удаление архивов из $BackupFolderPath за последние $AbsStorageDays дней"
Get-ChildItem $BackupFolderPath | Where-Object { $_.LastWriteTime -lt $OldDate } | Remove-Item
}

#///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

# По версии стартера определяем путь к 1С последней версии (это позволяет не заморачиваться с перепиской скрипта при обновлении платформы)
if (Test-Path -path "C:Program Files (x86)1cv82")
{
$PathTo1C = "C:Program Files (x86)1cv82";
}
else
{
$PathTo1C = "C:Program Files1cv82";
}
$Version1C = (Get-Command ($PathTo1C+"common1cestart.exe")).FileVersionInfo.FileVersion;
Set-Alias exe82 ($PathTo1C+$Version1C+"in1cv8.exe");

# Параметры запуска сценария: адрес сервера, основной порт кластера, количество дней хранения архивов, путь к папке с архивами
$SrvAddr = "tcp://localhost:1540"
$MainPort = "1541"
$StorageDays = -60 # знак "-" обязателен, иначе дата увеличится на указанное количество дней
$BackupFolderPath = "d:Backup"

$V82Com = New-Object -COMObject "V82.COMConnector"

# Подключение к агенту сервера
$ServerAgent = $V82Com.ConnectAgent($SrvAddr)
$ClusterFound = $FALSE
$InfoBaseFound = $FALSE

# Получим массив кластеров сервера
$Clasters = $ServerAgent.GetClusters()

foreach ($Claster in $Clasters)
{
if ($Claster.MainPort -eq $MainPort)
{
$ClusterFound = $TRUE
break
}
}

if (!($ClusterFound))
{
break
}

# Выполнение архивации базы InfoBase и удаление старых архивов
PerformBackup "localhost" "InfoBase" "Администратор" "" $BackupFolderPath;
DeleteOldArchives $BackupFolderPath $StorageDays

$V82Com = "";

20 Comments

  1. 3.14159
    # Создаем бэкап

    фирма 1С не рекомендует таким образом бэкапы делать

    Reply
  2. cheburashka

    (1)На этот счет уже достаточно различных мнений. Думаю, удобство использования *.dt Вы оспаривать не будете?

    Reply
  3. 3.14159

    (2) в чем удобство использования *.dt в клиент-серверном варианте?

    Reply
  4. cheburashka

    (3)Например, такой архив легко можно развернуть на любой другой машине для отладки.

    Reply
  5. Serj1C

    С почином

    Reply
  6. TrinitronOTV

    извиняюсь конечно, но я что-то не увидел, где надо прописывать свои пути к базе данных и архивам, ткинте меня, пожалуйста…

    Reply
  7. xbic

    Опишите в комментариях где нужно указать параметры скрипта, либо опишите пример…

    Reply
  8. cheburashka

    (6) TrinitronOTV, (7) xbic, 3-я и 4-я строки снизу:

    PerformBackup «localhost» «InfoBase» «Администратор» «» $BackupFolderPath;
    DeleteOldArchives $BackupFolderPath $StorageDays
    Reply
  9. DoctorRoza

    Оренбургу привет! 🙂

    Данный скрипт может выгнать из файловой БД или из серверной? Или обеих?

    Плюсануть не могу, забанили видимо, но скрипт скачал!

    Reply
  10. cheburashka

    (9) DoctorRoza, только из серверной.

    Reply
  11. bdsmka

    Очень интересный скрипт, спс за труд.

    Подскажите пожалуйста: Скрипт выгоняет всех пользователей с кластера, так и должно быть? Или все таки можно только из конкретной базы?

    Возможно ли указать несколько кластеров?

    Что должно быть в этой переменной $IBConnectionString ?

    Reply
  12. cheburashka

    (11) bdsmka,

    Подскажите пожалуйста: Скрипт выгоняет всех пользователей с кластера, так и должно быть?

    Да, так и должно быть в данной реализации скрипта. Недавно сам понял, что это не очень удобно. Необходимо изменить скрипт, чтобы он выкидывал пользователей только из архивируемой базы.

    Что должно быть в этой переменной $IBConnectionString ?

    В данном случае здесь указано «localhost», что говорит о том, что база СУБД находится на данном компьютере. Если у Вас СУБД находится на другом компе, то необходимо указать его псевдоним или IP.

    Reply
  13. bdsmka
    В данном случае здесь указано «localhost», что говорит о том, что база СУБД находится на данном компьютере. Если у Вас СУБД находится на другом компе, то необходимо указать его псевдоним или IP.

    А если база на MSSQL?

    Reply
  14. cheburashka

    (13) bdsmka, моя база тоже на MSSQL, но сервер баз данных и сервер приложения 1С находится на одном компе, поэтому «localhost».

    Reply
  15. DigitalMan

    PermissionCode = «GodMode = On»

    Вы сделали мой день! 🙂

    Reply
  16. pallid

    строка

    $InfoBase.ConnectDenied = $ConnectDenied

    актуальна же только для 8.2, в 8.3 надо же вроде указывать

    $InfoBase.SessionsDenied  = $ConnectDenied
    $InfoBase.ScheduledJobsDenied   = $ConnectDenied
    

    Правильно я понимаю???

    Reply
  17. cheburashka

    (16) white_sochi, насчет SessionsDenied точно сказать не могу, по идее ConnectDenied тоже должен работать. А ScheduledJobsDenied должно и в 8.2 работать, т.к. это флажок «Блокировка регламентных заданий включена», который и в 8.2 был. Скрипт разрабатывался и тестировался для 8.2.

    Reply
  18. advanter

    Предлагаю вариант.

    Reply
  19. advanter

    (12)

    Недавно сам понял, что это не очень удобно. Необходимо изменить скрипт, чтобы он выкидывал пользователей только из архивируемой базы.

    function BlockCluster([string]$IBConnectionString, [string]$IBName ,[string]$User, [string]$Pass = «», [string]$ClusterUser = «», [string]$ClusterPass = «»)
    {
    $ServerAgent.Authenticate($Cluster, $ClusterUser, $ClusterPass)
    $InfoBasesInCluster= $ServerAgent.GetInfoBases($Cluster)
    if (!($InfoBasesInCluster.Count -eq 0))
    {
    foreach ($InfoBaseInCluster in $InfoBasesInCluster)
    {
    if ($InfoBaseInCluster.Name -eq $IBName)
    {
    $Sessions = $ServerAgent.GetInfoBaseSessions($Cluster, $InfoBaseInCluster)
    if (!($Sessions.Count -eq 0))
    {
    foreach ($Session in $Sessions)
    {
    $ServerAgent.TerminateSession($Cluster, $Session)
    }
    }
    }
    }
    }
    
    write-host «Started blocking sessions to base $IBName»;
    ChangeConnectDenied $IBName $True $User $Pass
    
    }

    Показать

    Подробнее

    Reply
  20. sssss_aaaaa_2011

    (4)Только надо пользователей выгонять. Очень удобно.

    Reply

Leave a Comment

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