Glytzhkof: Этот вопрос относится к общей проблеме для новых пользователей MSI, убеждению, что нужно настраиваемое действие для чего-то, что MSI поддерживает изначально, с помощью функции, о которой они не знают.
В этом случае таблица IniFile в MSI, которая позволяет слияние, откат и обновление общих файлов Ini в системе. . Все обновления файлов Ini должны выполняться с помощью этой таблицы, поскольку вы получаете множество функций бесплатно и будете соответствовать всем рекомендациям MSI.
Всегда избегайте настраиваемых действий, если есть способ добиться того же эффекта с помощью встроенных функций.
У меня есть пользовательское действие C # на моем WIX msi.
Когда для запуска msi требуется учетная запись администратора, и все работает нормально, за исключением моего пользовательского действия, он не может записывать внутри папки программных данных.
Я установил impersonate="no"
в соответствии со ссылкой на wix:
Этот атрибут указывает, должен ли установщик Windows, который выполняется как LocalSystem, олицетворять пользовательский контекст устанавливающего пользователя при выполнении этого настраиваемого действия. Обычно значение должно быть «да», за исключением случаев, когда настраиваемому действию требуются повышенные привилегии для применения изменений к машине.
Но не работает.
Это моя конфигурация настраиваемого действия:
<CustomAction
Id="MyCustomActionCA"
BinaryKey="mycustomactionDLL"
DllEntry="MyCustomAction"
Execute="immediate" Return="check" Impersonate="no" />
<InstallUISequence>
<Custom Action="MyCustomActionCA" After="CustomDialog1">NOT Installed</Custom>
</InstallUISequence>
MyCustomAction
запускается после закрытия CustomDialog1
, и это нормально, мой код работает нормально, но в MyCustomAction
у меня есть такая строка кода:
File.WriteAllText(mypath, mycontent);
mypath
обращается к папке ProgramData
и генерирует исключение, потому что пользователь не может писать в ней.