2010-03-25 3 views
3

Установщик, который я пишу с помощью WiX 3.0, использует элемент RegistryValue для изменения существующего значения реестра (первоначально написанного нашим основным продуктом). Я пытаюсь выяснить способ восстановления значения реестра, когда пользователь удаляет мою утилиту. Я бы хотел избежать использования настраиваемого действия, но это может быть единственным средством обращения? ТИА.Как моя WiX-версия может восстановить значение реестра?

ответ

3

Я сделал это. Представляемое значение реестра - это приложение, связанное с расширением файла, но это может быть любое значение реестра.

Моя первая идея состояла в том, чтобы использовать «настраиваемое действие» для установки и удаления, чтобы сохранить и восстановить соответственно состояние regy. Это казалось достаточно простым.

Я создал проект установки в VS2008 и создал CA как файлы javascript. Скрипт «on install» схватил существующее значение regy и спрятал его в известное место. Скрипт «on uninstall» будет выглядеть в известном месте, а затем помещать найденное значение обратно в исходное местоположение. Легко, правда?

Существовали две проблем:

  1. скрипт, который бежал во время установки, чтобы сохранить уже существующие значения реестра, запускается после того, реестр уже был обновлен со значениями для вновь установленной вещи , Таким образом, он сохранил новую настройку вместо настройки, которая была там до запуска MSI. Не полезно.

  2. Сценарий, который запускается во время удаления, запускается ПОСЛЕ значений реестра и фактически всего поддерева каталога,
    были удалены. Включая спрятанную стоимость. Так что оно потеряло свое состояние.


Чтобы решить, что я написал another script that re-orders the custom actions так они работают в надлежащее время.

На самом деле есть еще один поворот. Очевидно, что сценарий «Восстановить» (на ) не будет работать, если он запущен после того, как записи реестра для приложения были удалены. Я не могу вспомнить сейчас, почему ... но я также решил, что этот скрипт не смог запустить до этого. Так или иначе, это тоже не сработало.

Итак, я модифицировал MSI для запуска сценария восстановления дважды. В фазе 1 он переносит сохраненное значение на «автостоянку» в реестре. Затем ключи и значения приложения в реестре удаляются, но автостоянка остается. В фазе 2 , за пределами транзакционной защиты, сценарий восстановления извлекает состояние с автостоянки, восстанавливает ассоциацию файлов, а затем удаляет парковку.

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

Как это работает в области развития:

  • установить on install и on uninstall СА в проекте VS
  • построить проект установки VS
  • запустить скрипт после обработки, который изменяет MSI.

При использовании MSI это немного сложнее, чем я изначально думал, но он работает.

Если вы используете WiX, у вас может быть больше контроля над временем и порядком шагов, поэтому может не понадобиться этот этап последующей обработки.


Наконец, вы сказали, что хотите избежать CA. Для меня CA избегают, потому что их мучительно производить на C++, а их создание в .NET часто неуместно. Но довольно просто использовать Javascript для CA. Некоторые люди думают script is the wrong tool for the CA job. Я думаю, что это неправильно. I think script is a very good tool for this purpose. И как только вы сможете принять скрипт как хороший инструмент, вам не нужно держать нос в создании пользовательского центра сертификации.

+0

Спасибо! Я ценю, что вы делитесь своим опытом с той же проблемой в своем ответе. Это очень полезно, и я понял, что писать CA первого типа - это, вероятно, лучший способ справиться с этим за время, которое у меня есть. Ваш сценарий впечатляет (!), Но я не собираюсь так сильно работать. :-) Поскольку я использую WiX, я посмотрю, смогу ли я получить CA + DLL для правильной работы. С уважением, Thomas – 2010-03-25 22:01:18

+1

о скрипте. CA: вы были бы удивлены, сколько магазинов там просто отключает инфраструктуру хостов Windows для обеспечения безопасности. Я обнаружил это с трудом, когда я написал свой первый пользовательский CA в скрипте для одного из наших установщиков. –

+0

Я понятия не имел ...? – Cheeso

0

Таблица реестра неспособна записать значение реестра во время удаления, поэтому правильно, что это необходимо сделать с помощью настраиваемого действия. Я придерживаюсь мнения, что использование скрипта плохое. Независимо от того, хотите ли вы слушать, зависит от вас. Я могу сказать вам, что на днях меня вызвали, чтобы решить проблему, когда некоторые из них писали CA-сервер vbscript, который терпел неудачу, поскольку объект файловой системы был незарегистрирован как часть процесса блокировки безопасности.

Я предлагаю C++ или C#/DTF в зависимости от ваших потребностей.

0

Столкнувшись с подобной проблемой, необходимо обновить значение реестра при установке и восстановлении до предыдущего значения при удалении. Единственное возможное решение - создать для этого настраиваемое действие?

Я нашел расширение для WiX, который имеет fucntions для этой цели link to wix extensions

Смежные вопросы