Примеры скриптов PowerShell для 1С
Данные > Статьи и инструкции > Администрирование

Практическая коллекция скриптов для PowerShell, созданных для автоматизации, администрирования и оптимизации инфраструктуры 1С. Каждый скрипт протестирован в реальных сценариях и адаптирован под типовые задачи системных администраторов и разработчиков. Цель - сократить рутину, повысить стабильность и упростить управление серверной частью 1С.
1. Скрипт PowerShell предназначен для автоматического завершения всех активных сеансов пользователей на сервере 1С:Предприятие, работающем через ragent.exe. Он определяет версию платформы, подключается к кластеру через COMConnector, завершает сеансы и записывает все действия в лог-файл.
- На первом этапе скрипт получает список служб Windows и фильтрует те, которые запускают ragent.exe. Затем он извлекает путь к исполняемому файлу агента и анализирует параметры командной строки, переданные при запуске службы. Эти параметры включают путь к кластеру, порты регистрации и подключения, а также диапазон портов.
- После этого скрипт проверяет наличие файла агента и извлекает версию платформы 1С. В зависимости от версии создается COM-объект V82.COMConnector или V83.COMConnector, который используется для подключения к агенту по адресу tcp://localhost:<порт>.
- Скрипт получает список кластеров, аутентифицируется (поля имени и пароля администратора пока пустые), получает список активных сеансов и завершает каждый из них. При завершении сеанса выводится информация о пользователе и идентификаторе сеанса.
Все ключевые действия, включая запуск скрипта, найденные сеансы, завершение каждого сеанса и возможные ошибки, записываются в лог-файл по пути C:\Logs\1C_Session_Termination.log. Каждая запись содержит отметку времени и уровень сообщения (информация или ошибка), что позволяет отслеживать выполнение скрипта и диагностировать проблемы.
Завершения всех активных сеансов пользователей на сервере 1С
$logFile = "C:\Logs\1C_Session_Termination.log"
function Write-Log {
param (
[string]$message,
[string]$level = "INFO"
)
$timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
"$timestamp [$level] $message" | Out-File -FilePath $logFile -Append -Encoding UTF8
}
Write-Log "Запуск скрипта завершения сеансов 1С"
$services1C = Get-WmiObject win32_service | ?{$_.Name -like '*'} |
Select Name, DisplayName, State, PathName |
Where-Object { $_.PathName -Like "*ragent.exe*" }
$services1C | % {
$serviceInfo = $_
$serviceExecPath = $services1C.PathName
$serviceExecPathRagent = $services1C.PathName.split('"')[1]
$hash = [ordered]@{}
$serviceExecPath.Split("-").Trim() | Where-Object { $_.Contains(" ") } | ForEach-Object {
$name, $value = $_ -split '\s+', 2
$hash[$name] = $value
}
if([System.IO.File]::Exists($serviceExecPathRagent) -ne $true) {
Write-Log "Файл агента не найден: $serviceExecPathRagent" "ERROR"
break
}
$platformVersion = [System.Diagnostics.FileVersionInfo]::GetVersionInfo($serviceExecPathRagent).FileVersion
Write-Log "Версия платформы: $platformVersion"
$clusterPath = $hash.d -replace '"', ''
$clusterRegPort = $hash.regport
$clusterPort = $hash.port
$clusterPortRange = $hash.range
$clusterRegPath = "$clusterPath\reg_$clusterRegPort"
$agentPort = $clusterPort
$agentAddress = "localhost"
$clusterAdminName = "" # Имя администратора кластера
$clusterAdminPassword = "" # Пароль администратора кластера
$fullAgentAddress = "tcp://" + $agentAddress + ":" + $agentPort
$COMConnector = $null
try {
if($platformVersion -like "8.2.*") {
$COMConnector = New-Object -COMObject "V82.COMConnector"
}
if($platformVersion -like "8.3.*") {
$COMConnector = New-Object -COMObject "V83.COMConnector"
}
if($null -ne $COMConnector) {
$serverAgent = $COMConnector.ConnectAgent($fullAgentAddress)
$clusterList = $ServerAgent.GetClusters()
foreach ($cluster in $clusterList) {
$serverAgent.Authenticate($Cluster, $clusterAdminName, $clusterAdminPassword)
$serverSessionsData = $serverAgent.GetSessions($cluster)
$serverSessions = $serverSessionsData.Count
Write-Log "Найдено $serverSessions сеансов"
$serverSessionsData | ForEach-Object {
$itemSession = $_
$serverAgent.TerminateSession($cluster, $itemSession)
$userName = $itemSession.userName
$sessionId = $itemSession.SessionID
$msg = "Завершен сеанс $sessionId. Пользователь: $userName"
Write-Host $msg -ForegroundColor Green
Write-Log $msg
}
}
}
$COMConnector = $null
}
catch {
Write-Host "Ошибка при выполнении скрипта." -ForegroundColor Red
Write-Host "Подробно:" -ForegroundColor Red
Write-Host $Error[0] -ForegroundColor Red
Write-Log "Ошибка при выполнении скрипта: $($Error[0])" "ERROR"
}
}
Write-Log "Скрипт завершён"
2. Скрипт предназначен для поиска установленных приложений 1С:Предприятие на компьютере с операционной системой Windows. Он обращается к системному реестру, чтобы получить информацию о всех установленных программах, и фильтрует только те, в названии которых содержится "1C:Предприятие" или "1C:Enterprise".
- Сначала скрипт определяет два пути в реестре, где хранятся сведения об установленных приложениях - для 64-битных и 32-битных программ. Затем он перебирает все записи по этим путям, извлекая свойства, такие как название, версия, издатель, дата установки и путь установки. Если дата установки указана в формате "yyyyMMdd", она преобразуется в объект даты.
- Результат сохраняется в виде списка объектов PowerShell, который затем сортируется по версии приложения в порядке убывания. В финальной части скрипт выводит таблицу с основными характеристиками найденных установок 1С.
Поиск установленных приложений 1С
function Get-1CInstalledApps {
$registryPaths = @(
'HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\*',
'HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*'
)
$apps = @()
foreach ($path in $registryPaths) {
Get-ItemProperty $path -ErrorAction SilentlyContinue |
Where-Object {
$_.DisplayName -and (
$_.DisplayName -like "*1C:Предприятие*" -or
$_.DisplayName -like "*1C:Enterprise*"
)
} |
ForEach-Object {
$installDate = $_.InstallDate
if ($installDate -match '^\d{8}$') {
$installDate = [datetime]::ParseExact($installDate, 'yyyyMMdd', $null)
}
$apps += [PSCustomObject]@{
DisplayName = $_.DisplayName
DisplayVersion = $_.DisplayVersion
Publisher = $_.Publisher
InstallDate = $installDate
InstallLocation = $_.InstallLocation
}
}
}
return $apps
}
# Получение и вывод
$installedApps = Get-1CInstalledApps | Sort-Object DisplayVersion -Descending
$installedApps | Format-Table DisplayName, DisplayVersion, Publisher, InstallDate, InstallLocation -AutoSize
Примерные результаты выполнения скрипта, отображающие найденные установки 1С:Предприятие:
DisplayName DisplayVersion Publisher InstallDate InstallLocation
------------ -------------- --------- ------------ ----------------
1C:Предприятие 8.3 (8.3.22.1709) 8.3.22.1709 1C Company 13.06.2024 C:\Program Files\1cv8\8.3.22.1709\
1C:Предприятие 8.3 (8.3.20.1863) 8.3.20.1863 1C Company 02.11.2023 C:\Program Files (x86)\1cv8\8.3.20.1863\
1C:Enterprise 8.3 (8.3.18.1208) 8.3.18.1208 1C Company 25.03.2023 C:\Program Files\1cv8\8.3.18.1208\
0
комментарии
____________________
Перепечатка текста и фотографий разрешена при наличии прямой ссылки на источник