Автоматическое формирование списка баз на терминальном сервере на основе групп пользователей (logon-скрипт)

Logon-скрипт («батник») для терминального сервера, формирующий необходимый список баз для каждого пользователя в зависимости от принадлежности пользователя к группе.

Исходные данные:

— терминальный сервер (у меня на 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.

1 Comment

  1. Diversus

    Рекомендую так же разработку Softonit Control, которая позволяет гибко настраивать видимые информационные базы пользователям, так же есть интеграция с Active Directory.

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *