Настройки уровня доменной группы или пользователя

Дата публикации: 08.03.2011
Дата редактирования: не редактировалась
Состояние: завершена

Настройки уровня доменной группы и уровня пользователя в AdminCAD API представлены классом AdminCAD.Configuration.Settings, реализующим интерфейс IXmlSerializable. Это означает, что структура файла одинакова, что для доменной группы, что для пользователя - разница только в содержимом. Файл таких настроек представляет собой зашифрованный xml-файл. Расшифрованный вариант xml-файла настроек выглядит примерно так (в зависимости от его наполнения данными вид может отличаться, но структура документа останется той же):

   1:  <Settings>
   2:    <!--Перечень правил, согласно которым должны выбираться файлы плагинов для их загрузки в AutoCAD-->
   3:    <LoadingTasks>
   4:      <!--Фильтры, согласно которым будут отбираться для загрузки плагины, написанные с помощью ObjectARX-->
   5:      <ARX>
   6:        <!--Атрибут 'Directory' содержит путь к каталогу, в котором должен осуществляться поиск файлов. В имени каталога можно использовать имена переменных, которые
   7:      определены в составе данного файла, в блоке 'Directories'. Имена переменных следует заключать между двумя символами '%'. 
   8:      В атрибуте 'IncludeFilters' указываются фильтры, на основании которых производится отбор нужных библиотек. Между собой фильтры следует разделять символом ';'.
   9:      Атрибут 'ExcludeFilters' (является необязательным) содержит перечень фильтров (разделённых символом ';'), с помощью которых отфильтровываются не нужные файлы из набора, полученного на основе фильтров, указанных в атрибуте 'IncludeFilters'.
  10:      Внимание: фильтры, указываемые в атрибутах 'IncludeFilters' и 'ExcludeFilters' - НЕ ЯВЛЯЮТСЯ РЕГУЛЯРНЫМИ ВЫРАЖЕНИЯМИ!
  11:      Атрибут 'Recursion' указывает, следует ли выполнять рекурсивный поиск по дочерним каталогам. 
  12:      Атрибут 'Use' указывает, следует ли обрабатывать данный элемент 'LoadingTask'. Элементов 'LoadingTask' может быть сколько угодно.-->
  13:        <LoadingTask Directory="%XmlPath.Arx%\bin\ARX" IncludeFilters="+arx" ExcludeFilters="-arx" Recursion="True" Use="True" />
  14:      </ARX>
  15:      <!--Фильтры, согласно которым будут отбираться для загрузки плагины, написанные с помощью .Net API AutoCAD-->
  16:      <NET>
  17:        <LoadingTask Directory="%XmlPath.Net%\bin\NET" IncludeFilters="+net" ExcludeFilters="-net" Recursion="True" Use="True" />
  18:      </NET>
  19:      <!--Фильтры, согласно которым будут отбираться для загрузки плагины, написанные с помощью AutoLisp и VisualLisp-->
  20:      <LISP>
  21:        <LoadingTask Directory="%XmlPath.LISP%" IncludeFilters="+lisp" ExcludeFilters="-lisp" Recursion="True" Use="True" />
  22:      </LISP>
  23:      <!--Фильтры, согласно которым будут отбираться для загрузки плагины, написанные с помощью VBA-->
  24:      <VBA>
  25:        <LoadingTask Directory="%XmlPath.VBA%\bin\VBA" IncludeFilters="+vba" ExcludeFilters="-vba" Recursion="True" Use="True" />
  26:      </VBA>
  27:    </LoadingTasks>
  28:    <!--Блок, предназначеный для хранения в виде словарей, различного рода информации. Информация объединяется в группы (элементы VariableGroup) и содержится в виде записей объектов Variable.-->
  29:    <VariableGroups>
  30:      <VariableGroup VarGroupName="SingleVariables" />
  31:      <VariableGroup VarGroupName="UserInfo">
  32:        <Variable Key="Phone" Value="0" />
  33:        <Variable Key="HasPhone" Value="null" />
  34:        <Variable Key="CabinetNumber" Value="0" />
  35:      </VariableGroup>
  36:      <VariableGroup VarGroupName="UserEnvironment">
  37:        <Variable Key="Localization" Value="ru-RU" />
  38:      </VariableGroup>
  39:    </VariableGroups>
  40:  </Settings>

Как видим, настройки разделены на два блока данных: LoadingTasks и VariableGroups. Назначение и структура этих блоков полностью соответствует блокам LoadingTasks и OtherVariables из общего конфигурационного файла уровня домена.

Блок информации, управляющий загрузкой плагинов в AutoCAD представлен элементом LoadingTasks, в составе которого присутствует четыре группы:
  1. ARX - группа задач по загрузке модулей, написанных с использованием ObjectARX.
  2. NET -  группа задач по загрузке модулей, написанных с помощью .Net API AutoCAD.
  3. LISP - группа задач по загрузке модулей, написанных с помощью AutoLisp или VisualLisp.
  4. VBA - группа задач по загрузке модулей, написанных с помощью VBA.
В составе каждой группы находятся элементы LoadingTask (в приведённом выше фрагменте каждая группа содержит только по одному элементу LoadingTask, но на самом деле их можно создавать сколько угодно, либо вообще удалить все, но тогда мы не сможем управлять загрузкой плагинов для всех пользователей домена). Элемент LoadingTask представляет собой задачу по загрузке плагинов. В атрибуте Directory указывается каталог, в котором следует искать плагины. 
Атрибут IncludeFilters содержит имя ключа той записи из блока RegexRules (рассмотренного нами чуть выше), значение атрибута Rule которой следует использовать для выбора тех файлов, которые следует загружать. 
Файлы, полученные с помощью правила, указанного в атрибуте IncludeFilters, затем проверяются фильтром ExcludeFilters, который содержит имя ключа той записи из блока RegexRules (рассмотренного нами чуть выше), значение атрибута Rule которой следует использовать для выбора тех файлов, которые следует исключить из общего набора. Т.о. фильтрация фалов проходит две "стадии очистки". 
Атрибут Recursion указыват, следует ли выполнять рекурсивный поиск файлов по подкаталогам директории, указанной в атрибуте Directory. 
Атрибут Use указывает на то, следует ли использовать данное правило (True - использовать, False - не использовать). Т.о. если администратор CAD не хочет, чтобы какая-то задача по загрузке плагинов выполнялась, ему вовсе не обязательно удалять её из конфигурационного файла - достаточно назначить её атрибуту Use значение False.

Последний блок называетсяValueGroups содержит словарь групп переменных. Групп может быть сколько угодно, на усмотрение администратора CAD. Каждая группа представлена элементом VariableGroup и содержит в своём составе неограниченное число элементов Variable. В этих переменных можно хранить любую нужную нам информацию.

Программно работать с классом Settings весьма просто. 

   1:  using System;
   2:  using System.Collections.Generic;
   3:  using System.Linq;
   4:  using System.Text;
   5:  using Microsoft.Win32;
   6:  using System.Security.Cryptography;
   7:  using System.Xml.Linq;
   8:  using System.Text.RegularExpressions;
   9:  using System.IO;
  10:  using AdminCAD.Configuration;
  11:  using AdminCAD.Net.Mail;
  12:  using AdminCAD.DirectoryServices;
  13:  using AdminCAD.Autodesk.AutoCAD;
  14:  using AdminCAD.Security.Cryptography;
  15:  using AdminCAD.Configuration.Journaling;
  16:   
  17:  namespace AdminCAD.AcadLibsTest
  18:  {
  19:      class Program
  20:      {
  21:          static void Main(string[] args)
  22:          {
  23:              //Вектор инициализации
  24:              byte[] iv = new byte[] { 100, 149, 158, 255, 68, 25, 176, 203, 162, 203, 171, 160, 19, 74, 119, 34 };
  25:              //Ключ шифрования/дешифровки
  26:              byte[] key = XSecurity.GetBytesFromFile(@"D:\SERVER\AdminCAD\Settings\Key.key");
  27:              //Кодировка символов
  28:              Encoding encoding = Encoding.UTF8;
  29:              //Имя файла общих конфигурационных настроек уровня домена
  30:              string comSetFileName = @"D:\SERVER\AdminCAD\Settings\CommonSettings.set";
  31:              //Получаем объект общих настроек уровня домена
  32:              CommonSettings comSet = CommonSettings.Load(comSetFileName, key, iv, encoding);
  33:              //Версия AutoCAD, для которой хотим получить настройки (в дальнейшем мы можем указывать другую версию через свойство AcadVersion)
  34:              AcadVersion av = new AcadVersion("17.2");
  35:              //Создаём объект, который будет предоставлять нам информацию для той версии AutoCAD, которую мы ему указываем
  36:              CommonSettingsWrapper csw = new CommonSettingsWrapper(av, comSet, key, iv, encoding);
  37:              //Получаем настройки пользователя
  38:              Settings userSettings = csw.GetUserSettings();
  39:              //Добавляем новую группу переменных
  40:              string cuiGroupName = "Мои CUI-файлы";
  41:              userSettings.GroupVariables.Add(cuiGroupName, new Dictionary<string, string>());
  42:              //В созданную нами новую группу добавляем пару новых переменных
  43:              userSettings.GroupVariables[cuiGroupName].Add("Работа с Excel", @"%XmlPath.LocalCommonDir%\Dependent\17.2\etc\CUI\MyExcelCUI.cui");
  44:              userSettings.GroupVariables[cuiGroupName].Add("Работа с Access", @"%XmlPath.LocalCommonDir%\Dependent\17.2\etc\CUI\MyAccessCUI.cui");
  45:              //В блок правил по загрузке .Net-плагинов добавляем новую запись - загрузка новых плагинов для тестирования
  46:              LoadingTask loadingTask = new LoadingTask(@"%XmlPath.Net%\bin\TestingPluginsForNet", "+net", "-net", true, true);
  47:              userSettings.LoadingTasks["NET"].Add(loadingTask);
  48:              //Сохраняем результаты во внешний файл
  49:              userSettings.Save(@"C:\Users\Андрей (юзер)\AppData\Roaming\AdminCAD\UserSettings.set", csw.Key, csw.IV, csw.Encoding);
  50:          }
  51:      }
  52:  }

В результате содержимое файла настроек изменится и станет таким:

   1:  <Settings>
   2:    <!--Перечень правил, согласно которым должны выбираться файлы плагинов для их загрузки в AutoCAD-->
   3:   <LoadingTasks>
   4:      <!--Фильтры, согласно которым будут отбираться для загрузки плагины, написанные с помощью ObjectARX-->
   5:      <ARX>
   6:        <!--Атрибут 'Directory' содержит путь к каталогу, в котором должен осуществляться поиск файлов. В имени каталога можно использовать имена переменных, которые
   7:      определены в составе данного файла, в блоке 'Directories'. Имена переменных следует заключать между двумя символами '%'. 
   8:      В атрибуте 'IncludeFilters' указываются фильтры, на основании которых производится отбор нужных библиотек. Между собой фильтры следует разделять символом ';'.
   9:      Атрибут 'ExcludeFilters' (является необязательным) содержит перечень фильтров (разделённых символом ';'), с помощью которых отфильтровываются не нужные файлы из набора, полученного на основе фильтров, указанных в атрибуте 'IncludeFilters'.
  10:      Внимание: фильтры, указываемые в атрибутах 'IncludeFilters' и 'ExcludeFilters' - НЕ ЯВЛЯЮТСЯ РЕГУЛЯРНЫМИ ВЫРАЖЕНИЯМИ!
  11:      Атрибут 'Recursion' указывает, следует ли выполнять рекурсивный поиск по дочерним каталогам. 
  12:      Атрибут 'Use' указывает, следует ли обрабатывать данный элемент 'LoadingTask'. Элементов 'LoadingTask' может быть сколько угодно.-->
  13:        <LoadingTask Directory="%XmlPath.Arx%\bin\ARX" IncludeFilters="+arx" ExcludeFilters="-arx" Recursion="True" Use="True" />
  14:      </ARX>
  15:      <!--Фильтры, согласно которым будут отбираться для загрузки плагины, написанные с помощью .Net API AutoCAD-->
  16:      <NET>
  17:        <LoadingTask Directory="%XmlPath.Net%\bin\NET" IncludeFilters="+net" ExcludeFilters="-net" Recursion="True" Use="True" />
  18:        <LoadingTask Directory="%XmlPath.Net%\bin\TestingPluginsForNet" IncludeFilters="+net" ExcludeFilters="-net" Recursion="True" Use="True" />
  19:      </NET>
  20:      <!--Фильтры, согласно которым будут отбираться для загрузки плагины, написанные с помощью AutoLisp и VisualLisp-->
  21:      <LISP>
  22:        <LoadingTask Directory="%XmlPath.LISP%" IncludeFilters="+lisp" ExcludeFilters="-lisp" Recursion="True" Use="True" />
  23:      </LISP>
  24:      <!--Фильтры, согласно которым будут отбираться для загрузки плагины, написанные с помощью VBA-->
  25:      <VBA>
  26:        <LoadingTask Directory="%XmlPath.VBA%\bin\VBA" IncludeFilters="+vba" ExcludeFilters="-vba" Recursion="True" Use="True" />
  27:      </VBA>
  28:    </LoadingTasks>  
  29:    <!--Блок, предназначеный для хранения в виде словарей, различного рода информации. Информация объединяется в группы (элементы VariableGroup) и содержится в виде записей объектов Variable.-->
  30:    <VariableGroups>
  31:      <VariableGroup VarGroupName="SingleVariables" />
  32:      <VariableGroup VarGroupName="UserInfo">
  33:        <Variable Key="Phone" Value="0" />
  34:        <Variable Key="HasPhone" Value="null" />
  35:        <Variable Key="CabinetNumber" Value="0" />
  36:      </VariableGroup>
  37:      <VariableGroup VarGroupName="UserEnvironment">
  38:        <Variable Key="Localization" Value="ru-RU" />
  39:      </VariableGroup>
  40:      <VariableGroup VarGroupName="Мои CUI-файлы">
  41:        <Variable Key="Работа с Excel" Value="%XmlPath.LocalCommonDir%\Dependent\17.2\etc\CUI\MyExcelCUI.cui" />
  42:        <Variable Key="Работа с Access" Value="%XmlPath.LocalCommonDir%\Dependent\17.2\etc\CUI\MyAccessCUI.cui" />
  43:      </VariableGroup>
  44:    </VariableGroups>
  45:  </Settings>

Как видим, добавлена запись в строке 18, а так же блок данных в строках 40-43.
Comments