Исходные данные:
- терминальный сервер (у меня на WS2008R2)
- пользователи заходят на терминал под основной рабочей учеткой домена
- пользователям необходим список баз в различных комбинациях
Задача:
- формировать список баз на основе групп пользователей. Для каждой базы создается отдельная группа пользователей. Для добавления или удаления базы для конкретного пользователя достаточно добавить пользователя в группу или удалить из группы, при следующем входе пользователя на терминальный сервер список баз должен обновится.
Прочие решения:
1. http://habrahabr.ru/post/179405/ - минус решения в сложности формирования комбинаций баз, для каждой комбинации приходится заводить отдельный каталог с настройками.
2. //infostart.ru/public/147404/ - привязка к Active Directory. В моем случае нет такой необходимости, т.к. для нужд 1С используется один терминальный сервер. Более актуально для нескольких серверов (исходный код по запросу).
Решение:
Подготавливаем на сервере необходимую структуру рабочих файлов и исходных данных:
1. Необходима утилита Ifmember.exe из состава пакета Windows Server 2003 Resource Kit Tools, которая проверяет наличие пользователя в группе. Скачиваем, устанавливаем.
2. Создаем основной рабочий каталог, в моём случае D:\ListOfBases.
3. Внутри основного рабочего каталога создаем:
1) каталог Default, содержит дефолтные файлы. Содержимое каталога:
- файл 1CEStart.cfg (в кодировке 1251 ANSI), содержит путь к каталогу шаблонов и признак необходимости поиска локального ключа защиты:
ConfigurationTemplatesLocation=D:\CONFIG_1C8\tmplts82
UseHWLicenses=1
- пустой файл ibases.v8i (скопирован, очищен)
2) файлы вида DB_[ИмяБазы].v8i. Каждый файл содержит описание для одной базы.
3) командный файл makecfg.cmd (листинг ниже). Меняем путь для переменной mainpath на свой. Меняем имена групп пользователей и наименования баз на свои в разделе «список баз».
4) (необязательно) в моем случае также одна из баз используется не только на терминале, но и локально. Описание базы находится в расшаренном каталоге D:\ListOfBases\CommonBases. При необходимости – создаем.
4. Создаем необходимые группы пользователей (ServerManager – Configuration – LocalUsersandGroups – Groups), у меня вида User1C8_[ИмяБазы]. Добавлям пользователей в группы.
5. Устанавливаем скрипт в качестве logon-скрипта (gpedit.msc – LocalGroupPolicyEditor – LocalComputerPolicy – UserConfiguration – WindowsSettings – Scripts(Logon\Logoff) – Logon– указываем файл makecfg.cmd).
Листинг файла makecfg.cmd:
::@echo off
::для добавления новой базы - новую базу добавляем в ===списке баз===
::структура основного рабочего каталога:
::каталог Default - файл 1CEStart.cfg, содержимое файла:
:: ConfigurationTemplatesLocation=D:\CONFIG_1C8\tmplts82
:: UseHWLicenses=1
:: - файл ibases.v8i (скопирован, очищен)
::файлы DB_[ИмяБазы].v8i, каждый файл содержит описание одной базы
::файл makecfg.cmd - данный командный файл
::===============установка переменных==========================
::основной рабочий каталог
set mainpath=D:\ListOfBases
::каталог дефолтных файлов
set configfolder=%mainpath%\Default
::каталог конфигурационных файлов пользователя
set userfolder=C:\Users\%username%\AppData\Roaming\1C\1CEStart
::путь к ifmember.exe
set ifmember="C:\Program Files (x86)\Resource Kit\IFMEMBER.EXE"
::=============================================================
::=================проверка и создание необходимой структуры===============
::если каталог пользователя не существует - создаем
if not exist %userfolder% mkdir %userfolder%
::данная строка необходима для замены файла 1CEStart.cfg на файл с кодировкой 1251,
::иначе - допишет иероглифы. Временно.
del %userfolder%\1CEStart.cfg
::если файла конфигурации нет - копируем дефолтный
if not exist %userfolder%\1CEStart.cfg copy /y %configfolder%\1CEStart.cfg %userfolder%
::если файла со списком баз нет - копируем дефолтный (пустой)
if not exist %userfolder%\ibases.v8i copy /y %configfolder%\ibases.v8i %userfolder%
::====================================================================
::===================список баз=========================================
%ifmember% User1C8_Base1
if %errorlevel% EQU 1 (call :sub1 Base1) else (call :sub2 Base1)
%ifmember% User1C8_Base2
if %errorlevel% EQU 1 (call :sub1 Base2) else (call :sub2 Base2)
%ifmember% User1C8_Base3
if %errorlevel% EQU 1 (call :sub1 Base3) else (call :sub2 Base3)
::%ifmember% [ИмяНовойГруппы]
::if %errorlevel% EQU 1 (call :sub1 [ИмяНовойБазы]) else (call :sub2 [ИмяНовойБазы])
::==================отдельный каталог (расшаренный)========================
%ifmember% User1C8_Base4
::второй параметр - слеш + имя расшаренного каталога
if %errorlevel% EQU 1 (call :sub1 Base4 \CommonBases) else (call :sub2 Base4 \CommonBases)
::=====================================================================
exit
::===================================пользователь в группе===========================================
:sub1
findstr.exe /b /v /c:"CommonInfoBases=%mainpath%%~2\DB_%~1.v8i" %userfolder%\1CEStart.cfg > %userfolder%\1CEStart.tmp
fc /b %userfolder%\1CEStart.cfg %userfolder%\1CEStart.tmp
::%errorlevel%=0 - файлы одинаковы, строка не найдена, добавляем; иначе - ничего не делаем (удаляем tmp)
if %errorlevel% EQU 0 (echo CommonInfoBases=%mainpath%%~2\DB_%~1.v8i>> %userfolder%\1CEStart.cfg)
del %userfolder%\1CEStart.tmp
exit /b
::================================================================================================
::===================================пользователь не в группе==========================================
:sub2
findstr.exe /b /v /c:"CommonInfoBases=%mainpath%%~2\DB_%~1.v8i" %userfolder%\1CEStart.cfg > %userfolder%\1CEStart.tmp
fc /b %userfolder%\1CEStart.cfg %userfolder%\1CEStart.tmp
::%errorlevel%=1 - файлы разнятся, строка найдена, заменяем; иначе - ничего не делаем (удаляем tmp)
if %errorlevel% EQU 1 (
del %userfolder%\1CEStart.cfg
ren %userfolder%\1CEStart.tmp 1CEStart.cfg
) else del %userfolder%\1CEStart.tmp
exit /b
::================================================================================================
Комментарии:
1. Изначально файл 1CEStart.cfg в кодировке 1200 UTF-16, у меня используется 1251 ANSI (в т.ч. для батника).
2. Работу батника необходимо проверить. В случае несовпадений кодировок при добавлении базы в файл 1CEStart.cfg запишутся иероглифы. Код в данном виде переписывает файл 1CEStart.cfg принудительно при каждом входе пользователя на терминал в строке del %userfolder%\1CEStart.cfg. Данная строка требуется для замены имеющегося файла в дефолтной кодировке на файл в кодировке ANSI. После замены файлов у всех пользователей строку нужно закомментировать. В случае различия кодировок команда fc будет неправильно отрабатывать, показывая, что файл в кодировке UTF-16 длиннее. Для создания файла в необходимой кодировке можно использовать FAR Manager.
3. Для тестирования при непосредственной установке в качестве logon-скрипта можно использовать виртуальную машину (VirtualBox + WS2008R2)
В архиве каталог ListOfBases + Ifmember.exe.