Регистрация ActiveX-DLL без прав администратора (UAC включен) - VB
Формулировка задачи:
Итак, с целью спрятать пароль подключения к базе данных (поверхностное шифрование) у меня дошли руки к созданию Active-X библиотеки.
Благодаря замечательной статье COM в действии
Для работы DLL на самом деле используются значения ключей в ветке HKEY_CLASSES_ROOT (HKCR)
Математика такая:
HKCR получается путем сложения ключей, которые находятся в ветках HKLM + HKCU.
Если ветка HKCU содержит другие значения, чем HKLM, то HKCU имеет приоритет.
Одно но! После такой экзекуции, нам нельзя вручную (двойным кликом) вносить Reg-файл в реестр.
Система примет такой запрос как от имени х64-процесса и переадресация не сработает.
Поэтому нам нужно это делать из любого 32-битного приложения, коим есть VB6, например так:
"C:\\Users\\Alex\\Desktop\\ActXTest"
на месторасположение файла Calc.dll на Вашем компьютере, на забывая при этом про двойные слеши
Catstail
-a все удалось с первого раза. За исключением проблем при регистрации DLL через Regsvr32, которой обычных прав оказалось недостаточно, ведь она записывает значения в реестр в ветку HKLM. А как известно, без регистрации подключить библиотеку к проекту ни поздним, ни ранним связыванием не получится. Выходов из ситуации было 2: 1) Делать установщик, которому прописывать манифест повышенных прав (иконка со щитом), либо повторный запуск процесса от имени другого пользователя через runas. В любом случае буду получать предупреждения системы защиты. 2) Прописать вручную ветки реестра для текущего пользователя (HKCU), т.к. утилита Regsvr32 такой роскоши нам не дает. Вторым способом я и занялся.Шаг 1. Регистрация DLL с правами администратора
, например через (.cmd) Batch-файл, или через запуск консоли CMD в строке поиска Ctrl+Shift+Enter.Шаг 2. Получение ключей реестра.
Вторая часть статьиCatstail
-а описывает, кроме всего прочего особенности хранения ключей в реестре при регистрации DLL, а также в приложении программу, которая находит в реестре GUID, CLSID, Inerface и TypeLib-ы созданного класса. Но все же я решил вручную просканировать изменения в реестре (для этого воспользовался бесплатной программой RegShot).Спойлер
Шаг 3. Модификация ключей Reg-файла.
Делаем автозамену веток HKEY_LOCAL_MACHINE на HKEY_CURRENT_USER И убеждаемся, что у нас все работает:- Отменяем регистрацию DLL:(требует прав администратора через раз ). А иначе выдает ошибку "Не удалось выполнить вызов DllRegisterServer. Код ошибки 0х80004005."
Bash - Запускаем модифицированный Reg-файл
- Перезапускаем процесс, откуда тестируем DLL (я использовал Excel VBA), код аналогичен и для VB6:
Visual Basic
Шаг 4. Избавляемся от лишних ссылок на 32-битные ветки реестра в Reg-файле
Как можно заметить из содержимого Reg-файла, система у меня х64-битная. И это Windows 7 с максимальным уровнем защиты UAC. Итак, сервер регистрации прописал DLL в реестре на все случаи. Но зачем? Не секрет, что в 64-х системах существует механизм переадресации запросов 32-битных приложений в веткуWow6432Node
. Процесс чем-то схожий с файловыми переадресациями, о которых я не так давно писал в этой теме. По этому вопросу есть неплохая статья от Jochen Kalmbach. Итак, удаляем дублирующие ветки реестра из Reg-файла, а в остальных удаляем часть "Wow6432Node\":Спойлер
Команда выполнялась под учетной записью с ограниченными правами,
а также успешно испытана на свежеустановленной Windows XP x32-bit.
В приложении: скомпилированная библиотека, Reg-файл, Excel-файл и VB-проект (на выбор) с Shell-ом регистрации и процедурой вызова методов и свойств объекта Calc.dll.
VBS-скрипт у меня не заработал , не знаю почему.
Для корректной регистрации
Спойлер
\\
. Стоит заметить, что при перекомпиляции DLL в среде VB6 происходит автоматическая регистрация библиотеки. Кроме того, все GUID и др. значения изменяются. Т.о. Reg-файл нужно создавать заново. В дальнейшем если версия DLL будет меняться планирую автоматизировать весь этот процесс написанием программы. Благо, исходник сканера уже есть Может конечно вся статья и зря, и есть более простой способ зарегистрировать Active-X Dll в среде текущего пользователя. С удовольствием выслушаю Ваши варианты и комментарии.Решение задачи: «Регистрация ActiveX-DLL без прав администратора (UAC включен)»
textual
Листинг программы
Private Sub Form_Load() Dim fso As Scripting.FileSystemObject Set fso = CreateObject("Scripting.FileSystemObject") Dim cmm As String Set mappTLI = New TLI.TLIApplication File1.Pattern = "*.ocx; *.dll" Dir1.Path = App.Path cmm = Replace(Command, """", "")
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д