Исходные данные:
— терминальный сервер (у меня на 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 mplts82
UseHWLicenses=1
— пустой файл ibases.v8i (скопирован, очищен)
2) файлы вида DB_[ИмяБазы].v8i. Каждый файл
содержит описание для одной базы.
3) командный файл makecfg.cmd (листинг ниже). Меняем путь для
переменной mainpath на свой. Меняем имена групп пользователей и наименования
баз на свои в разделе «список баз».
4) (необязательно) в моем случае также одна из баз
используется не только на терминале, но и локально. Описание базы находится в
расшаренном каталоге D:ListOfBasesCommonBases.
При необходимости – создаем.
4. Создаем необходимые группы пользователей (ServerManager –
Configuration – LocalUsersandGroups – Groups),
у меня вида User1C8_[ИмяБазы]. Добавлям
пользователей в группы.
5. Устанавливаем скрипт в качестве logon-скрипта (gpedit.msc – LocalGroupPolicyEditor –
LocalComputerPolicy –
UserConfiguration – WindowsSettings – Scripts(LogonLogoff) – Logon– указываем
файл makecfg.cmd).
Листинг файла makecfg.cmd:
::@echo off
::для добавления новой базы — новую базу добавляем в
===списке баз===
::структура основного рабочего каталога:
::каталог Default — файл 1CEStart.cfg, содержимое файла:
:: ConfigurationTemplatesLocation=D:CONFIG_1C8 mplts82
:: UseHWLicenses=1
:: — файл ibases.v8i (скопирован, очищен)
::файлы DB_[ИмяБазы].v8i, каждый файл содержит описание одной базы
::файл makecfg.cmd — данный командный файл
::===============установка
переменных==========================
::основной рабочий каталог
set mainpath=D:ListOfBases
::каталог дефолтных файлов
set
configfolder=%mainpath%Default
::каталог конфигурационных файлов пользователя
set
userfolder=C:Users\%username%AppDataRoaming1C1CEStart
::путь к ifmember.exe
set
ifmember=»C:Program Files (x86)Resource KitIFMEMBER.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%%~2DB_%~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%%~2DB_%~1.v8i>>
%userfolder%1CEStart.cfg)
del
%userfolder%1CEStart.tmp
exit /b
::================================================================================================
::===================================пользователь не в группе==========================================
:sub2
findstr.exe
/b /v /c:»CommonInfoBases=%mainpath%%~2DB_%~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.
Рекомендую так же разработкуSoftonit Control , которая позволяет гибко настраивать видимые информационные базы пользователям, так же есть интеграция с Active Directory.