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

Опубликовал CHEBURASHKA (cheburashka) в раздел Администрирование - Архивирование (backup)

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 Files\1cv82\";
}
$Version1C = (Get-Command ($PathTo1C+"common\1cestart.exe")).FileVersionInfo.FileVersion;
Set-Alias exe82 ($PathTo1C+$Version1C+"\bin\1cv8.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 = "";

Скачать файлы

Наименование Файл Версия Размер
Backup 1C.ps1
.ps1 9,60Kb
07.10.13
36
.ps1 9,60Kb 36 Скачать

См. также

Комментарии
1. Павел И. (3.14159) 84 07.10.13 16:03 Сейчас в теме
# Создаем бэкап


фирма 1С не рекомендует таким образом бэкапы делать
2. CHEBURASHKA (cheburashka) 31 07.10.13 18:53 Сейчас в теме
(1)На этот счет уже достаточно различных мнений. Думаю, удобство использования *.dt Вы оспаривать не будете?
3. Павел И. (3.14159) 84 07.10.13 20:23 Сейчас в теме
(2) cheburashka, в чем удобство использования *.dt в клиент-серверном варианте?
4. CHEBURASHKA (cheburashka) 31 07.10.13 20:33 Сейчас в теме
(3)Например, такой архив легко можно развернуть на любой другой машине для отладки.
5. Serj (Serj1C) 461 08.10.13 07:08 Сейчас в теме
6. Александр Лыткин (TrinitronOTV) 08.10.13 09:42 Сейчас в теме
извиняюсь конечно, но я что-то не увидел, где надо прописывать свои пути к базе данных и архивам, ткинте меня, пожалуйста...
7. TexNick ... (xbic) 16 08.10.13 10:00 Сейчас в теме
Опишите в комментариях где нужно указать параметры скрипта, либо опишите пример...
8. CHEBURASHKA (cheburashka) 31 08.10.13 10:42 Сейчас в теме
(6) TrinitronOTV, (7) xbic, 3-я и 4-я строки снизу:

PerformBackup "localhost\" "InfoBase" "Администратор" "" $BackupFolderPath;
DeleteOldArchives $BackupFolderPath $StorageDays
9. Алексей Роза (DoctorRoza) 09.10.13 08:24 Сейчас в теме
Оренбургу привет! :)
Данный скрипт может выгнать из файловой БД или из серверной? Или обеих?

Плюсануть не могу, забанили видимо, но скрипт скачал!
10. CHEBURASHKA (cheburashka) 31 09.10.13 09:06 Сейчас в теме
(9) DoctorRoza, только из серверной.
11. Vova Petrov (bdsmka) 11.12.14 10:49 Сейчас в теме
Очень интересный скрипт, спс за труд.
Подскажите пожалуйста: Скрипт выгоняет всех пользователей с кластера, так и должно быть? Или все таки можно только из конкретной базы?
Возможно ли указать несколько кластеров?
Что должно быть в этой переменной $IBConnectionString ?
12. CHEBURASHKA (cheburashka) 31 11.12.14 13:58 Сейчас в теме
(11) bdsmka,
Подскажите пожалуйста: Скрипт выгоняет всех пользователей с кластера, так и должно быть?

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

В данном случае здесь указано "localhost\", что говорит о том, что база СУБД находится на данном компьютере. Если у Вас СУБД находится на другом компе, то необходимо указать его псевдоним или IP.
13. Vova Petrov (bdsmka) 11.12.14 14:41 Сейчас в теме
В данном случае здесь указано "localhost\", что говорит о том, что база СУБД находится на данном компьютере. Если у Вас СУБД находится на другом компе, то необходимо указать его псевдоним или IP.


А если база на MSSQL?
14. CHEBURASHKA (cheburashka) 31 11.12.14 15:56 Сейчас в теме
(13) bdsmka, моя база тоже на MSSQL, но сервер баз данных и сервер приложения 1С находится на одном компе, поэтому "localhost\".
15. Digital Man (DigitalMan) 4 11.06.15 06:46 Сейчас в теме
PermissionCode = "GodMode = On"
Вы сделали мой день! :)
white_sochi; +1 Ответить
16. pallid *** (white_sochi) 87 19.11.15 11:57 Сейчас в теме
строка
$InfoBase.ConnectDenied = $ConnectDenied


актуальна же только для 8.2, в 8.3 надо же вроде указывать
$InfoBase.SessionsDenied  = $ConnectDenied
$InfoBase.ScheduledJobsDenied   = $ConnectDenied


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

17. CHEBURASHKA (cheburashka) 31 19.11.15 20:16 Сейчас в теме
(16) white_sochi, насчет SessionsDenied точно сказать не могу, по идее ConnectDenied тоже должен работать. А ScheduledJobsDenied должно и в 8.2 работать, т.к. это флажок "Блокировка регламентных заданий включена", который и в 8.2 был. Скрипт разрабатывался и тестировался для 8.2.
Оставьте свое сообщение