Защита макроса

Автор Fiona, 9 июня 2020, 08:04

0 Пользователи и 1 гость просматривают эту тему.

Fiona

Добрый день!
Подскажите,пожалуйста, как защитить макросы от изменений? В excel в защищенном файле макросы не открываются без указания пароля. Если ли подобные возможности в LO?

rami

Можно запаролить любую библиотеку созданную пользователем в документе или офисе, кроме стандартных или встроенных (Standard, Tools и др.).

mikekaganski

Имейте ввиду, что запароленная библиотека имеет ограничения в версиях до 7.0 в плане поддержки Unicode (tdf#57113). Строки, содержащие, например, кириллицу, будут "сломаны" на системах с не-кириллической локалью. Библиотеки, запароленные на версиях до 7.0, будут показывать такие сломанные символы при работе на любой версии; если запаролить на 7.0, то на 7.0 и дальше будет работать нормально, но на более старых версиях всё равно будет по-старому.
С уважением,
Михаил Каганский

rami

Цитата: mikekaganski от  9 июня 2020, 11:09Строки, содержащие, например, кириллицу, будут "сломаны" на системах с не-кириллической локалью.
А если локаль кириллическая не будут "сломаны"? Кажется, не удачная формулировка или я не так понял.

Эту проблему можно обойти, если источник не ASCII строк будет находится вне запароленной библиотеки (в другой библиотеке, в документе или во внешнем файле) или если строка будет закодирована числовыми значениями символов (нужна будет функция декодирования).

mikekaganski

Цитата: rami от  9 июня 2020, 12:22
Цитата: mikekaganski от  9 июня 2020, 11:09Строки, содержащие, например, кириллицу, будут "сломаны" на системах с не-кириллической локалью.
А если локаль кириллическая не будут "сломаны"? Кажется, не удачная формулировка или я не так понял.

Да, наверное, я криво выразился... в общем, при сохранении любых строк в коде в запароленный компилированный образ старые версии переводят эти строки в однобайтную кодировку, соответствующую текущей локали (причём не локали из настроек программы, а локали потока - там интересная внутренняя логика, не суть: скажем, на Windows это будет язык системы). Поэтому на русской винде, скажем, русские буквы будут закодированы правильно, а греческие превратятся в вопросики ещё на этапе сохранения. Прошу прощения за ещё одно невразумительное описание :)

Да, есть возможность обойти - используя указанные способы. Я написал просто о том, что это может быть нужно учитывать.
С уважением,
Михаил Каганский

rami

У меня на Маке системная локаль русская, но не ASCII символы (кириллица) в запароленной  библиотеке не поддерживаются.

mikekaganski

#6
Цитата: rami от  9 июня 2020, 13:10
У меня на Маке системная локаль русская, но не ASCII символы (кириллица) в запароленной  библиотеке не поддерживаются.

Да, я поэтому и заметил, что там сложная логика, и она зависит от ОС. На Windows используется GetACP - см. osl_getThreadTextEncoding; на других ОС - см. osl_thread_textencoding_init_Impl, которая вероятно вернёт UTF-8. А если текущая кодировка не 1-байтная, то она превратится в MS-1252 в GetSOStoreTextEncoding, которая вызывает GetOneByteTextEncoding.

В общем, да, мне надо было написать не "кириллическая локаль", а писать про кодировки.
С уважением,
Михаил Каганский

Fiona

Да, спасибо, свою библиотеку получилось запаролить. Только кто ж знал, что Standard нельзя использовать для этой цели...  :roll: придется опять все переделывать ;)
А еще этот бесконечный вопрос отключить/включить макросы... Его нельзя обойти для загружаемого из макроса файла? Или например загружать вообще без создания бланка... А то еще и все листы мелькают перед глазами вовремя обработки... Перепробовала все значения аргумента MacroExecutionMode - так и не поняла разницу в реалии.

Fiona

Кстати, на 10 винде не увидела косяков с кодировкой, вроде обошлось... а если на линукс придется переносить? Только эмпирически?

mikekaganski

Цитата: Fiona от  9 июня 2020, 13:36
А еще этот бесконечный вопрос отключить/включить макросы... Его нельзя обойти для загружаемого из макроса файла?

Ну да, специальный режим для удобства вирусописателей. "Если вы сделаете так, то адресат не узнает, что открытие вашего вложения выполнит ваш макрос".

На самом деле есть возможность настроить доверенные расположения, где макросы выполняются без запроса. И/или сертификаты.
С уважением,
Михаил Каганский

Fiona

Да тут предполагается, что пользователи уже все сделали, что хотели - осталось слить информацию в один шаблон. И включение макроса не нужно в принципе для загруженного макроса. Вроде так и написано, что макросы не выполняются для MacroExecutionMode со значением 0. Тогда в чем смысл вопроса: быть или не быть?

Fiona

Добрый день!
Попытаюсь конкретизировать последний вопрос. Файлы для выгрузки размещаются на сетевом ресурсе, а в регламентные сроки обрабатываются джобом. Некому нажимать кнопочку "отключить макросы". Подскажите, пожалуйста, может все-таки можно решить эту проблему не через настройки LO? Файлы открываются через StarDesktop.loadComponentFromURL. Возможно, есть аргументы, которые не позволят запустить макросы и не потребуют ответа на вопрос?

economist

Не понял слегка. В обычной рабочей среде макросы в Параметры/Безопасность - Низкий (т.е. включены все полностью) или только где доверенные расположения/сертификаты. Потому что 99% пользователей не замечают сообщения вверху экрана (это же касается Excel, просто какое-то слепое пятно у людей вверху ~:-)

Вам нужно навсегда запретить запуск опр. макроса другим макросом при "особом" запуске кроном?

Есть аргументы комстроки для крона (и запуска в --headless режиме), с запуском макроса. Макрос может удалять другие библиотеки и макросы.

А еще есть События для файла/приложения LO при открытии файла (в т.ч. кроном), на которые можно назначить макрос. Он тоже может удалять другие библиотеки и макросы, чтобы они впредь не запускались.
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

Fiona

Не совсем так... Удалять ничего не нужно. И я не могу поставить низкий уровень защищенности в корпоративной сети. Пожалуй, можно попробовать для выгрузки использовать доверенные источники, спасибо. Но есть вероятность того, что первая загрузка в шаблон на рабочих местах будет из файлов xlsm, чтобы избежать прерываний при выполнении загрузки из-за несовместимости с VBA придется сидеть за компьютером и тыкать пальцем "отключить макрос".

Fiona

А как обратиться к макросу в созданной библиотеке из внешнего скрипта?

ffrom="C:\import\test_csv\ФСД_test_csv.ods"
ffto="C:\import\test_csv\ФСД_test_csv.csv"

Set oSM = CreateObject("com.sun.star.ServiceManager")
Set oDesk = oSM.createInstance("com.sun.star.frame.Desktop")

Dim Args(1)
'Настраиваем массив PropertyValue, необходимый для открытия файла
Args(0) = oSM.Bridge_GetStruct("com.sun.star.beans.PropertyValue")
Args(0).Name = "MacroExecutionMode" 'Определяем политику выполнения макросов
Args(0).Value = ALWAYS_EXECUTE
Args(1) = oSM.Bridge_GetStruct("com.sun.star.beans.PropertyValue")
Args(1).Name = "Hidden"
Args(1).Value = False

oDoc = oDesk.loadComponentFromUrl("file:///C:/import/test_csv/Make_CSV.ods","_blank",0,Args) 'открываем файл с нужным макросом
oDoc.BasicLibraries.loadLibrary("Make_CSV") 'загружаем библиотеку из каталога объектов

Set scriptProvider = oDoc.getScriptProvider()
s = scriptProvider.getScript("vnd.sun.star.script:Make_CSV.Book.Make_CSV?language=Basic&location=application")

s.invoke ffrom, ffto 'запускаем макрос.
  wb.close true
oSM.quit

Есть подозрение, что это не BasicLibraries, но не могу прецедентов найти...