Часто возникает задача автоматического отключения неактивных пользовательских сеансов в 1С.
Для того, чтобы выполнять эту процедуру по расписанию можно воспользоваться средствами, предоставляемыми COM-интерфейсом 1С. Такой подход позволяет использовать штатные механизмы 1С в сочетании с родными для ОС средствами автоматизации.
Пример скрипта на PowerShell, выполняющего отключение сеансов по расписанию:
# Переменные.
$server1C = «<Имя сервера>»
$bases = («<База1>»,»<База2>»)
$timeDelay = -10
$logFile = «<Путь к файлу лога>»
# Создается COM-объект подключения к 1С.
$connector = New-Object -Comobject «V83.COMConnector»
# Подключение к агенту на сервере.
$AgentConnection = $connector.ConnectAgent($server1C)
# Выбор кластера. Сейчас используется только один кластер, поэтому просто получаем единственный элемент.
$Cluster = $AgentConnection.GetClusters()[0]
# Авторизация.
$AgentConnection.Authenticate($Cluster,»»,»»)
# Для заданного списка баз в цикле получаем списки сессий и обрабатываем их.
foreach ($base in $bases)
{
$sessions1CtoTerminate = ($AgentConnection.GetSessions($Cluster) | Where-Object {$_.Infobase.Name -eq $base -and $_.AppId -ne «SrvrConsole» -and $_.AppId -ne «BackgroundJob» -and $_.LastActiveAt -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
$AgentConnection.TerminateSession($Cluster,$session)
}
}
Данный скрипт осуществляет отключение всех сессий, период неактивности для которых, составляет более 10 часов. При этом осуществляется дополнительная фильтрация и сессии административной консоли и фоновых заданий не отключаются. За это отвечают условия:
-and $_.AppId -ne «SrvrConsole» -and $_.AppId -ne «BackgroundJob»
Фильтрация по времени осуществляется с помощью условия:
-and $_.LastActiveAt -lt ((Get-Date).AddHours($timeDelay))
Get-Date возвращает текущее время, а его метод AddHours позволяет получить значение времени на 10 часов назад, просто добавив отрицательное смещение (-10 часов).
Если нет необходимости отключать сессии только в конкретных базах, то его можно еще больше упростить и заменить последний цикл по списку баз на перебор вообще всех сессий.
COM- интерфейс для 1С нельзя назвать очень богатым, однако практически все необходимые действия он позволяет выполнять. При работе из PowerShell можно использовать командлет Get-Member для просмотра свойств и методов COM-объектов. Единственный момент — некоторые свойства будут самостоятельными объектами, как, например свойство «Infobase» у сессии. Это самостоятельный объект, поэтому не стоит забывать, что для того, чтобы посмотреть, например, имя информационной базы из сессии не достаточно просто обратиться к свойству «Infobase», а необходимо обращаться к уже вложенному свойству «Infobase.Name»
Ну и еще одна тонкость — необходимо следить за разрядностью приложений. Так, например, если запустить PowerShell x64 и попытаться обратиться к x86 COM-объекту, то произойдет ошибка. В этом случае, можно запустить x86 PowerShell для корректной работы (он находится по следующему пути — %SystemRoot%\syswow64\WindowsPowerShell\v1.0\powershell.exe).