Работа с системой безопасности Microsoft Office или Самое безопасное место на Земле

28 0

Начиная с версии 2007 в пакете офисных программ компании Microsoft появилась такая полезная штука как Центр управления безопасностью. Он оберегает нас от потенциально вредоносного содержимого, внедренного в документы, сводя на нет попытки злоумышленников причинить вред нашим данным. К сожалению, этот же механизм порой вставляет палки в колеса и нам, когда мы пытаемся формировать отчеты в системе DIRECTUM.

Алгоритм работы при формировании отчета, например, в Excel обычно такой:

  1. Вычисляем любым доступным способом ID документа с макетом отчета. Если у документа несколько версий, решаем, какая из них нам нужна.
  2. Экспортируем текст версии во временный файл во временном каталоге.
  3. Создаем объект "Excel.Application".
  4. Открываем макет.
  5. Загружаем в него данные отчета.
  6. Показываем отчет пользователю / сохраняем как документ в системе / что-то еще.

И вот на четвертом шаге в нас летит кирпич:

На этом формирование отчета закончится, а в качестве бонуса — застрявший в памяти процесс excel.exe, доступ к которому будет только через диспетчер задач. А все потому что Excel не доверяет нашему файлу, который еще и открыт из каталога временных файлов Windows. Казалось бы, всего-то делов — использовать вместо временного каталога Windows другой каталог. Но какой? И как быть уверенным, что с этим каталогом все будет в порядке?

Ключ к решению состоит в том, что Центр управления безопасностью, как известно, позволяет вести список так называемых надежных расположений, файлам из которых следует всенепременно доверять. В этом списке по умолчанию уже есть пути к папкам шаблонов, надстроек и автозапуска.

Мы можем добавить туда путь к почти любому каталогу, и он будет считаться надежным, файлы из него будут нормально открываться. Почти — потому что некоторые расположения, как ни старайся, надежными объявить нельзя. Например, MS Office прекрасно знает о местонахождении каталога временных файлов системы Windows, на который указывает переменная окружения TEMP, и ни за что не даст добавить его в список надежных.

Итак, мы знаем, как убедить офис в безопасности каталога с макетом отчета. Но где должен находиться этот каталог? Поскольку каталог будет использоваться для размещения временных файлов отчетов, было бы не очень хорошо создавать его где-то на виду — например, в корне диска (какого, кстати?) или в папке "Мои документы". Но это вопрос вкуса, конечно, и конкретной задачи. Другой вопрос — как добавить выбранный каталог в список надежных до формирования отчета? Хорошо, если удастся договориться с администраторами и распространить настройку надежных расположений через политики. А если нет? Сейчас разберемся.

Настройку надежных расположений все приложения MS Office хранят в реестре. Например, для Excel путь к нужному разделу выглядит так:

HKCU\Software\Microsoft\Office\%Version%\Excel\Security\Trusted Locations

где %Version% — номер версии MS Office. Замена Excel на Word, PowerPoint и так далее приведет нас в аналогичный раздел соответствующего приложения. В редакторе реестра для искомого раздела мы увидим примерно такую картину:

Шесть подразделов с номерами от 0 до 5 соответствуют шести строчкам в списке надежных расположений в настройке Центра управления безопасностью на предыдущем скриншоте. В каждом из подразделов могут быть следующие параметры:

  • Description — описание расположения на человеческом языке,
  • Path — полный путь к каталогу,
  • Date — дата последнего изменения настройки (необязательно),
  • AllowSubFolders — признак того, является ли надежным только сам каталог или также все его подкаталоги (если параметр есть и равен 1 — подкаталоги надежны, иначе — нет).

Нам нужно создать новый раздел для нашего каталога. Опыты показали, что имя раздела не обязательно должно иметь вид Location%Number%, Excel учитывает все разделы внутри раздела Trusted Locations. Я не проверял, насколько Excel безразличен к имени раздела, нам достаточно того, что мы можем создать раздел с именем Reports (или IS-Builder, или My coolest location — главное, чтобы мы его помнили). В разделе Reports создадим параметры Path и Description, в которые запишем путь к каталогу и комментарий, соответственно. Если все сделали правильно, то в Центре управления безопасностью увидим наше надежное расположение:

Как видно на скриншоте, надежное расположение я решил создать в профиле пользователя. Во-первых, это позволяет не сваливать в одну кучу временные файлы разных пользователей. Помимо конфиденциальности так мы сможем избежать и случайных коллизий при совпадающих именах файлов. А во-вторых, местоположение профиля текущего пользователя очень легко найти — его адрес хранится в переменной окружения USERPROFILE.  Вы при решении ваших задач, вероятно, предпочтете другое расположение. Кстати, совершенно бесполезно пытаться с помощью редактора реестра сделать надежным каталог временных файлов Windows. В списке он появится, но будет неактивным, и эффекта такая настройка не возымеет.

Теперь, чтобы все то же самое умел проделать наш отчет, достаточно добавить небольшое вычисление в расчет отчета:

// Вывод отчета в MS Excel
Ex = CreateObject("Excel.Application")

// Путь к разделу с параметрами надежного расположения
KEY = Format("Software\Microsoft\Office\%s\Excel\Security\Trusted Locations\Reports"; Ex.Version)

// Получить путь к надежному расположению из реестра
ReportFolder = RegRead(KEY; "Path")

// Если надежное расположение еще не зарегистрировано, самое время сделать это сейчас
if ReportFolder == ""
  
  // Каталог создадим в профиле пользователя (переменная окружения USERPROFILE)
  ReportFolder = CreateObject("WScript.Shell").Environment("Process").Item("USERPROFILE") & "\Reports"
  
  // Параметры расположения: путь и комментарий
  RegWrite(KEY; "Path"; ReportFolder)
  RegWrite(KEY; "Description"; "Самое безопасное место на Земле")
  
endif

// Создать каталог для надежного расположения, если отсутствует
ForceDirectories(ReportFolder)

После этого можно использовать переменную ReportFolder в качестве пути к временному каталогу: выгружать в него макет отчета и работать с ним. Протестовать Excel уже не будет. Это вычисление можно оформить в виде функции и использовать централизованно во всех отчетах, и тогда отчеты будут самостоятельно заботиться о том, чтобы каталог надежного расположения существовал и был известен офисному приложению как надежное расположение.

Прикладываю архив с макетом и полным вычислением отчета, на которых отрабатывалась техника: ExampleReport.zip (9,10 Кб). В отчете использован способ вывода данных с помощью XSD-схемы.

28
Авторизуйтесь, чтобы оценить материал.
2
Пока комментариев нет.

Авторизуйтесь, чтобы написать комментарий