Почему Regasm помещает ProgId в HKEY_CURRENT_USER?

У меня есть две виртуальные машины, на которые я хочу (Wix) установить свое программное обеспечение. Один из них - это Windows XP SP2, а другой - Windows XP SP1. Ни один из них не использует домены, и у обоих есть локальный администратор с правами администратора.

Запуск RegAsm.exe для регистрации MyApp.dll на машине с SP3 помещает мой ProgId в папки:

HKEY_CLASSES_ROOT \ MyAppProgId

HKEY_LOCAL_MACHINE \ Программное обеспечение \ Классы \ MyAppProgId

при запуске на компьютере с пакетом обновления 2 (SP2) он помещается в папки:

HKEY_CLASSES_ROOT \ MyAppProgId

HKEY_CURRENT_USER \ Программное обеспечение \ Классы \ MyAppProgId

Я обнаружил это при попытке загрузить MyApp.dll из службы. Файл реестра, созданный с помощью RegAsm.exe, а также Heat.exe, похоже, обновляет HKEY_CLASSES_ROOT.

Кто-нибудь знает, что могло вызвать это?

РЕДАКТИРОВАТЬ: В итоге я обошел это, написав непосредственно в HKEY_LOCAL_MACHINE вместо HKCR - это включало ручное редактирование сгенерированного файла .reg или .wxs.


person Bringer128    schedule 11.04.2012    source источник


Ответы (1)


В старых настройках HKEY_LOCAL_MACHINE доступен для записи обычному пользователю, в более новых Windows (например, Windows 7) - нет. Может зависеть от конфигурации, типа учетной записи пользователя и т. Д.

Зарегистрированные классы переходят либо в HKEY_LOCAL_MACHINE\SOFTWARE\Classes (иногда с возможностью записи, как уже упоминалось), либо в HKEY_CURRENT_USER\Software\Classes (всегда с возможностью записи). Оба работают. Первый случай - подавляющее значение по умолчанию.

HKEY_CLASSES_ROOT на самом деле всего лишь представление, которое объединяет содержимое вышеупомянутых веток. Вот почему вы видите его в двух разных местах.

RegAsm кажется достаточно умен, чтобы определить состояние HKLM только для чтения, и вместо этого автоматически выбирает HKCU. Или есть какие-то параметры конфигурации, которые различаются между вашими виртуальными машинами.

Основное отличие состоит в том, что во втором случае dll можно использовать только под учетной записью пользователя, в которой вы ее зарегистрировали. Ваша служба, вероятно, работает под другой учетной записью, поэтому она не может загрузить dll на 2-й компьютер.

person Torben Klein    schedule 12.04.2012
comment
Спасибо. Есть идеи, какая проблема с конфигурацией может приводить к тому, что Regasm (или какие-либо обновления HKCR) записывает в HKCU вместо HKLM? - person Bringer128; 13.04.2012
comment
В проекте установки VS2005 есть параметр InstallAllUsers, который, кажется, влияет на RegAsm. Не могу подтвердить это, так как сейчас у меня нет VS. Лично я предпочитаю подход с использованием .reg-файлов, поскольку вы напрямую контролируете, какие изменения происходят с реестром, в отличие от несколько неясной работы Regasm / regsvr32. (Кстати, вы также можете создать файл .reg, который удаляет ветки, например, для удаления.) - person Torben Klein; 13.04.2012
comment
Да, я закончил тем, что модифицировал файл .reg, а затем регенерировал свой фрагмент Wix с помощью heat.exe. К счастью, Wix выполняет откат реестра, поэтому мне не о чем беспокоиться. - person Bringer128; 15.04.2012