Отключение пользователей, установка блокировки начала сеансов и архивация клиент-серверных баз силами 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 не будет опубликован. Обязательные поля помечены *