Регистрация ActiveX-DLL без прав администратора (UAC включен)
Запись от Dragokas размещена 10.09.2012 в 02:45
Показов 12546
Комментарии 1
Метки activex dll регистрация
|
Итак, с целью спрятать пароль подключения к базе данных (поверхностное шифрование) у меня дошли руки к созданию Active-X библиотеки. Благодаря замечательной статье COM в действии Catstail-a все удалось с первого раза. За исключением проблем при регистрации DLL через Regsvr32, которой обычных прав оказалось недостаточно, ведь она записывает значения в реестр в ветку HKLM. А как известно, без регистрации подключить библиотеку к проекту ни поздним, ни ранним связыванием не получится. Выходов из ситуации было 2: 1) Делать установщик, которому прописывать манифест повышенных прав (иконка со щитом), либо повторный запуск процесса от имени другого пользователя через runas. В любом случае буду получать предупреждения системы защиты. 2) Прописать вручную ветки реестра для текущего пользователя (HKCU), т.к. утилита Regsvr32 такой роскоши нам не дает. Вторым способом я и занялся. Шаг 1. Регистрация DLL с правами администратора, например через (.cmd) Batch-файл, или через запуск консоли CMD в строке поиска Ctrl+Shift+Enter.
Вторая часть статьи Catstail-а описывает, кроме всего прочего особенности хранения ключей в реестре при регистрации DLL, а также в приложении программу, которая находит в реестре GUID, CLSID, Inerface и TypeLib-ы созданного класса. Но все же я решил вручную просканировать изменения в реестре (для этого воспользовался бесплатной программой RegShot). Получен список новых ключей:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Calc.myCalc] @="Calc.myCalc" [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Calc.myCalc\Clsid] @="{54319578-F5A1-4BEF-B8A4-20E6F89ABB4A}" [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Wow6432Node\CLSID\{54319578-F5A1-4BEF-B8A4-20E6F89ABB4A}] @="Calc.myCalc" [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Wow6432Node\CLSID\{54319578-F5A1-4BEF-B8A4-20E6F89ABB4A}\Implemented Categories] [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Wow6432Node\CLSID\{54319578-F5A1-4BEF-B8A4-20E6F89ABB4A}\Implemented Categories\{40FC6ED5-2438-11CF-A3DB-080036F12502}] [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Wow6432Node\CLSID\{54319578-F5A1-4BEF-B8A4-20E6F89ABB4A}\InprocServer32] @="C:\\Users\\Alex\\Desktop\\ActXTest\\C alc.dll" "ThreadingModel"="Apartment" [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Wow6432Node\CLSID\{54319578-F5A1-4BEF-B8A4-20E6F89ABB4A}\ProgID] @="Calc.myCalc" [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Wow6432Node\CLSID\{54319578-F5A1-4BEF-B8A4-20E6F89ABB4A}\Programmable] [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Wow6432Node\CLSID\{54319578-F5A1-4BEF-B8A4-20E6F89ABB4A}\TypeLib] @="{4D922142-997D-4403-A002-2387BCF4A07F}" [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Wow6432Node\CLSID\{54319578-F5A1-4BEF-B8A4-20E6F89ABB4A}\VERSION] @="1.0" [HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Classes\CLSID\{54319578-F5A1-4BEF-B8A4-20E6F89ABB4A}] @="Calc.myCalc" [HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Classes\CLSID\{54319578-F5A1-4BEF-B8A4-20E6F89ABB4A}\Implemented Categories] [HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Classes\CLSID\{54319578-F5A1-4BEF-B8A4-20E6F89ABB4A}\Implemented Categories\{40FC6ED5-2438-11CF-A3DB-080036F12502}] [HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Classes\CLSID\{54319578-F5A1-4BEF-B8A4-20E6F89ABB4A}\InprocServer32] @="C:\\Users\\Alex\\Desktop\\ActXTest\\C alc.dll" "ThreadingModel"="Apartment" [HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Classes\CLSID\{54319578-F5A1-4BEF-B8A4-20E6F89ABB4A}\ProgID] @="Calc.myCalc" [HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Classes\CLSID\{54319578-F5A1-4BEF-B8A4-20E6F89ABB4A}\Programmable] [HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Classes\CLSID\{54319578-F5A1-4BEF-B8A4-20E6F89ABB4A}\TypeLib] @="{4D922142-997D-4403-A002-2387BCF4A07F}" [HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Classes\CLSID\{54319578-F5A1-4BEF-B8A4-20E6F89ABB4A}\VERSION] @="1.0" [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Interface\{25E88292-036E-479D-B010-82EFB67A1001}] @="_myCalc" [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Interface\{25E88292-036E-479D-B010-82EFB67A1001}\ProxyStubClsid32] @="{00020424-0000-0000-C000-000000000046}" [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Interface\{25E88292-036E-479D-B010-82EFB67A1001}\TypeLib] @="{4D922142-997D-4403-A002-2387BCF4A07F}" "Version"="1.0" [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\TypeLib\{4D922142-997D-4403-A002-2387BCF4A07F}] [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\TypeLib\{4D922142-997D-4403-A002-2387BCF4A07F}\1.0] @="Calc" [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\TypeLib\{4D922142-997D-4403-A002-2387BCF4A07F}\1.0\0] [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\TypeLib\{4D922142-997D-4403-A002-2387BCF4A07F}\1.0\0\win32] @="C:\\Users\\Alex\\Desktop\\ActXTest\\C alc.dll" [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\TypeLib\{4D922142-997D-4403-A002-2387BCF4A07F}\1.0\FLAGS] @="0" [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\TypeLib\{4D922142-997D-4403-A002-2387BCF4A07F}\1.0\HELPDIR] @="C:\\Users\\Alex\\Desktop\\ActXTest" Для работы DLL на самом деле используются значения ключей в ветке HKEY_CLASSES_ROOT (HKCR) Математика такая: HKCR получается путем сложения ключей, которые находятся в ветках HKLM + HKCU. Если ветка HKCU содержит другие значения, чем HKLM, то HKCU имеет приоритет. Шаг 3. Модификация ключей Reg-файла. Делаем автозамену веток HKEY_LOCAL_MACHINE на HKEY_CURRENT_USER И убеждаемся, что у нас все работает:
Ошибок чаще всего бывает две: 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\": Эти ветки нам не нужны:
[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Classes\CLSID\{54319578-F5A1-4BEF-B8A4-20E6F89ABB4A}] @="Calc.myCalc" [HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Classes\CLSID\{54319578-F5A1-4BEF-B8A4-20E6F89ABB4A}\Implemented Categories] [HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Classes\CLSID\{54319578-F5A1-4BEF-B8A4-20E6F89ABB4A}\Implemented Categories\{40FC6ED5-2438-11CF-A3DB-080036F12502}] [HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Classes\CLSID\{54319578-F5A1-4BEF-B8A4-20E6F89ABB4A}\InprocServer32] @="C:\\Users\\Alex\\Desktop\\ActXTest\\C alc.dll" "ThreadingModel"="Apartment" [HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Classes\CLSID\{54319578-F5A1-4BEF-B8A4-20E6F89ABB4A}\ProgID] @="Calc.myCalc" [HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Classes\CLSID\{54319578-F5A1-4BEF-B8A4-20E6F89ABB4A}\Programmable] [HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Classes\CLSID\{54319578-F5A1-4BEF-B8A4-20E6F89ABB4A}\TypeLib] @="{4D922142-997D-4403-A002-2387BCF4A07F}" [HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Classes\CLSID\{54319578-F5A1-4BEF-B8A4-20E6F89ABB4A}\VERSION] Одно но! После такой экзекуции, нам нельзя вручную (двойным кликом) вносить Reg-файл в реестр. Система примет такой запрос как от имени х64-процесса и переадресация не сработает. Поэтому нам нужно это делать из любого 32-битного приложения, коим есть VB6, например так:
а также успешно испытана на свежеустановленной Windows XP x32-bit. В приложении: скомпилированная библиотека, Reg-файл, Excel-файл и VB-проект (на выбор) с Shell-ом регистрации и процедурой вызова методов и свойств объекта Calc.dll. VBS-скрипт у меня не заработал , не знаю почему.Для корректной регистрации измените в Reg-файле путь
Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\SOFTWARE\Classes\Calc. myCalc] @="Calc.myCalc" [HKEY_CURRENT_USER\SOFTWARE\Classes\Calc. myCalc\Clsid] @="{54319578-F5A1-4BEF-B8A4-20E6F89ABB4A}" [HKEY_CURRENT_USER\SOFTWARE\Classes\CLSID \{54319578-F5A1-4BEF-B8A4-20E6F89ABB4A}] @="Calc.myCalc" [HKEY_CURRENT_USER\SOFTWARE\Classes\CLSID \{54319578-F5A1-4BEF-B8A4-20E6F89ABB4A}\Implemented Categories] [HKEY_CURRENT_USER\SOFTWARE\Classes\CLSID \{54319578-F5A1-4BEF-B8A4-20E6F89ABB4A}\Implemented Categories\{40FC6ED5-2438-11CF-A3DB-080036F12502}] [HKEY_CURRENT_USER\SOFTWARE\Classes\CLSID \{54319578-F5A1-4BEF-B8A4-20E6F89ABB4A}\InprocServer32] @="C:\\Users\\Alex\\Desktop\\ActXTest\\Cal c.dll" "ThreadingModel"="Apartment" [HKEY_CURRENT_USER\SOFTWARE\Classes\CLSID \{54319578-F5A1-4BEF-B8A4-20E6F89ABB4A}\ProgID] @="Calc.myCalc" [HKEY_CURRENT_USER\SOFTWARE\Classes\CLSID \{54319578-F5A1-4BEF-B8A4-20E6F89ABB4A}\Programmable] [HKEY_CURRENT_USER\SOFTWARE\Classes\CLSID \{54319578-F5A1-4BEF-B8A4-20E6F89ABB4A}\TypeLib] @="{4D922142-997D-4403-A002-2387BCF4A07F}" [HKEY_CURRENT_USER\SOFTWARE\Classes\CLSID \{54319578-F5A1-4BEF-B8A4-20E6F89ABB4A}\VERSION] @="1.0" [HKEY_CURRENT_USER\SOFTWARE\Classes\Inter face\{25E88292-036E-479D-B010-82EFB67A1001}] @="_myCalc" [HKEY_CURRENT_USER\SOFTWARE\Classes\Inter face\{25E88292-036E-479D-B010-82EFB67A1001}\ProxyStubClsid32] @="{00020424-0000-0000-C000-000000000046}" [HKEY_CURRENT_USER\SOFTWARE\Classes\Inter face\{25E88292-036E-479D-B010-82EFB67A1001}\TypeLib] @="{4D922142-997D-4403-A002-2387BCF4A07F}" "Version"="1.0" [HKEY_CURRENT_USER\SOFTWARE\Classes\TypeL ib\{4D922142-997D-4403-A002-2387BCF4A07F}] [HKEY_CURRENT_USER\SOFTWARE\Classes\TypeL ib\{4D922142-997D-4403-A002-2387BCF4A07F}\1.0] @="Calc" [HKEY_CURRENT_USER\SOFTWARE\Classes\TypeL ib\{4D922142-997D-4403-A002-2387BCF4A07F}\1.0\0] [HKEY_CURRENT_USER\SOFTWARE\Classes\TypeL ib\{4D922142-997D-4403-A002-2387BCF4A07F}\1.0\0\win32] @="C:\\Users\\Alex\\Desktop\\ActXTest\\Cal c.dll" [HKEY_CURRENT_USER\SOFTWARE\Classes\TypeL ib\{4D922142-997D-4403-A002-2387BCF4A07F}\1.0\FLAGS] @="0" [HKEY_CURRENT_USER\SOFTWARE\Classes\TypeL ib\{4D922142-997D-4403-A002-2387BCF4A07F}\1.0\HELPDIR] @="C:\\Users\\Alex\\Desktop\\ActXTest" на месторасположение файла Calc.dll на Вашем компьютере, на забывая при этом про двойные слеши \\. Стоит заметить, что при перекомпиляции DLL в среде VB6 происходит автоматическая регистрация библиотеки. Кроме того, все GUID и др. значения изменяются. Т.о. Reg-файл нужно создавать заново. В дальнейшем если версия DLL будет меняться планирую автоматизировать весь этот процесс написанием программы. Благо, исходник сканера уже есть ![]() Может конечно вся статья и зря, и есть более простой способ зарегистрировать Active-X Dll в среде текущего пользователя. С удовольствием выслушаю Ваши варианты и комментарии. | ||||||||||||||||||||
Метки activex dll регистрация
Размещено в Без категории
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 1
Комментарии
-
Обсуждение ведется в разделе Visual Basic.Запись от Dragokas размещена 10.09.2012 в 02:46

). А иначе выдает ошибку "Не удалось выполнить вызов DllRegisterServer. Код ошибки 0х80004005."
, не знаю почему.

