none
1С 8.1. Выгонялка пользователей через COM-подключение на Powershell 2.0 RRS feed

  • Вопрос

  • Привожу текст функции, которая глючит в скрипте:

    function DropConnections($base)

    {

    $c1 = new-object -comobject "V81.COMConnector"

    $agent = $c1.ConnectAgent($server)

    $clusters = $agent.GetClusters()

    # переходим на первый кластер в списке

    $firstcluster = $clusters.GetValue(0)

    $agent.Authenticate($firstcluster,"","")

    $workingprocesses = $agent.GetWorkingProcesses($firstcluster)


    foreach ($process in $workingprocesses)
    {

    $wpconnstring = $process.HostName + ":" + $process.MainPort
    $wpconnection = $c1.ConnectWorkingProcess($wpconnstring)
    $wpconnection.AddAuthentication($admin_user, $admin_pasword)
    $ibdecsr = $wpconnection.CreateInfoBaseInfo()

    $ibdecsr.Name = $base
    $ibconnections = $wpconnection.GetInfoBaseConnections($ibdecsr)



    foreach ($userconnection in $ibconnections)

    {
    $disconnected_user = $userconnection.UserName
    if ($disconnected_user -ne $admin_user)
    {
    $disconnected_client_host = $userconnection.HostName
    $wpconnection.Disconnect($userconnection)

    $cur_datetime = Get-Date
    $message_string = "Отсоединили " + $disconnected_user + " с машины " + $disconnected_client_host + " в " + $cur_datetime

    Out-File -FilePath $log_full_name -Encoding "unicode" -inputobject $message_string -Append
    }

    else

    {
    $comuser_connection = $userconnection
    }
    }
    }

    $message_string = "И теперь мы отваливаемся...."
    Out-File -FilePath $log_full_name -Encoding "unicode" -inputobject $message_string -Append

    $wpconnection.Disconnect($comuser_connection)

    }
    # Конец функции DropConnections

    Изначально функция была разработана на станции администатора под Windows 7 x64 и работала как положено: т.е. административный пользователь 1С подключается внешним соединением и завершает пользовательские сеансы в цикле.
    Потом код был перенесен на тестовый сервер Windows Server 2008 SP2 x64 на Hyper-V хосте. И начались ошибки:

    Exception calling "GetInfoBaseConnections" with "1" argument(s): "Недостаточно прав пользователя на информационную базу march"
    At C:\backup_site\test.ps1:113 char:54
    + $ibconnections = $wpconnection.GetInfoBaseConnections <<<< ($ibdecsr)
       + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
       + FullyQualifiedErrorId : ComMethodTargetInvocation

    Скрипт выполнялся под обычным пользователем и под администратором, на упомянутом выше Windows Server 2008 SP2 x 64 с х64-битным сервером 1С Предприятие. И тот же результат на физическом Windows Server 2003 SP2 x32 с 32-битным сервером 1С Предприятие. Билды 1С Предприятие тоже разные: 8.1.14.72 и 8.1.13.41. Были попытки выполнять и под 32-битной оболочкой Powershell, и под 64-битной.

    Понятно, что на поверхности это выглядит как ошибка 1С-ной библиотеки COM-соединения, но тот же по назначению код, выполняемый через COM-соединение из клиента 1С Предприятия, отрабатывает на том же сервере без сучка и без задоринки, как говорится.

    Пока единственная зацепка - Powershell 2.0 RTM имеется только на Windows 7, а для старых версий Windows Server только RC-шки от Powershell 2.0. Кто-то в курсе, когда следует ждать соответствующих RTM-версий?
    25 сентября 2009 г. 20:20

Ответы

  • Разобрался.))

    В строке

    $wpconnection.AddAuthentication($admin_user, $admin_password)

    была опечатка:  $admin_paSword

    т.е. сначала объявление переменной было с опечаткой, а потом я исправил, но не везде. Приношу извинения за переполох.

    Было бы очень неплохо, если б Powershell ISE подсвечивала необъявленные переменные. Потому как отлавливать такие ошибки, особенно после строгого Конфигуратора 1С 8.1 (в 8.2 ещё не довели окончательно до ума) - весьма нетривиальная задача.

    • Помечено в качестве ответа AFrolov 28 сентября 2009 г. 19:08
    28 сентября 2009 г. 19:08

Все ответы

  • Возможно механизм подключения, который вы используете, предназначен только для удаленного подключения, но не для локального, а для локального надо как-то иначе делать подключение.

    Powershell 2.0 RTM выйдет до конца года, я предполагаю.
    Сазонов Илья http://www.itcommunity.ru/blogs/sie-wl/
    28 сентября 2009 г. 2:32
    Модератор
  • Возможно механизм подключения, который вы используете, предназначен только для удаленного подключения, но не для локального, а для локального надо как-то иначе делать подключение.


    Спасибо за ответ. Подключение делается через переменную $server, которая содержит в себе Netbios-имя кластера севреров 1С Предприятие 8.1. Соответственно, хост, который инициирует подключение, должен свободно пинговать сервер по этом имени.
    Кроме того, я пробовал запускать скрипт с одного хоста Windows server 2008 SP2 x64 для другого такого же хоста, где крутится совсем стандартная типовая конфигурация Управление Торговлей.  Ошибку выдаёт ту же самую.

    Показательно также то, что когда административный пользователь 1С заходит через пакетно запущенный Конфигуратор, без COM-соединений, и начинает выполнять административное дейстиве - загрузку бэкапа инфобазы - севрер 1С совсем не ругается. Вот корректно отрабатывающий код:


    $restore_parameters = "DESIGNER  /DisableStartupMessages " + "/S" + $server + "\" + $target_base + " /N " + $admin_user + " /P " + $admin_password + " " + " /RestoreIB" + $restore_file_setting

    # заливаем dt на базу-получатель
    start-process -filepath $one1CPath -ArgumentList $restore_parameters -RedirectStandardError $upload_error_log_file -Wait:$true
    # wait - значит будет ждать, пока Конфигуратор не завершится.

    28 сентября 2009 г. 7:15
  • Попробуйте еще запустить скрипт из PowerShell (x32)
    Сазонов Илья http://www.itcommunity.ru/blogs/sie-wl/
    28 сентября 2009 г. 8:30
    Модератор
  • Пробовал. Не помогает.
    Впрочем, есть основания считать, что проблема находится в сфере пересечения х32 и х64в библиотеках 1С. Дело в том, что после удаления/установки разных версий 1С 8.1 - билды и разные по битности дистрибутивы - скрипт перестал отрабатывать и на машине администратора с Windows 7 x64. )) Так что придётся переписывать на vbs или пытаться всё устроить на Powershell 1.0.
    28 сентября 2009 г. 10:58
  • Насколько работа через COM поддреживается вендором  (1С)  в таком случае?

    Думаете VBS будет работать? Чем он отличается от PowerShell в смысле использования COM?
    Сазонов Илья http://www.itcommunity.ru/blogs/sie-wl/
    28 сентября 2009 г. 11:12
    Модератор
  • Насколько работа через COM поддреживается вендором  (1С)  в таком случае?

    Думаете VBS будет работать? Чем он отличается от PowerShell в смысле использования COM?
    Сазонов Илья http://www.itcommunity.ru/blogs/sie-wl/
    28 сентября 2009 г. 11:13
    Модератор
  • Насколько работа через COM поддреживается вендором  (1С)  в таком случае?

    Думаете VBS будет работать? Чем он отличается от PowerShell в смысле использования COM?

    Теоретически, работа с COM никак не должна отличаться. Но, похоже, имеет значение среда, из которой вызывается такое соединение.
    Из 32-битного клиента 1С Предприятие (64-х битного не существует) оно работает безупречно и, насколько я заметил, не требует установки дополнительных компонент (пункт COM-соединение). Когда соединение инициируется внешней средой по отношению к клиенту 1С Предприятие - из Powershell, к примеру, уже требуется установка компоненты COM-соединение. Для x64-систем - однозначно, так как не находит требуемый класс.

    Т.е. моя стратегия как разработчика - перебирать все варианты, пока не найдётся рабочий на всех аппаратно-программных подложках.
    28 сентября 2009 г. 14:55
  • Разобрался.))

    В строке

    $wpconnection.AddAuthentication($admin_user, $admin_password)

    была опечатка:  $admin_paSword

    т.е. сначала объявление переменной было с опечаткой, а потом я исправил, но не везде. Приношу извинения за переполох.

    Было бы очень неплохо, если б Powershell ISE подсвечивала необъявленные переменные. Потому как отлавливать такие ошибки, особенно после строгого Конфигуратора 1С 8.1 (в 8.2 ещё не довели окончательно до ума) - весьма нетривиальная задача.

    • Помечено в качестве ответа AFrolov 28 сентября 2009 г. 19:08
    28 сентября 2009 г. 19:08