Хранение файлов и файловый менеджер в файле(листе) Excel, Бинарное хранение данных в CustomProperty листа Excel - VBA
В продолжении темы и темы. Получилось просто и вполне удобно, решил сохранить в блоге. В дальнейшем возможно развитие, новые алгоритмы и новые версии. Кратко: Хранение файлов и простенький файловый менеджер в файле(листе) Excel, Бинарное хранение данных в CustomProperty листа (Open FileName As Binary и Get, Put через байт-массив). Запуск с параметрами хранимых файлов. Максимальная простота и переносимость - нет форм, модулей уровня проекта, классов и т.д., все в модуле листа "ByteSheet(Storage)". Переносим лист (переносятся и загруженные данные) в другой файл, готово! Или копируем код (загруженные данные НЕ переносятся) с листа "ByteSheet(Storage)" на свой лист - и ваш лист становится файловым менеджером! Работа с файлами: ---> Как через МЕНЮ - работает стандартно через менеджер макросов (пользовательское стартовое меню "ByteSheet.START_MENU", в котором можно выбрать нужное действие и открыть нужное меню) ---> Так и используя ФУНКЦИИ напрямую в вашем проекте/надстройке, обычном файле Excel, поддерживающим макросы. Функции возвращают количество загруженных, выгруженных, удаленных файлов в случае успеха. 1."DownloadF" - Загрузка любых файлов (в т.ч. архивов, которые можно распаковать автоматом при выгрузке - ZIP), поддерживается пакетная загрузка. 2."UnloadF" - Выгрузка(в т.ч. пакетная)/Запуск файлов с параметрами. Поддерживается следующий функционал/параметры: 2.1 Выгрузка в выбранную папку, "по умолчанию" выгружаются в пользовательский "TEMP". 2.2 Выбор файла(ов) для выгрузки/запуска, "по умолчанию" выгружаются/запускаются все файлы. 2.3 Обновление файл(ов) в папке при распаковки, если он(и) там уже есть (выгружен(ы) ранее или есть с совпадающим именем), по умолчанию: не обновляем 2.4 Распаковка из архива ZIP, по умолчанию: выгружаем архив, без распаковки 2.5 Открыть файл в Excel после распаковки, по умолчанию: не открываем 2.6 Запуск файл после распаковки, приложением "по умолчанию" (для архива - один файл в один архив, в обратном случае, загрузится первый попавшийся из распакованного архива), по умолчанию: не запускаем 2.7 Запуск файла с нужными параметрами. Используется вместе с параметром 2.6 (аналогично командной строке с параметрами, без указания самого файла - полный путь к файлу автоматом подставляется), по умолчанию: без параметров. 2.8 Запуск файла, даже если он открыт в каком-либо процессе (запускать еще раз), по умолчанию: не запускаем. Все эти параметры Optional, если их нет - функция выполняется с параметрами по умолчанию. 3."DeleteF" - Удаление файлов, в т.ч. пакетное. Ниже исходники (лист ByteSheet(Storage)) и пример использования - модуль "Test" (расчет числа Пи). В загруженных файлах секретных данных и вирусов нет. Результаты стресс-тестирования: Загрузить (файлов - 432 шт), Выгрузить (файлов - 432 шт), Удалить (файлов - 432 шт) Общий размер файлов - 1 334 МБ (1,33 ГБ) Время выполнения всех трех операций в сумме - 25 сек. Размер книги Excel с файлами - 1,2 ГБ в формате .xlsb P.S. Отдельная благодарность! Андрей VG, за любезно предоставленные алгоритмы, которые были несколько доработаны и дополнены для этих целей. 21/11/2017 Обновление версии: Loader_02 1. Процедуры переписаны в функции, которые возвращают при успешном выполнении, количество загруженных, удаленных, выгруженных файлов. 2. Добавлена пакетная загрузка файлов (выгрузка и удаление всех файлов уже было в первой версии) с корректным счетчиком (скриншот прилагаю). 3. Добавлено описание к коду и аргументам функций. 4. Добавлен запуск файлов как "приложением по умолчанию" так и через Excel. 5. Добавлен обработчик ошибок, с выводом сообщений об ошибке. 6. Добавлен запрос/вопрос пользователю на перезапись выгружаемых и загружаемых файлов, если они уже есть. 22/03/2018 Обновление версии: Loader_03 1. Добавил стартовое меню (скриншот прилагаю). 2. Добавил поддержку командной строки (на примере расчета числа Пи - программа упакована моя, вирусов нет.). 3. Изменил порядок параметров для функций на более логичный. 22/04/2018 Обновление версии: Loader_04 1. Добавил команду "ОТКРЫТЬ" в стартовом меню с поддержкой командной строки (скриншот прилагаю). Zip-файлы, при этом, сначала распаковываются, потом запускается первый файл в распакованной папке (поэтому рекомендуется хранить по одному файлу в архивах). 2. Изменил переход по листам с символов "<", ">" на "-","+" - удобно использовать цифровой блок клавиатуры. 3. Добавил возврат в меню при неверно введенных данных. 07/06/2018 Обновление версии: Loader_05 1. Добавил проверку при запуске файла, открыт ли он в другом процессе с возможностью открыть повторно или не открывать (по умолчанию) 2. Исправил ошибку, возникающих в случаях когда имя выгружаемого файла совпадало с папкой и папку нужно было удалять. 3. Исправил ошибку, возникающих в случаях когда распаковывается один и тот же архив с обновлением данных (удалением старых) в целевой папке. 4. Исправлена ошибка возникающая при загрузке файлов размером в нечётное количество байтов. 5. Добавлена возможность указать при загрузке папку (добавил новый параметр в функцию загрузки), без указания файлов, тогда загружаются все файлы из папки. 30/05/2022 Обновление версии: Loader_06 1.Исправлениа ошибка выбора папки в функции DownloadF (ранее выбиралась как папка по умолчанию, в исправленной версии выбирается указанная папка явно) 2.Закомментировал в примере распаковку из .zip-файла и запуск .exe (иногда вызывает рефлексию антивируса, хотя вредоносного функционала там нет) |
Всего комментариев 23
Комментарии
-
Запись от Usaga размещена 31.10.2017 в 11:06 -
К примеру для хранение библиотек (функций написанных на C/C++). Если вы посмотрите, то увидите в файле функцию RusLetter. Механизм: автоматом распаковывается надстройка/библиотека - RusLetterx64.xll написанная на С, с функцией RusLetter, которая автоматом добавляется в стандартные функции Excel и используется так же как и стандартные функции.
Запись от bedvit размещена 31.10.2017 в 11:39 -
Запись от Avazart размещена 31.10.2017 в 17:41 -
Запись от bedvit размещена 31.10.2017 в 18:23 -
Запись от Rius размещена 01.11.2017 в 06:41 -
Запись от bedvit размещена 01.11.2017 в 09:58 -
VBA поэтому тоже отключают. Но его хотя бы можно просмотреть в режиме разработчика. А вот PE файлы не просмотришь. А если их код написан специально, то и антивирус не определит.
Пользователи таких документов приучатся разрешать выполнение. Потом какой-нибудь нехороший человек меняет вложенный файл, другой на другом компе запускает и всё, добро пожаловать, шифровальщики.Запись от Rius размещена 01.11.2017 в 10:10 -
Rius, ваше сообщение поспособствовало несколько задуматься, поскольку такая ситуация может быть, утрируя и исключая за рамки то, что и пользователь не каждый раз перед запуском смотрит, что там в VBA (если вообще знает такие буквы, поэтому там можно написать всё, что угодно), и профи/админы - все же отслеживает откуда файл получен, а сеть нормально администрируется (с нормальными правами доступа). Вероятность на ПК с включенными макросами зацепить что-то из просторов Сети - выше, чем проверенный и распространяемый файл с библиотеками специалистом в компании (и каким образом там появятся новая библа?). Но ОК, предположим такое произошло - вижу выход в хешировании, контрольной сумме распакованного файла (желательно нескольких разных хэш-функций одновременно, помня о легкости вычисления псевдоколлизий в MD5)
Запись от bedvit размещена 01.11.2017 в 11:37 -
Запись от Usaga размещена 01.11.2017 в 11:46 -
Цитата:проверенный и распространяемый файл с библиотеками специалистом в компании (и каким образом там появятся новая библа?)
Цитата:Но ОК, предположим такое произошло - вижу выход в хешировании, контрольной сумме распакованного файла (желательно нескольких разных хэш-функций одновременно, помня о легкости вычисления псевдоколлизий в MD5)
Человек хочет открыть файл, включает VBA и готово, файлы запустились автоматически и всё заразилось.
Если даже не автоматически, то кто и с чем будет сверять хеши? В том же документе их хранить - их там и подменят. А где-то на сервере, в каком-то списке - да все просто забьют на проверку.Запись от Rius размещена 01.11.2017 в 12:00 -
На первый взгляд кажется так, но есть прецеденты: Я храню там написанные для Excel - xll с функциями до 60 раз быстрее чем в VBA, мой коллега, комментарий: "Я так для одного клиента SQLite врапер в xlsb хранил, чтобы он мог со своей базой где нужно работать." Решение из коробки - открыл и работает, пользователю не нужно что-то распаковывать или подключать.
Согласитесь, что обиженный специалист и в VBA может спокойно разослать зловредный код и пользователь его так же запустит (не нужно компилировать и загружать да же новую библу) - проще, эффективнее и быстрее.
А хеш нужен что бы админ мог сравнить библу с оригиналом, можно и в VBA сделать сравнение до запуска библы с данными на том же серваке.Запись от bedvit размещена 01.11.2017 в 12:29 -
bedvit поймите, это всё отмазки.
То, что работу смогли ускорить, хорошо. Хотя язык и среда для этого не самые неподходящие.
Но все недостатки никуда не деваются.
Цитата:проще, эффективнее и быстрееЗапись от Rius размещена 01.11.2017 в 12:45 -
Риски расписаны, способы их нивелировать тоже. Каждый сам выбирает баланс: эффективность/риск.
ИМХО этот механизм не для массового развертывания, а скорее для спец.задач, где нужно или макс. скорость работы функций, или "все в одном файле", или хранить какие либо большие переменные таким образом (никто не запрещает вместо файлов хранить что-либо еще) и т.д.Запись от bedvit размещена 01.11.2017 в 13:08 -
Запись от Usaga размещена 01.11.2017 в 13:09 -
Запись от bedvit размещена 01.11.2017 в 13:40 -
Запись от bedvit размещена 24.11.2017 в 20:16 -
Цитата:Правда и в этом случае злоумышленник может заменить надстройку на свой вариант.
А вот эксель с сюрпризом внутри вызывает сомнения и подозрения в источнике подобной лабуды.
Кстати, а что говорят антивирусы на ваш эксель проверяли?Запись от Avazart размещена 25.11.2017 в 00:28 -
Касперский говорит, что угроз нет. Если вы посмотрите на одно сообщение выше вашего, там я описал как безопасно можно использовать сей продукт. Ну а выстрелить в ногу себе можно разными способами. Код можно хранить и просто на листах и запускать через Workbook_Open. Да тысячи их способов. Добавил новую версию, см.блог.
Запись от bedvit размещена 25.11.2017 в 15:21 -
Я имел ввиду сканирование на https://www.virustotal.com
Запись от Avazart размещена 25.11.2017 в 15:49 -
Цитата:Я имел ввиду сканирование на https://www.virustotal.com
Запись от bedvit размещена 26.11.2017 в 15:23