Регистрация ActiveX-DLL без прав администратора (UAC включен) - VB

Узнай цену своей работы

Формулировка задачи:

Итак, с целью спрятать пароль подключения к базе данных (поверхностное шифрование) у меня дошли руки к созданию Active-X библиотеки. Благодаря замечательной статье COM в действии

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).
Спойлер
Для работы DLL на самом деле используются значения ключей в ветке HKEY_CLASSES_ROOT (HKCR) Математика такая: HKCR получается путем сложения ключей, которые находятся в ветках HKLM + HKCU. Если ветка HKCU содержит другие значения, чем HKLM, то HKCU имеет приоритет.

Шаг 3. Модификация ключей Reg-файла.

Делаем автозамену веток HKEY_LOCAL_MACHINE на HKEY_CURRENT_USER И убеждаемся, что у нас все работает:
  • Отменяем регистрацию DLL:
    Bash
    (требует прав администратора через раз ). А иначе выдает ошибку "Не удалось выполнить вызов DllRegisterServer. Код ошибки 0х80004005."
  • Запускаем модифицированный Reg-файл
  • Перезапускаем процесс, откуда тестируем DLL (я использовал Excel VBA), код аналогичен и для VB6:
    Visual Basic
Убеждаемся, что присвоение объекта происходит корректно. Ошибок чаще всего бывает две: 1) Automation error. Не найден указанный модуль. - Это значит, что библиотека зарегистрирована, но указано неверное расположение файла DLL, либо он был переименован. 2) ActiveX component can't create object - DLL не зарегистрирована, или зарегистрирована некорректно.

Шаг 4. Избавляемся от лишних ссылок на 32-битные ветки реестра в Reg-файле

Как можно заметить из содержимого Reg-файла, система у меня х64-битная. И это Windows 7 с максимальным уровнем защиты UAC. Итак, сервер регистрации прописал DLL в реестре на все случаи. Но зачем? Не секрет, что в 64-х системах существует механизм переадресации запросов 32-битных приложений в ветку

Wow6432Node

. Процесс чем-то схожий с файловыми переадресациями, о которых я не так давно писал в этой теме. По этому вопросу есть неплохая статья от Jochen Kalmbach. Итак, удаляем дублирующие ветки реестра из Reg-файла, а в остальных удаляем часть "Wow6432Node\":
Спойлер
Одно но! После такой экзекуции, нам нельзя вручную (двойным кликом) вносить Reg-файл в реестр. Система примет такой запрос как от имени х64-процесса и переадресация не сработает. Поэтому нам нужно это делать из любого 32-битного приложения, коим есть VB6, например так:
Команда выполнялась под учетной записью с ограниченными правами, а также успешно испытана на свежеустановленной Windows XP x32-bit. В приложении: скомпилированная библиотека, Reg-файл, Excel-файл и VB-проект (на выбор) с Shell-ом регистрации и процедурой вызова методов и свойств объекта Calc.dll. VBS-скрипт у меня не заработал , не знаю почему.

Для корректной регистрации

Спойлер
"C:\\Users\\Alex\\Desktop\\ActXTest" на месторасположение файла Calc.dll на Вашем компьютере, на забывая при этом про двойные слеши

\\

. Стоит заметить, что при перекомпиляции 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, """", "")

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 3.7 из 5