Загадочное поведение окна запуска баз 1С 7.7 настроенного через GPP Registry Wizard

imageКак известно, программа запуска баз версии 7.7 (1cv7.exe) информацию о перечне зарегистрированных БД хранит в пользовательском ключе реестра HKEY_CURRENT_USER\Software\1C\1Cv7\7.7\Titles. При использовании 1С v7.7 в многопользовательской среде на серверах RDS в своё время у нас возник вопрос единообразной централизованной настройки указанного ключа реестра для всех пользователей, который мы успешно решили с помощью использования метода описанного в заметке Windows Server 2008 R2 – Добавление скриптов входа на сервере RDS через ключ реестра AppSetup. То есть фактически на серверы RDS был добавлен дополнительный winlogon-скрипт, выполняющий ряд необходимых настроек пользовательского окружения, в том числе и заполнение списка зарегистрированных БД 1С в указанном ключе реестра.

В нашем файле USRLOGON_2.CMD была добавлена строчка импорта reg-файла

@echo off
reg import USRLOGON_2_Set1CBasesPaths.reg

Содержимое файла USRLOGON_2_Set1CBasesPaths.reg имело примерно следующий вид:

Windows Registry Editor Version 5.00

[-HKEY_CURRENT_USER\Software\1C\1Cv7\7.7\Titles]

[HKEY_CURRENT_USER\Software\1C\1Cv7\7.7\Titles]
"\\\\holding.com\\ApppData\\1Cv77\\ACC_DB1\\"="Бухгалтерия. База 1"
"\\\\holding.com\\ApppData\\1Cv77\\ACC_DB2\\"="Бухгалтерия. База 2"
"\\\\holding.com\\ApppData\\1Cv77\\ACC_DB3\\"="Бухгалтерия. База 3"


То есть фактически при каждом входе пользователя в систему мы сначала полностью очищали
соответствующий ключ реестра, а затем заполняли общими для всех значениями. Это было полезно на тот случай, если пользователь нечаянно что-то наколбасит руками в списке баз, то этот список будет восстановлен при следующем его входе в систему

Одним недостатком использования метода с дополнительным winlogon-скриптом было то обстоятельство, что подобную настройку приходилось делать вручную на нескольких серверах RDS, и чтобы сделать процесс этой настройки более централизованным было решено попробовать вместо скрипта использовать Group Policy preferences (GPP). С помощью мастера GPP Registry Wizard в групповую политику настраивающую пользовательское окружение на серверах RDS был импортирован ключ реестра HKEY_CURRENT_USER\Software\1C\1Cv7\7.7\Titles с уже настроенного сервера. Использование winlogon-скрипта было отключено и применение групповой политики показало что всё вроде бы хорошо. Однако через некоторое время пользователи стали жаловаться на то, что в окне запуска 1С исчезает список баз..

image

Причём жалобы поступали от пользователей которые на следующий день к удивлению не подтвердить наличие проблемы…Загадка становилась всё интересней. После ряда экспериментов удалось понять последовательность происходящего:
1) Пользователь подключается к серверу, при входе применяются его групповые политики, которые настраивают реестр и список баз наполняется тем что нужно.
2) Пользователь по ярлычку на рабочем столе вызывает окно запуска баз (1cv7.exe), видит там все базы, выбирает нужную и запускает её. При этом, как известно, окно выбора баз закрывается.
3) Сразу после этого пользователь повторно вызывает окно запуска баз и видит, что список баз уже пуст…
То есть получается, что сам исполняемый модуль 1С по какой-то причине сносит содержимое ключа реестра, в котором хранится список баз. В поисках аналогов происходящей аномалии пришлось прошвырнуться по “одноэсовским” ресурсам. После прочтения ветки обсуждения v7: Пропадает список баз из меню запуска у меня появилось подозрение, что в нашем ключе реестра заполняемым GPP что-то может провоцировать программу запуска 1С сносить все записи в этом ключе… Странно, но ведь ранее, с применением winlogon-скрипта этой проблемы не было. Было решено выгрузить содержимое ветки реестра после применения двух разных методов - winlogon-скрипта и GPP. Сравнение результатов показало интересный факт. В reg-файле полученном в результате применения GPP в списке баз присутствовала лишняя запись..

@=""

Эта запись соответствовала параметру Default, который в случае применения GPP в реестре пользователя выглядел вот так…

image

…а в случае применения используемого нами ранее winlogon-скрипта этот же параметр выглядел иначе…

image

То есть получается, что в GPP при импорте ключа реестра мастер Registry Wizard нам добавил параметр, который по сути и приводил к вышеописанному поведению 1С. Получается, что информация сказанная в выше указанной ветке форума…

Список информационных баз, которые отображаются в стартере 1С:Предприятия, хранится в реестре в этой ветке:
HKEY_CURRENT_USER\Software\1C\1Cv7\7.7\Titles
ЕСЛИ В ЭТУ ВЕТКУ ДОБАВИТЬ ПАРАМЕТР С ПУСТЫМ ЗНАЧЕНИЕМ (т.е. базу, которая имеет путь, но не имеет названия), СТАРТЕР 1С при закрытии УНИЧТОЖИТ ВСЮ ВЕТКУ ЦЕЛИКОМ. Проверено на релизе 7.70.025. ОСТОРОЖНЕЕ СО СКРИПТАМИ, ПРОПИСЫВАЮЩИМИ БАЗЫ В СПИСОК!

…справедлива и для используемой у нас версии 7.70.027

После отключения “мешающего” параметра в GPP всё встало на свои места…

imageДаже боюсь представить что курили чем руководствовались разработчики 1С, когда придумали такую поведенческую модель относительно списка баз…

И ещё, пока колупался с сравнением содержимого ключа реестра в зависимости от применения метода его обновления заметил ещё одну интересную особенность. Если ключ реестра создается через winlogon-скрипт, что в качестве владельца ветки назначается учетная запись пользователя, в контексте которого выполняется вход в систему, а в случае с созданием ключа реестра через GPP владельцем назначается встроенная группа Администраторов. В контексте нашей ситуации это конечно незначительная мелочь, но нельзя исключать что это может стать решающим фактором при работе с каким-нибудь очередным “чудо-бизнес-приложением” Улыбка

Всего комментариев: 13 Комментировать

  1. equinox /

    "Если ключ реестра создается через winlogon-скрипт, что в качестве владельца ветки назначается учетная запись пользователя, в контексте которого выполняется вход в систему, а в случае с созданием ключа реестра через GPP владельцем назначается встроенная группа Администраторов."
    При создании ключа реестра через GPP должна быть выставлена галка "Выполнять в контексте вошедшего пользователя", тогда владельцем будет пользователь, а не группа Администраторов.

    1. Алексей Максимов / Автор записи

      А вот фигушки. Тесты показали что это не так.

      1. equinox /

        :) Странно, мои тесты показали обратное. Создавал произвольный куст в HKCU\Software, в случае "без галки" владельцами были локальные админы, в случае "с галкой" владельцем стал пользователь. В общем, любопытный случай.

        1. Алексей Максимов / Автор записи

          В моём случае контроллер домена с которого применяются GPO - Windows Server 2012 R2. Сервер RDS с наблюдаемой ситуацией - Windows Server 2012. Самое интересное то, что в качестве владельца при проверке группа локальных админов устанавливалась на ключ реестра даже не смотря на то, что ключ верхнего уровня имел в качестве владельца учетку юзера и при этом визуально всё выглядело так, как будь-то права наследуются именно с ключа верхнего уровня. В любом случае вывод напрашивается один - такие неочевидные на первый взгляд вещи нельзя упускать из виду и где-то там..."под коркой"...всегда про них помнить :)

  2. kai /

    Интересная статья давно пользуюсь GPP и такой механизм был сразу без скриптов!

  3. mcpclubminsk /

    спасибо - интересно.
    Именно из за таких приколов разработчиков мой знакомый админ всеГп в домене построил на скриптах- и у него все работает и все прозрачно. :)

  4. Alexey /

    А подскажите как у вас получилось подружить 1сv7 и windows server 2012 r2, как известно без шаманств не заводится, у меня вываливается с ошибкой при старте 1с7 торговля.

    1. Алексей Максимов / Автор записи

      Никаких шаманств не нужно. Устанавливаете 1С 7.7 на той системе, где работа инсталлятора этого ПО поддерживается, например на Windows XP, а затем копируете каталог исполняемых файлов (1Cv77BIN) на сервер c Windows Server 2012 R2 (желательно в каталог с таким же именем) и запускаете как обычно через исполняемый файл 1cv7.exe.

      1. Alexey /

        Добрый день, у вас база файловая или SQL ?

        1. Алексей Максимов / Автор записи

          Файловая

  5. Alexey /

    А ну тогда понятно :-) спасибо, с SQL такой фокус не пройдет :-) будет ругаться.

    1. Алексей Максимов / Автор записи

      Для версии SQL вроде как тоже есть обходное решение в виде хака bkend.dll http://www.maxblogs.ru/articles/zastavlyaem-rabotat-1s-versii-77-na-windows-server-2008-r2-64bit

  6. Alexey /

    Да да это сделано и срабатывает на Server 2008, а вот как раз на Server 2012 и SQL 20012 вылетает с ошибкой.

Добавить комментарий