Форум программистов, компьютерный форум, киберфорум
Наши страницы
Dragokas
Войти
Регистрация
Восстановить пароль
Оценить эту запись

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

Запись от Dragokas размещена 10.09.2012 в 02:45
Обновил(-а) Dragokas 06.07.2015 в 21:14

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

Благодаря замечательной статье COM в действии Catstail-a все удалось с первого раза.

За исключением проблем при регистрации DLL через Regsvr32, которой обычных прав оказалось недостаточно,
ведь она записывает значения в реестр в ветку HKLM.
А как известно, без регистрации подключить библиотеку к проекту ни поздним, ни ранним связыванием не получится.

Выходов из ситуации было 2:
1) Делать установщик, которому прописывать манифест повышенных прав (иконка со щитом), либо повторный запуск процесса от имени другого пользователя через runas. В любом случае буду получать предупреждения системы защиты.
2) Прописать вручную ветки реестра для текущего пользователя (HKCU), т.к. утилита Regsvr32 такой роскоши нам не дает.

Вторым способом я и занялся.

Шаг 1. Регистрация DLL с правами администратора, например через (.cmd) Batch-файл, или через запуск консоли CMD в строке поиска Ctrl+Shift+Enter.
Bash
1
2
Regsvr32.exe C:\Alex\Desktop\ActXTest\Calc.dll
::Ключ /s - Тихий режим
Шаг 2. Получение ключей реестра.
Вторая часть статьи 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\\Calc.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\\Calc.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\\Calc.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

И убеждаемся, что у нас все работает:
  • Отменяем регистрацию DLL:
    Bash
    1
    
    Regsvr32.exe /u C:\Alex\Desktop\ActXTest\Calc.dll
    (требует прав администратора через раз ). А иначе выдает ошибку "Не удалось выполнить вызов DllRegisterServer. Код ошибки 0х80004005."
  • Запускаем модифицированный Reg-файл
  • Перезапускаем процесс, откуда тестируем DLL (я использовал Excel VBA), код аналогичен и для VB6:
    Visual Basic
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    
    'Для раннего связывания -> Tools (VBA) Project (VB) -> Preferences -> Calc (поставить птичку)
    Sub Command1_Click()
    On Error GoTo ErrH
    'Dim C As Calc.myCalc 'раннее связывание
    Dim C As Object 'позднее связывание
    Dim v
     
    'Set C = New Calc.myCalc 'раннее связывание
     
    Set C = CreateObject("calc.mycalc") 'позднее связывание
     
    v = C.Calculate(7, 8, "*")
     
    Debug.Print v
     
    'C.Top = C.Height
    'C.Left = C.Width
     
    'C.Show
     
    Set C = Nothing
    Exit Sub
     
    ErrH:
    Debug.Print Err.Description
    End Sub
Убеждаемся, что присвоение объекта происходит корректно.
Ошибок чаще всего бывает две:
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\\Calc.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, например так:
Visual Basic
1
Shell "cmd /c reg.exe import e:\Dll.reg", vbHide
Команда выполнялась под учетной записью с ограниченными правами,
а также успешно испытана на свежеустановленной 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\\Calc.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\Interface\{25E88292-036E-479D-B010-82EFB67A1001}]
@="_myCalc"

[HKEY_CURRENT_USER\SOFTWARE\Classes\Interface\{25E88292-036E-479D-B010-82EFB67A1001}\ProxyStubClsid32]
@="{00020424-0000-0000-C000-000000000046}"

[HKEY_CURRENT_USER\SOFTWARE\Classes\Interface\{25E88292-036E-479D-B010-82EFB67A1001}\TypeLib]
@="{4D922142-997D-4403-A002-2387BCF4A07F}"
"Version"="1.0"

[HKEY_CURRENT_USER\SOFTWARE\Classes\TypeLib\{4D922142-997D-4403-A002-2387BCF4A07F}]

[HKEY_CURRENT_USER\SOFTWARE\Classes\TypeLib\{4D922142-997D-4403-A002-2387BCF4A07F}\1.0]
@="Calc"

[HKEY_CURRENT_USER\SOFTWARE\Classes\TypeLib\{4D922142-997D-4403-A002-2387BCF4A07F}\1.0\0]

[HKEY_CURRENT_USER\SOFTWARE\Classes\TypeLib\{4D922142-997D-4403-A002-2387BCF4A07F}\1.0\0\win32]
@="C:\\Users\\Alex\\Desktop\\ActXTest\\Calc.dll"

[HKEY_CURRENT_USER\SOFTWARE\Classes\TypeLib\{4D922142-997D-4403-A002-2387BCF4A07F}\1.0\FLAGS]
@="0"

[HKEY_CURRENT_USER\SOFTWARE\Classes\TypeLib\{4D922142-997D-4403-A002-2387BCF4A07F}\1.0\HELPDIR]
@="C:\\Users\\Alex\\Desktop\\ActXTest"
"C:\\Users\\Alex\\Desktop\\ActXTest"
на месторасположение файла Calc.dll на Вашем компьютере, на забывая при этом про двойные слеши \\.

Стоит заметить, что при перекомпиляции DLL в среде VB6 происходит автоматическая регистрация библиотеки. Кроме того, все GUID и др. значения изменяются. Т.о. Reg-файл нужно создавать заново.

В дальнейшем если версия DLL будет меняться планирую автоматизировать весь этот процесс написанием программы. Благо, исходник сканера уже есть

Может конечно вся статья и зря, и есть более простой способ зарегистрировать Active-X Dll в среде текущего пользователя. С удовольствием выслушаю Ваши варианты и комментарии.
Вложения
Тип файла: rar ActXTest.rar (43.6 Кб, 232 просмотров)
Размещено в Без категории
Просмотров 3528 Комментарии 1
Всего комментариев 1
Комментарии
  1. Старый комментарий
    Аватар для Dragokas
    Обсуждение ведется в разделе Visual Basic.
    Запись от Dragokas размещена 10.09.2012 в 02:46 Dragokas вне форума
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru