Особенности автоматизации установки платформы 1С с помощью PowerShell

Коллеги, привет) Меня зовут Юрий, и я IT-инженер сервиса 42Clouds. На поддержке у меня большое количество серверов, в том числе с ролью сервера предприятия по технологии 1С fresh. Довольно часто обновление конфигурации 1С требует повышения версии платформы 1С. Обновление вручную достаточно трудоемкий процесс и в связи с этим появилась идея автоматизации и упрощения этой задачи.

В этой статье я делюсь своим опытом и наработками по части автоматической установки 1С (будь то клиент, сервер или все вместе взятое).

Все решения, которые есть, меня не устраивали либо своим функционалом, либо требовали установки дополнительных компонентов, порой сторонних. Пришел к выводу, что проще сделать самостоятельно.

Собственно, что я хочу. Хочу указать в некотором текстовом файле (servers.txt) имена целевых серверов, и на них скриптом поставить нужные мне компоненты новой платформы со всеми необходимыми настройками.

Инструмент для автоматизации был выбран PowerShell. Сразу отмечу, что тестировалась работа скрипта лишь на Windows 2016, удаления предыдущих версий не включались в скрипт, но в дальнейшем доработаю и это.

ВАЖНО!

Сервер предприятия 1С можно установить двумя способами:

  • как приложение, но тогда службу придется устанавливать вручную скриптом;
  • как сервис, при этом служба установится автоматически.

Скрипт устанавливает сервер предприятия (в дальнейшем СП) как приложение. Поэтому, если вы предыдущую версию платформы поставили вручную, а теперь новую версию будете ставить скриптом, учтите, что при удалении старой версии, удалится и служба 1С. Перед работой рекомендую удалить предыдущую версию СП.

А теперь сам скрипт (сразу отмечу, что с его помощью устанавливаю и клиента x32, и клиента x64, и СП):

#Список серверов для установки $Servers = Get-Content “.\servers.txt” $Version = “8.3.20.1674”

#Источник дистрибутивов:

$SourcePath_x64 = “\\192.168.0.100\Install\1CDistr\”+$Version+”-64\”
$SourcePath_x32 = “\\192.168.0.100\Install\1CDistr\”+$Version+”-32\”

$Servers | ForEach-Object {

#Подготовительный этап: создание директории Temp_Install на каждом целевом сервере.

$DestPath = “\\$_\C$\Temp_Install\”

#Вспомогательные переменные

$InstallPath_x64 = “\\$_\C$\Temp_Install\”+$Version+”-64\setup.exe”
$InstallPath_x32 = “\\$_\C$\Temp_Install\”+$Version+”-32\setup.exe”
$Source1cestart_x64 = “\\192.168.0.100\Install\1CDistr\1cestart\serv_x64_client_x64\1cestart.cfg”
$Source1cestart_x32 = “\\192.168.0.100\Install\1CDistr\1cestart\client_x32\1cestart.cfg”
$DestPath1cestart = “\\$_\C$\ProgramData\1C\1CEStart\”
$bin_x64 = “\\$_\C$\Program Files\1cv8\”+$Version+”\bin\”
$bin_x32 = “\\$_\C$\Program Files (x86)\1cv8\”+$Version+”\bin\”

if(Test-Path $DestPath) {

Remove-Item $DestPath\* -Recurse -Force; Write-Host “$_ – Папка $DestPath существует (уже очищена)” -ForegroundColor Green;

} else {

New-Item -Path $DestPath -ItemType directory }

#Копируем папку с дистрибами локально на целевые хосты

try { Copy-Item -Path $SourcePath_x64 -destination $DestPath -Recurse -Force; Copy-Item -Path $SourcePath_x32 -destination $DestPath -Recurse -Force; Write-Host “$_ – Дистрибутивы скопированы на целевой сервер” -ForegroundColor Green } catch { Write-Host “$_ – Дистрибутивы не скопированы на целевой сервер” -ForegroundColor Red; Write-Host $Error[0] -ForegroundColor Red }

#Установка client_x32: #Файл с выбором компонентов установки

try { Copy-Item -Path $Source1cestart_x32 -destination $DestPath1cestart -Force Write-Host “$_ – Компоненты для установки client_x32 определены” -ForegroundColor Green;; } catch { Write-Host “$_ – Компоненты для установки client_x32 не определены” -ForegroundColor Red; }

#Проверка, установлена ли платформа client 1c x32

$bin_1cv8c_x32 = “\\$_\C$\Program Files (x86)\1cv8\”+$Version+”\bin\1cv8c.exe”

if(!(Test-Path -Path $bin_1cv8c_x32)) {

Add-Content “.\result_not_installed_client_x32.txt” “$_” Write-Host “$_ – Client 1C $Version`(x32`) не установлен” -ForegroundColor Cyan }

else { Add-Content “.\result_installed_client_x32.txt” “$_” Write-Host “$_ – Client 1C $Version`(x32`) установлен” -ForegroundColor Red }

#Проверка, установлен ли сервер 1С:

$bin_ragent = “\\$_\C$\Program Files\1cv8\”+$Version+”\bin\ragent.exe”

if(!(Test-Path -Path $bin_ragent)) { Add-Content “.\result_not_installed_x64.txt” “$_” Write-Host “$_ – Сервер 1C $Version`(x86-64`) не установлен” -ForegroundColor Cyan }

else { Add-Content “.\result_installed_x64.txt” “$_”; Write-Host “$_ – Server 1C $Version`(x86-64`) установлен” -ForegroundColor Red } }

$not_installed_x32 = Get-Content “.\result_not_installed_client_x32.txt” $not_installed_x32 | ForEach-Object {

#Устанавливаем client 1Сx32: try { Invoke-Command -computername $not_installed_x32 -Credential $cred -ScriptBlock {Start-Process -FilePath $using:InstallPath_x32 -Args ‘/s’ -Wait}; Write-Host “$_ – Client 1С_x32 установлен” -ForegroundColor Green; }

catch { Write-Host “$_ – Client 1С_x32 не установлен” -ForegroundColor Red; }

$Date = Get-Date -Format yyyy-MM-dd_hh-mm

Rename-Item -Path “.\result_not_installed_client_x32.txt” -NewName “result_not_installed_client_x32_$date.txt” -force

#Установка_x64: #Файл с выбором компонентов установки

try { Copy-Item -Path $Source1cestart_x64 -destination $DestPath1cestart -Force Write-Host “$_ – Компоненты для установки server&client_x64 определены” -ForegroundColor Green; } catch { Write-Host “$_ – Компоненты для установки server&client_x64 не определены” -ForegroundColor Red; } }

#Непосредственно установка:

$not_installed_x64 = Get-Content “.\result_not_installed_x64.txt” $not_installed_x64 | ForEach-Object {

try { Invoke-Command -computername $not_installed_x64 -Credential $cred -ScriptBlock {Start-Process -FilePath $using:InstallPath_x64 -Args ‘/s’ -Wait}; Write-Host “$_ – Сервер 1С установлен” -ForegroundColor Green; }

catch{ Write-Host “$_ – Сервер 1С не установлен” -ForegroundColor Red; }

#Регистрируем и запускаем службу 1С:

$serviceName = “1C:Enterprise 8.3 Server Agent (x86-64)” $description = “Агент сервера 1С:Предприятия 8.3 (x86-64)”

Invoke-Command -computername $not_installed_x64 -ScriptBlock { if (Get-Service $using:serviceName -ErrorAction SilentlyContinue) { Stop-Service -Name $using:serviceName -Force; $serviceToRemove = Get-WmiObject -Class Win32_Service -Filter “name = ‘$using:serviceName’”; $serviceToRemove.delete(); Write-Host “$_ – Служба 1С успешно удалена” -ForegroundColor Cyan; } else { “service does not exists” }

#installing service 1C

$secpasswd = ConvertTo-SecureString “Qwert_123!!” -AsPlainText -Force $mycreds = New-Object System.Management.Automation.PSCredential (“ad\Usr1c-Cli”, $secpasswd) $binaryPath =”””C:\Program Files\1cv8\”+$using:Version+”\bin\ragent.exe`” -srvc -agent -regport 1541 -port 1540 -range 1560:1591 -d `”d:\1cv8\srvinfo`” /debug”

New-Service -Name $using:serviceName -BinaryPathName $binaryPath -displayName $using:description -startupType Automatic -credential $mycreds; Start-Service -Name $using:serviceName;

#Проверяем, установлена ли служба 1С:

if (Get-Service $using:serviceName -ErrorAction SilentlyContinue) { Write-host “$_ – Служба 1С установлена” -ForegroundColor Green; } else { Write-Host “$_ – Служба 1С не установлена” -ForegroundColor Red; }

#Проверяем. запущена ли служба 1С:

if (Get-Service -Name $using:serviceName | Where-Object {$_.Status -EQ “Running”}) { Write-Host “$_ – Служба 1С успешно запущена” -ForegroundColor Green; } else { Write-Host “$_ – Служба 1С не запущена” -ForegroundColor Red; } }

#Регистрируем консоль администрирования:

$regbin = “C:\Program Files\1cv8\”+$Version+”\bin\radmin.dll”

try { Invoke-Command -computername $not_installed_x64 {cmd /c (regsvr32 /s $using:regbin)}; Write-host “$_ – Консоль администрирования 1С зарегистрирована” -ForegroundColor Green; } catch{ Write-host “$_ – Консоль администрирования 1С не зарегистрирована” -ForegroundColor Red; }

#Заключительный этап. удаляем папку Temp_Install на каждом целевом сервере:

try { Remove-Item -path $DestPath -Recurse -Force; Write-host “$_ – Папка $DestPath удалена на целевом компьютере” -ForegroundColor Green; } catch { Write-host “$_ – Папка $DestPath не удалена на целевом компьютере” -ForegroundColor Red; } } Rename-Item -Path “.\result_not_installed_x64.txt” -NewName “result_not_installed_x64_$date.txt” -force

Для чего надо было копировать папку с дистрибутивами на каждый целевой сервер?

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

Как определить компоненты для установки?

Для этого нужно установить платформу с нужными компонентами. Файл с перечнем этих компонентов будет находиться по пути: “C:\ProgramData\1C\1CEStart\1cestart.cfg” Просто его копируете и в дальнейшем пользуетесь.

При установке пытался использовать исключительно PowerShell, без привлечения cmd. Но для регистрации консоли администрирования не нашел такую возможность у PowerShell без использования сторонних “костылей”.

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

Уже более 10 000 компаний работают в облачной 1С от 42Clouds

– Консультация по 1С Бесплатно!

– Поддержка 24/7 по техническим вопросам: в чате, по телефону, по почте

– Все типовые конфигурации онлайн, доступ через RDP, Remote App, Web

Смотрите также

Оставьте заявку. Мы свяжемся с вами в самое ближайшее время.

*нажимая на кнопку, Вы даете согласие на обработку персональных данных

Оставьте отзыв о нас

Расскажите, как сервис 42Clouds помог вашему бизнесу.

Отзыв будет опубликован после проверки модератором.

Оставьте заявку. Мы свяжемся с вами в самое ближайшее время.

*нажимая на кнопку, Вы даете согласие на обработку персональных данных