Скрипт powershell отключения неактивных сессий в 1С 8.3

25.01.2022

Скрипт powershell отключения неактивных сессий в 1С 8.3

Данный скрипт на powershell осуществляет отключение всех сессий,  время начала которых, составляет более 10 часов назад. При этом осуществляется дополнительная фильтрация и сессии административной консоли и фоновых заданий не отключаются.  Удобно запускать ночью и отключать всех кто не завершает 1С, а утром мы рискуем получить нехватку лицензий из за таких «зомби» чьи 1С просто включены, но по факту не используются.

Пример скрипта на PowerShell:
$servers1C =("localhost:1540","localhost:2640")
#$bases = ("DO","USO","BUH")
$timeDelay = -10
$logFile = "C:\zabbix\scripts\log.txt"
#общее число пользователей
$intUsersCount=0 
echo (Get-Date).ToString() > $logFile
# Создается COM-объект подключения к 1С.
$connector = New-Object -Comobject "V83.COMConnector"
# Подключение к агенту на сервере.
foreach ($server1C in $servers1C)
{

$AgentConnection = $connector.ConnectAgent($server1C)
# Выбор кластера. Сейчас используется только один кластер, поэтому просто получаем единственный элемент.
$Cluster = $AgentConnection.GetClusters()[0]
# Авторизация.
$AgentConnection.Authenticate($Cluster,"","")



#Всего активных сеансов пользователй пользователей во всех базах
#$sessions1C = ($AgentConnection.GetSessions($Cluster) | Where-Object {$_.AppId -ne "SrvrConsole" -and $_.AppId -ne "BackgroundJob" })
#foreach ($session1С in $sessions1C)
#{
# $allsessio= "Session ‘" + $session1С.userName.ToString()+" - "+$session1С.infoBase.Name.ToString()
# echo $allsessio
# $intUsersCount=$intUsersCount+1 
#}


# Для заданного списка баз в цикле получаем списки сессий и обрабатываем их.
$bases=$AgentConnection.GetInfoBases($Cluster)
foreach ($baseALL in $bases)
{
$base = $baseALL.Name
$sessions1CtoTerminate = ($AgentConnection.GetSessions($Cluster) | Where-Object {$_.Infobase.Name -eq $base -and $_.AppId -ne "SrvrConsole" -and $_.AppId -ne "BackgroundJob" -and $_.StartedAt -lt ((Get-Date).AddHours($timeDelay))})
foreach ($session in $sessions1CtoTerminate)
{

$sessionToKillMsg = "Session ‘" + $session.infoBase.Name.ToString() + " — " + $session.userName.ToString() + " — " + $session.Host.ToString() + " — " + $session.AppID.ToString() + " — " + $session.StartedAt.ToString() + " — " + $session.LastActiveAt.ToString() + "‘ has been terminated at " + (Get-Date).ToString()
echo $sessionToKillMsg >> $logFile
## Отключаем сеансы которые "время начала" больше $timeDelay часов   (10 часов)
$AgentConnection.TerminateSession($Cluster,$session)
}
}


}
#Всего активных сеансов пользователй пользователей
#echo $intUsersCount

Сам скрипт протестирован на 1C 8.3 на Windows Server 2019
1. скрипт размещаем тут: C:\zabbix\scripts\
2. Выполнить скрипт можно запустив powershell и в нем зайдите папку скриптом и .\имяскрипта.ps1
3. $AgentConnection.TerminateSession($Cluster,$session) - эта строчка кода отвечает за отключение  (закоментируйте ее если хотите потестировать)
4. $logFile = "C:\zabbix\scripts\log.txt" сюда попадут те кого отключат.
5. если заменить $_.StartedAt -lt ((Get-Date).AddHours($timeDelay)) на $_.LastActiveAt -lt ((Get-Date).AddHours($timeDelay))} то отключаться те кто неактивен более 10 часов.
6. -and $_.AppId -ne «SrvrConsole» -and $_.AppId -ne «BackgroundJob» этот кусок кода отвечает за не отключение фоновых задач и консольных сессий

Как выполнять через планировщик задач: 
создаем .bat примерно вот с таким содержание: 
powershell.exe -File "C:\zabbix\scripts\killconnect1c.ps1" >> C:\zabbix\scripts\logbat.txt
И в планировщике задач выполняем именно .bat

Особенность V83.COMConnector и планировщика:
1. заходим сюда: Панель управления\Все элементы панели управления\Администрирование
2. запускаем Службы компонентов
3. Службы компонентов ->Компьютеры -> Мой Компьютер -> Приложение COM+ -> V8_ComConnector -> РОЛИ -> пользователи 
ВАЖНО: пользователь от которого вы запускаете данный powershell (в планировщике или из консоли) должен быть в разрешенных

Ну и еще одна тонкость — необходимо следить за разрядностью приложений. Так, например, если запустить PowerShell x64 и попытаться обратиться к x86 COM-объекту, то произойдет ошибка. В этом случае, можно запустить x86 PowerShell для корректной работы (он находится по следующему пути — %SystemRoot%\syswow64\WindowsPowerShell\v1.0\powershell.exe).






< Назад к списку новостей