Wix отложил доступ к пользовательскому действию - PullRequest
0 голосов
/ 24 июня 2018

Справочная информация: клиент изменил название приложения. Приложение хранит файлы в папке AppData, и теперь эту папку необходимо скопировать под новым именем (и удалить старое).

У меня установлена ​​сборка MSI с Wix 3.6. Я не нашел стандартного способа копирования папки (только файл). Поэтому я пытался создать пользовательское действие, которое использует команду xcopy, но это кажется очень сложным.

Если я немедленно создаю CA и планирую его после InstallFinalize, это работает на WinXP, но на Win7 только при запуске MSI от имени администратора.

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

<CustomAction Id="CopyFolder_PropertyAssign" Property="CopyFolder" 
 Value="&quot;[SystemFolder]cmd.exe&quot; /c xcopy 
        &quot;[$(var.PlatformCommonAppDataFolder)]OldName&quot; 
        &quot;[$(var.PlatformCommonAppDataFolder)]NewName&quot; 
        /s /i /h /k /o /y" />
<CustomAction Id="CopyFolder" BinaryKey="WixCA" DllEntry="CAQuietExec" 
 Execute="deferred" Return="check" Impersonate="no" />

<Custom Action="CopyFolder_PropertyAssign" Before="InstallFinalize"></Custom>
<Custom Action="CopyFolder" After="CopyFolder_PropertyAssign"></Custom>

CAQuietExec:  Access denied
CAQuietExec:  Error 0x80070004: Command line returned an error.
CAQuietExec:  Error 0x80070004: CAQuietExec Failed

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

Или есть ли другие решения для этого (помимо создания exe-пакета)?

EDIT:

Папка находится под всеми пользовательскими данными приложения.

EDIT:

Это кажется невозможным. Выбранный обходной путь заключался в том, чтобы создать немедленный центр сертификации и направить пользователей к запуску установщика с правами администратора (или так должно быть в большинстве случаев). В любом случае спасибо за помощь!

Ответы [ 2 ]

0 голосов
/ 24 июня 2018

Отложенная копия настраиваемого действия в AppDataFolder, вероятно, дает сбой, потому что вы запускаете отложенное и с системной учетной записью, поэтому он пытается получить доступ к AppDataFolder пользователя для системной учетной записи.Обратите внимание, что 0x80070004 не запрещен доступ, это "Система не может открыть файл."

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

Как указывает Стейн, это действительно должно быть сделано приложением при первом запуске новой версии.Миграция данных действительно является проблемой приложения, которая должна решаться в приложении, а не перегружать установку.Помимо трудностей, с которыми вы столкнулись, существуют также потенциальные проблемы, если при установке происходит сбой и происходит откат (восстановление удаленных файлов?) И, возможно, другие непредвиденные ситуации.

0 голосов
/ 24 июня 2018

Последовательность запуска приложения : если это userprofile files - другими словами, доступная для записи пользователю, запускающему приложение, - тогда гораздо лучшевыполните эту очистку в последовательности запуска приложения .Crucially this will make the operation run for every users, and not just the user installing the setup.Распространенная ошибка - забыть сделать переименование для всех пользователей на коробке.Предполагается, что это файлы для каждого пользователя (копии для каждого пользователя), а не общие файлы для всех пользователей в %ALLUSERSPROFILE% (только для записи для пользователей с правами администратора).

Сложность MSI: Пожалуйста, не делайте этого в настройках.MSI очень сложен с олицетворением и поведением во время выполнения, что и вызывает таинственные сообщения об ошибках, которые вы видите.Нет абсолютно никакой причины делать это в настройке, если это можно сделать с правами пользователя в последовательности запуска приложения. Вы просто переименовываете папку при запуске приложения, что должно сделать это? Код запуска приложения намного проще реализовать и впечатляюще проще отладки чем пользовательские действия (особенно пользовательские действия в отложенном режиме).При необходимости вы также можете предоставить интерактивные сообщения об ошибках (в отличие от ошибок, записанных в журнал - или вообще без журнала).

Реализация : Очевидно, остерегайтесьвведение ошибок кода запуска приложения, возможно, установив флаг в реестре после завершения переименования для данного пользователя - чтобы отключить выполнение этой операции переименования более одного раза.Перемещающиеся профили могут вызвать проблемы, убедитесь, что вы настроили операцию на один компьютер - по крайней мере.Вы также можете написать флаг в раздел без роуминга иерархии папок appdata?Это, вероятно, лучше.Конечно, на самом деле.Не должно вызывать проблем с роумингом.

Вызовы : Всего пара вызовов:

  • Locks? Будут ли какие-либо блокировки файлов / папок при запуске приложения?Может быть?Поймать исключение, сообщить пользователю, завершить работу и повторить попытку?Отказаться от запуска, пока не произойдет переименование?Приемлемо?
  • Old application launch?: это важно?Некоторые люди пробуют символические ссылки - мои два цента - это работа дьявола :-).Наверное, вопрос в том, что произойдет, если старое приложение не найдет свои файлы? Оно даже запускается?Второй вопрос: имеет ли значение, что старое приложение не работает должным образом после «очистки»?
...