Сегодня мы побеседуем о блокировке сеансов пользователей 1С, их отключению от базы 1С и, также об автоматизации этих процессов. Т.е., как уже ясно, о повседневной работе персонала, обслуживающего 1С Предприятие.
Для понимания необходимости автоматической блокировки входа пользователей в 1С достаточно представить следующую ситуацию. Допустим программист 1С выполнил поставленную задачу по программированию или разработке в тестовой базе и далее необходимо актуализировать рабочую базу данных. Т.е. проще говоря — обновить конфигурацию. На собственно процессе обновления мы останавливаться не будем, т.к. все действия уже рассматривались неоднократно и нужную информацию можно посмотреть по ссылке: http://www.advanter.net/?s=обновить+конфигурацию .
Остановимся на самом начале. А именно на том месте, когда 1С, при попытке сохранить обновленную конфигурацию, скажет: — «Ошибка исключительной блокировки информационной базы». Происходит такое от того, что в информационной базе в момент сохранения работают другие пользователи. Для дальнейшего обновления необходимо выгрузить пользователей и продолжить сохранение.
Также одним из вариантов применения автоматической блокировки сеансов по расписанию на сервере 1С будет настройка резервного копирования баз 1С.
Вообще, в жизни найдется много ситуаций, когда может потребоваться предложенная для обсуждения функциональность.
Средство разработки Powershell (PS)
Сначала нам нужно определиться со средством для написания нашей управляющей подпрограммы (скрипта). Ранее серверы и рабочие станции на ОС Windows для написания командных сценариев и подпрограмм использовали командную строку (cmd). Современные серверные ОС под управлением Windows используют более совершенный аналог cmd — расширяемое средство автоматизации Windows PowerShell.
Наш рассматриваемый опыт будет выполняться на сервере с ОС Windows 2012 R2 и кластере серверов на базе 1С Предприятие 8.3. В связи с этим и разработку командного сценария мы будем делать на Windows PowerShell.
Обращаем Ваше внимание на то, что во имя избежания всяческих казусов с правами, все работы следует производить от имени пользователя с полными правами.
Регистрация СОМ объекта
Также для разработки нам потребуется зарегистрированный СОМ-объект V83.COMConnector. Если такой класс не зарегистрирован, то после входа в PowerShell с администраторскими привилегиями нужно выполнить несложную команду: regsvr32 «C:\Program Files (x86)\1cv8\8.3.х.xxxx\bin\comcntr.dll», где вместо «х» нужно указать версию используемой Вами платформы.
Автоматизация блокировки начала сеансов в 1С.
Настроить данную автоматизацию нам поможет зарегистрированное COM-соединение, а собственно менеджер COM-соединений 1С. При администрировании кластера серверов в части работы с информационной базой этот менеджер обладает рядом достаточно эффективных функций. Это, например, такие широко применяемые конструкции:
- PermissionCode
- DeniedMessage
- DeniedFrom
- DeniedTo
и т.д.
Итак, откроем обычный текстовый редактор (Блокнот) и напишем скрипт следующего содержания:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 |
function BlockCluster([string]$IBConnectionString, [string]$IBName ,[string]$User, [string]$Pass = "", [string]$ClusterUser = "", [string]$ClusterPass = "") { $ServerAgent.Authenticate($Cluster, $ClusterUser, $ClusterPass) $InfoBasesInCluster= $ServerAgent.GetInfoBases($Cluster) if (!($InfoBasesInCluster.Count -eq 0)) { write-host "Founded " $InfoBasesInCluster.Count " bases in cluster" foreach ($InfoBaseInCluster in $InfoBasesInCluster) { if ($InfoBaseInCluster.Name -eq $IBName) { $Sessions = $ServerAgent.GetInfoBaseSessions($Cluster, $InfoBaseInCluster) if (!($Sessions.Count -eq 0)) { write-host "To disconnect " $Sessions.Count " sessions of base" $InfoBaseInCluster.Name foreach ($Session in $Sessions) { write-host "Disconnected " $Session.UserName "" $ServerAgent.TerminateSession($Cluster, $Session) } } } } } write-host "Started blocking sessions to base $IBName"; ChangeConnectDenied $IBName $True $User $Pass } function ChangeConnectDenied([string]$InfoBaseName, [bool]$ConnectDenied, [string]$User = "", [string]$Pass = "") { $WorkingProcesses = $ServerAgent.GetWorkingProcesses($Cluster) foreach ($WorkingProcess in $WorkingProcesses) { if (!($WorkingProcess.Running -eq 1)) { continue } $CWPAddr = "tcp://"+$WorkingProcess.HostName+":"+$WorkingProcess.MainPort $CWP = $V83Com.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 "Base from parameters not found..." break } $InfoBase.PermissionCode = "КодДоступаПриВключеннойБлокировке"; $InfoBase.DeniedMessage = "СообщениеПользователю"; $InfoBase.ConnectDenied = $ConnectDenied $InfoBase.SessionsDenied = $ConnectDenied $InfoBase.ScheduledJobsDenied = $ConnectDenied $InfoBase.DeniedFrom = Get-Date -Format "yyyy-MM-dd HH:mm:ss"; $InfoBase.DeniedTo = (Get-Date).AddHours(2).ToString("yyyy-MM-dd HH:mm:ss") #$InfoBase.DeniedTo = (Get-Date).AddMinutes(3).ToString("yyyy-MM-dd HH:mm:ss") $CWP.UpdateInfoBase($InfoBase) } } #/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// $SrvAddr = "tcp://localhost:1540" $MainPort = "1541" $V83Com = New-Object -COMObject "V83.COMConnector" write-host "Connected to V83.COMConnector"; $ServerAgent = $V83Com.ConnectAgent($SrvAddr) $ClusterFound = $FALSE $InfoBaseFound = $FALSE $Clusters = $ServerAgent.GetClusters() foreach ($Cluster in $Clusters) { if ($Cluster.MainPort -eq $MainPort) { $ClusterFound = $TRUE break } } if (!($ClusterFound)) { write-host "No one cluster is found..." break } BlockCluster "localhost\" "ИмяБазы" "ИмяПользователяСПолнымиПривилегиями" "ПарольПользователя" ; $V83Com = ""; |
Это же можно сделать и в специальной интегрированной среде сценариев Windows PowerShell ISE
Данный командный сценарий выполняет следующие действия:
- подключается к серверу
- инициирует СОМConnector
- определяет существующие кластеры
- разрывает существующие сессии выбранной базы
- запрещает в течении 2 часов подключение к выбранной базе.
В параметре
1 |
$InfoBase.DeniedTo = (Get-Date).AddHours(2).ToString("yyyy-MM-dd HH:mm:ss") |
AddHours можно менять на AddMinutes или AddSeconds, или AddDays соответственно. Но, думается, это уже слишком. Цифра 2 обозначает количество единиц времени, в течение которых будет невозможен доступ.
Параметр
1 |
$InfoBase.DeniedMessage = "`nВключена автоматическая блокировка начала сеансов.`nПроводятся регламентные работы."; |
содержит текст сообщения, в котором говорится то, что решил сказать пользователю администратор.
Сохранение созданного скрипта
Создадим папку для расположения нашего командного сценария. Пусть это будет папка «_cmd» на диске C/. В зависимости от выбранного редактора сохраним из блокнота или Windows PowerShell ISE текст подпрограммы в созданный каталог. Зададим имя, например «block». Если сохранение происходит из блокнота, то укажем расширение файла — «ps1». Такое расширение присваивается в системах Windows PowerShell скриптам.
Теперь мы имеем работающий сценарий для автоматического завершения сессий пользователей 1С и блокирования новых сеансов на сервере 1С на 2 часа.
Устанавливаем расписание.
Планировщик Windows
Установку расписания в системах с ОС Windows достаточно просто делать при помощи планировщика задач. Открыть его можно выполнив команду taskschd.msc все в том же PS.
Задание на автоматический запуск скрипта
В открывшемся интерфейсе планировщика создадим новое задание. Для этого в правом окне «Действия» выберем «Создать задачу…»
Далее заполним параметры на закладках
Общие
Заполним имя задания, желательно заполним описание. Обязательно укажем радиокнопкой опцию «Выполнять для всех пользователей» и поставим галочку «Выполнять с наивысшими правами»
Триггеры
На закладке Триггеры настроим временные параметры нашего задания. Например, укажем запуск в 7:00, каждый день
Укажем вверху — «По расписанию», далее «Ежедневно», укажем дату начала работы задания, период повторения — 1 день. проверим внизу галочку «Включено».
Действия
За закладке Действия создаем запись с указанием нужных к выполнению действий для задания.
В нашем случае для работы скрипта PowerShell указываем запуск оболочки powershell.exe и параметров запуска., в которых и располагается ссылка на наш исполняемый скрипт.
Программа или сценарий: powershell.exe
Добавить аргументы: -File «C:\_cmd\block.ps1»
Также в аргументах можно указать дополнительные опции:
-Command — выполняет команды и другие параметры. Параметр можно использовать для запуска скрипта, например: -Command ″& {C:\_cmd\block.ps1}″. C его помощью можно передавать в скрипт параметры: -Command ″& {C:\_cmd\block.ps1 -a 1 -b 3}″;
-ExecutionPolicy — задает политику выполнения скриптов для текущего сеанса, может принимать значения Unrestricted, RemoteSigned, AllSigned и Restricted. Заданная политика имеет приоритет над любыми ранее созданными политиками, действует только в текущем сеансе;
-NonInteractive — отключает диалог с пользователем в интерактивном режиме;
-WindowStyle Hidden — запуск окна PowerShell в скрытом режиме;
-NoProfile — предотвращает загрузку профиля;
-NoExit — не закрывается оболочка после окончания работы скрипта.
Закладки Параметры и Условия оставляем без изменений. Нажимаем кнопку «ОК» для завершения создания задания.
На этом минимальные требования к заданию удовлетворены и с завтрашнего дня, с 7:00 наш скрипт на 2 часа будет блокировать пользователей выбранной базы.
Если у Вас появились вопросы по статье или остались нерешенные проблемы обсудить их Вы можете на Форуме 1С Вопросы и ответы
Добавить комментарий
Для отправки комментария вам необходимо авторизоваться.