WedX - журнал о программировании и компьютерных науках

Используйте права администратора для настраиваемого действия WIX


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 и генерирует исключение, потому что пользователь не может писать в ней.


  • Вам нужно предоставить больше информации. Какие конкретные ошибки вы получаете? Вы проверили свой код настраиваемого действия, чтобы убедиться, что проблема не в вашей конфигурации Wix? Почтовый индекс и / или соответствующие разделы вашего файла .wxs, чтобы мы действительно могли вам помочь. 27.02.2014
  • Ошибка заключается в том, что пользователь не может писать в папке программных данных в строке File.WriteAllText (myini, myiniContent). Я отлаживаю свое настраиваемое действие, используя System.Diagnostics.Debugger.Launch () поверх моего метода. 27.02.2014
  • Итак, вы подтвердили, что ваш код CA определенно вызывается? Еще раз, пожалуйста, отредактируйте свое сообщение, включив соответствующий код / ​​конфигурацию, чтобы мы могли вам больше помочь. 27.02.2014
  • Да, это так. Хорошо, я добавляю больше информации, спасибо. 27.02.2014
  • Может быть проблема в том, что нужно отложить мою настройку? 27.02.2014
  • @workat: Я обновил ваш вопрос, указав другим пользователям с той же проблемой, что им следует по возможности избегать настраиваемых действий - многие пользователи сталкиваются с этой проблемой из-за аналогичных проблем. Проголосуйте за поддерживающие ответы и благодарим за установку тега принятого ответа. Это облегчит другим пользователям понимание обсуждения позже. Добро пожаловать в сообщество, мы рады помочь. 28.02.2014
  • Аналогичная проблема: Как проверить, существует ли ini-файл с помощью Wix Набор инструментов 03.08.2014

Ответы:


1

Ознакомьтесь с этой веткой, чтобы узнать, как использовать встроенную поддержку MSI для записи в файлы INI: Wix изменяет существующий ini-файл

Дополнительная ссылка: https://wixtoolset.org/documentation/manual/v3/xsd/wix/inifile.html

27.02.2014
  • Если вы перезаписываете ini-файл общей базы данных, вы рискуете стереть другие настройки базы данных. То же самое произойдет, если вы попытаетесь перезаписать весь файл. IniFile позаботится обо всем слиянии, но убедитесь, что вы хорошо протестировали. В частности, вы должны протестировать удаление. 28.02.2014

  • 2

    Насколько я могу судить, здесь есть две проблемы:

    1. Во-первых, необходимо отложить CA, если он impersonate = "no", и неясно, что вы это сделали.

    2. Вторая проблема заключается в том, что ProgramData - это понятие профиля пользователя. Например, он находится в папке C: \ Users \ в моей системе. Если вы работаете с impersonate = "no", вы работаете с системной учетной записью, поэтому он попытается записать в какую-то странную (несуществующую) папку C: \ Users \ System.

    У вас может быть проблема дизайна в том, что вы говорите, что вам нужны повышенные привилегии пользователя для записи в эту папку, но вы не можете повысить их, если не будете отложены с привилегиями системной учетной записи. Возможно, вам придется описать точную проблему, которую вы пытаетесь решить, чтобы увидеть, есть ли другой способ.

    27.02.2014
  • Согласен. Проблема 1 - техническая деталь, проблема 2 - недостаток дизайна. Я лучше переделаю приложение, чем буду работать над исправлением технических деталей развертывания. Смотрите мой ответ ниже - немного поторопился, но вы поняли. 27.02.2014
  • Мне нужно написать файл mysql ini в C: \ ProgramData \ MySQL \ data. 27.02.2014
  • Для этого вы используете таблицу IniFile файла MSI. В комплекте с поддержкой отката и слияния с существующими значениями. 27.02.2014

  • 3

    Лучший вариант: переделайте свое приложение так, чтобы он записывал этот ini-файл как файл для каждого пользователя (любой пользователь может писать в свой профиль пользователя) при запуске приложения из внутренних значений по умолчанию в Сама exe. Также решает проблему развертывания.

    Что касается того, что происходит в контексте вашего развертывания: установщик Windows выполняет только часть установки как LocalSystem - то, что называется транзакцией установки. Остальная часть настройки запускается от имени пользователя, запускающего MSI, и это включает в себя всю последовательность пользовательского интерфейса, в которую вы добавили свое настраиваемое действие.

    Попробуйте установить отложенное действие, запланируйте его до InstallFinalize и установите для олицетворения значение no.

    Что касается управления данными для каждого пользователя, см. Этот пост по несколько другой теме, чтобы узнать, как обрабатывать данные для каждого пользователя, которые требуют управления между развернутыми версиями приложения: https://forum.installsite.net/index.php?showtopic=21552

    27.02.2014
  • Мне нужно написать файл mysql ini в C: \ ProgramData \ MySQL \ data. 27.02.2014
  • В этом случае вы не можете записать файл ini для каждого пользователя, и лучшим вариантом было бы использовать функцию MSI IniFile, как описано в моем другом ответе. 28.02.2014
  • Новые материалы

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..


    Для любых предложений по сайту: [email protected]