Подтвердить что ты не робот

Удалить ключи реестра под HKCU для каждой установки машины

Я создаю установщик perMachine с помощью WiX 3.6 для установки программного обеспечения, которое я не разработал. К сожалению, программное обеспечение создает некоторые ключи реестра под HKCU во время выполнения.

При удалении также должны быть удалены сами созданные ключи. Кажется, не так просто удалить эти ключи. Я "сражаюсь" с ICE57 и/или ICE38. Оба жалуются на соединение между данными perUser и perMachine.

Надеюсь, вы можете указать мне в правильном направлении по устранению этой проблемы.

4b9b3361

Ответ 1

Чтобы преодолеть ICE, вы должны перенести реестр для отдельных пользователей и использовать некоторые записи реестра как keyPath для этого компонента, то есть:

<Component Id='PerUserRegistry' Guid='*'>
  <RegistryValue Id="PerUserRegistry_KeyPAth" KeyPath="yes" Root="HKCU" Key="Software\[Manufacturer]\[ProductName]\[ProductCode]\PerUserRegistry" Name="[PackageCode]" Value="[ProductVersion]" Type="string" />
  <!--Other Per-user registry goes here-->
</Component>

Я полностью согласен с Кристофером: общепринятая практика оставлять данные для каждого пользователя при деинсталляции, но если удаление необходимо, то активная настройка - единственная реальная опция.

Сначала я предлагаю вам удалить их при установке или повторной установке вместо удаления, вам просто нужно добавить запись RemoveRegirty и Active Setup, то есть с помощью этого кода WiX:

<Component Id='ActiveSetup' Guid='*'>
  <RegistryValue Id="ActiveSetup00" Root="HKLM" KeyPath="yes" Key="SOFTWARE\SOFTWARE\Microsoft\Active Setup\Installed Components\[PackageCode]\" Name="StubPath" Value="msiexec /fup [ProductCode] /qb-!" Type="string" />
  <RegistryValue Id="ActiveSetup01" Root="HKLM" Key="SOFTWARE\SOFTWARE\Microsoft\Active Setup\Installed Components\[PackageCode]\" Value="[ProductName] [ProductVerion] Configuration" Type="string" />
</Component>
<Component Id='PerUserRegistryCleanup' Guid='*'>
  <RegistryValue Id="PerUserRegistry_KeyPath" Root="HKCU" KeyPath="yes" Key="SOFTWARE\SOFTWARE\Microsoft\Active Setup\Installed Components\[PackageCode]\" Name="StubPath" Value="msiexec /fup [ProductCode] /qb-!" Type="string" />
  <RemoveRegistryKey Id='PerUserRegCleanup' Root='HKCU' Action='removeOnInstall' Key='Key\To\Be\Removed'/>
</Component>

Примечание. Рекомендуется использовать [PackageCode] в ActiveSetup, поэтому с каждой новой версией (сборкой) пакета MSI вы добавляете отдельную запись (также см. мою последнюю заметку). Я использовал активный реестр для каждого пользователя в качестве ключевого пути, поэтому вы не запускаете его для текущего пользователя дважды.

Что касается удаления после удаления, Теперь, надеюсь, вам нужно удалить весь ключ, а не только некоторые значения. В любом случае, я бы создал пользовательское действие, чтобы добавить запись реестра для Active Setup во время удаления (или если таких ключей/значений много, создайте и разверните файл .CMD с ними и запустите его при удалении перед действием RemoveFiles, чтобы добавить все из них в реестр).

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

Итак, здесь код WiX для всего этого:

<CustomAction Id="CA_UninstallRegistryCleanUp" Directory="SystemFolder" ExeCommand="REG.exe ADD &quot;HKLM\SOFTWARE\Microsoft\Active Setup\Installed Components\MySoftName_CleanUp&quot; /v StubPath /d &quot;reg add ^&quot;HKCU\Key\To\Be\Removed^&quot; /va /f&quot; /f" Return="ignore" />
<InstallExecuteSequence>
  <Custom Action='CA_UninstallRegistryCleanUp' After='RemoveRegistryValues'>REMOVE~="ALL"</Custom>
</InstallExecuteSequence>

<Component Id='RegCleanup_Remover' Guid='*'>
  <RegistryValue Id="PerUserRegistry_KeyPAth" Root="HKLM" KeyPath="yes" Key="SOFTWARE\[Manufacturer]\[ProductName]\[ProductCode]\" Name="DummyKey" Value="[ProductVersion]" Type="string" />
  <RemoveRegistryKey Id='RegCleanup_Remover' Root='HKLM' Action='removeOnInstall' Key='SOFTWARE\Microsoft\Active Setup\Installed Components\MySoftName_CleanUp'/>
</Component>

Заключительные примечания: Там всего две небольшие проблемы со всеми этими средствами Active Setup: будьте осторожны на серверах Windows Terminal Server; и как только активная настройка была запущена для одного пользователя для текущего .MSI, он не будет запускаться снова, если вы решите переустановить тот же пакет, если вы не измените его PackageConde или не установите версию в разделе реестра ActiveSetup. Это темы для другого дня, дайте мне знать, если они будут уточнены.

И не забудьте добавить все перечисленные выше компоненты к некоторым функциям.

Ответ 2

Установщик Windows рассматривает данные пользователя, и лучше всего его не удалять. В любом случае, очень сложно попытаться удалить его, так как другие профили пользователей выходят за рамки/контекст. Теоретически можно написать собственное действие для перечисления профилей и загрузки кустов реестра, но в некоторых версиях Windows (Vista), которые не будут работать из-за ограниченных разрешений, предоставляемых службе установщика Windows.

Если вы действительно действительно должны удалять данные пользовательских действий при удалении, посмотрите на:

Active Setup Explained

Вам нужно будет оставить программу (например, exe), отметив постоянный компонент. Тогда вам понадобится настраиваемое действие для записи значения реестра во время удаления (поскольку установщик Windows не поддерживает это).

В процессе установки вы устанавливаете EXE, и во время удаления вы покидаете вас. Затем вы записываете в раздел реестра ActiveSetup, чтобы он запускал ваш EXE один раз для каждого последующего пользователя для входа в систему. Затем EXE удаляет значения реестра. Перезагрузите (вежливо), если необходимо, чтобы выгрузить расширения из проводника.

Но, честно говоря, для более совершенного приложения не потребуется все это.