WIX: удалить постоянные файлы с помощью специального действия в программных файлах в Windows 7? - PullRequest
1 голос
/ 18 ноября 2011

Мы распространили старую версию нашего установщика wix с некоторыми файлами, установленными как компоненты Permanent = "yes".Но теперь мы хотим попросить пользователя сохранить или удалить эти файлы на unistall.Эти файлы находятся в папке Program Files.Мы получаем на DELETE_ALL ответ пользователя.Это:

 <InstallExecuteSequence>
      <!-- more custom actions -->
      <Custom Action="DeleteFiles" Before="InstallFinalize">(NOT UPGRADINGPRODUCTCODE) AND (REMOVE="ALL") AND (NOT (DELETE_ALL=0))</Custom>
 </InstallExecuteSequence>
<CustomAction Id="DeleteFiles" ExeCommand='Company.CustomActions.ExeActions.exe' Directory="INSTALLDIR" Return="check" Impersonate="yes" Execute="immediate" />

Company.CustomActions.ExeActions.exe - это простое консольное приложение, которое удаляет эти файлы в C: \ Program Files (x86) \ Company \ Program1 с помощью манифеста с

* 1005.*

При выполнении .msi мы получаем следующие строки:

MSI (s) (20:88) [15:16:19:130]: MSI_LUA: Elevation required to install product, will prompt for credentials
MSI (s) (20:88) [15:16:21:798]: MSI_LUA: Credential Request return = 0x0
MSI (s) (20:88) [15:16:21:798]: MSI_LUA: Elevated credential consent provided. Install will run elevated

Или, если мы запускаем его из Administrator cmd.exe:

MSI (c) (24:F8) [12:35:32:530]: MSI_LUA: Setting AdminUser property to 1 because this is the client or the user has already permitted elevation

Мы пытаемся установить для нашего пользовательского DeleteFiles пользовательскийдействие устанавливает разные значения для Impersonate (да / нет) и Execute (немедленное / отложенное) без успеха на этом.

Далее мы пытаемся сделать это удаление компонентом с RemoveFiles или CustomAction, написанным на c #, отмеченномс атрибутом CustomActionAttribute, как и другие, которые мы используем.Также безуспешно.

    [CustomAction]
    public static ActionResult DeleteAll(Session session) { /*...*/ }

Или вызов из CustomAction в другой метод:

[PrincipalPermission(SecurityAction.Demand, Role = @"BUILTIN\Administrators")]
private static void DeleteFiles()  { /*...*/ }

Мы получаем исключение:

 Request for principal permission failed.
 at System.Security.Permissions.PrincipalPermission.ThrowSecurityException()
 at System.Security.Permissions.PrincipalPermission.Demand()
 at System.Security.PermissionSet.DemandNonCAS()
 at Company.CustomActions.DeleteFiles(Session session)
 at Company.CustomActions.DeleteALL(Session session)

Возможно реализовать функциюудалить постоянные файлы, установленные в предыдущей версии по требованию?Есть идеи?

Ответы [ 2 ]

1 голос
/ 18 ноября 2011

Пользовательское действие должно быть настроено на отложено с без олицетворения

<CustomAction Id="DeleteFiles" ExeCommand='Company.CustomActions.ExeActions.exe' Directory="INSTALLDIR" Return="check" Impersonate="no" Execute="deferred" />
0 голосов
/ 23 ноября 2011

Наконец, мы используем WixShellExec из двоичного WixCA, который мы использовали ранее (во время, а не в процессе выполнения) для запуска привилегированного приложения, устанавливая значение WixShellExecTarget непосредственно перед планированием каждого действия среза WixShellExec.

реальная проблема заключается в том, что этот способ не позволяет получать реальные ошибки пользовательских действий (не ошибок при вызове WixShellExec, а основных).На данный момент это действительный сценарий для нас.Таким образом, мы решили это следующим образом.

Пример:

<InstallExecuteSequence>
   <!-- more custom actions -->
  <Custom Action="SetLaunchDeleteAll" Before="InstallFinalize">(NOT UPGRADINGPRODUCTCODE) AND (REMOVE="ALL") AND (NOT (DELETE_ALL=0))</Custom>
  <Custom Action="DeleteFiles" Before="InstallFinalize">(NOT UPGRADINGPRODUCTCODE) AND (REMOVE="ALL") AND (NOT (DELETE_ALL=0))</Custom>
</InstallExecuteSequence>
<InstallUISequence>
 <!-- more custom actions -->
  <Custom Action="SetLaunchProperty" Sequence="9990">CUSTOM_CONDITIONS</Custom>
</InstallUISequence>
<CustomAction Id="LaunchApplication" BinaryKey="WixCA" DllEntry="WixShellExec" Execute="immediate" Impersonate="yes" Return="check" />
<!-- more custom actions -->
<CustomAction Id="DeleteFiles" BinaryKey="WixCA" DllEntry="WixShellExec" Execute="immediate" Impersonate="yes" Return="check" />
<CustomAction Id="SetLaunchProperty" Property="WixShellExecTarget" Value="[#Company.Program.exe]" />
<CustomAction Id="SetLaunchDeleteAll" Property="WixShellExecTarget" Value="[#Company.CustomActions.ExeActions.exe]" />
<UI>
  <Publish Dialog="MyExitDialog" Control="Finish" Order="1" Event="DoAction" Value="LaunchApplication">CUSTOM_CONDITIONS</Publish>
</UI>
<Property Id="WixShellExecTarget" Value="[#Company.CustomActions.ExeActions.exe]"/>

И метод DeleteAll () не декорирован с PrincipalPermissionAttribute, хотя манифест Company.CustomActions.ExeActions.exe действительно требует прав администратора(requiredExecutionLevel requireAdministrator).

При удалении и запросе удаления дважды отображается UAC (один раз для удаления и еще один раз для этих пользовательских действий) с моей локальной конфигурацией Windows для этих действий.

...