Ответ 1
Документация wix здесь объясняет атрибут Impersonate:
Этот атрибут указывает, должен ли установщик Windows, который выполняет роль LocalSystem, олицетворять пользовательский контекст пользователя установки при выполнении этого пользовательского действия. Обычно значение должно быть "да", за исключением случаев, когда пользовательские действия требуют повышенных привилегий для внесения изменений в машину.
Вам также необходимо понять разницу между отложенными и немедленными пользовательскими действиями. См. Атрибут Execute на той же странице справки:
Этот атрибут указывает планирование пользовательского действия. Это значение атрибута должно быть одним из следующих:
отложила Указывает, что пользовательское действие выполняется в script (возможно, с повышенными привилегиями). немедленным Указывает, что пользовательское действие будет выполняться в течение обычного времени обработки с правами пользователя. Это значение по умолчанию.
В настоящее время ваше пользовательское действие является немедленным, что означает, что он работает с привилегиями пользователя. См. этот пост в блоге для получения подробной информации, но особенно:
Любые немедленные пользовательские действия олицетворяют вызывающего пользователя. До Windows Vista это не было проблемой, так как на данный момент у установочного административного пользователя был привилегированный токен. С введением UAC в Windows Vista административный токен по умолчанию с включенным UAC является фильтрованным токеном и не имеет всех привилегий. Поскольку немедленные пользовательские действия не должны изменять состояние машины - только для сбора данных состояния и планирования пользовательских действий для запуска отложенных - это все равно не должно быть проблемой. В конце концов, на этом этапе генерация сценариев установки и отката - это все, что должно продолжаться.
Вы никогда не должны изменять состояние машины с помощью немедленного пользовательского действия. Используйте отложенную, и держите себя за другого, и она должна работать:
<CustomAction Id='comReg' Directory='INSTALLLOCATION' Execute='deferred' Impersonate='no' ExeCommand='"[NETFRAMEWORK40CLIENTINSTALLROOTDIR]regasm.exe" "[INSTALLLOCATION]EAWordImporter.dll" /codebase' Return='check' />
EDIT. Запланируйте пользовательское действие с помощью элемента InstallExecuteSequence:
<InstallExecuteSequence>
<Custom Action='comReg' Before='InstallFinalize'/>
</InstallExecuteSequence>