Как разрешить редактируемые файлы конфигурации .Net с помощью MSIX?

Я пытаюсь помочь перенести службу .Net на более современную версию .Net (возможно, Core) и использовать установщик MSIX. В приложении есть несколько файлов конфигурации, сгенерированных компилятором (в исходном коде это app.config, но при компиляции они становятся * .exe.xml), они устанавливаются в файл программы рядом с двоичными файлами и вспомогательным приложением GUI, а также приложением. сам может изменить их, чтобы изменить поведение службы (порт, IP, сертификат TLS и т. д.).

Запрещается запись в C: \ Program Files \ WindowsApps \ имя_пакета. Запрещается запись в папке C: \ Program Files \ WindowsApps \ имя_пакета.

Проблема, с которой я столкнулся, заключается в том, что установщик MSIX делает так, что файлы в его изолированной версии Program Files не могут быть записаны в (см. выше). Это означает, что это приложение не может быть настроено, поэтому я пытаюсь выяснить не только, как снова сделать приложение настраиваемым, но и как Windows хочет обрабатывать конфигурацию приложения.

Прямо сейчас кажется, что есть два общих подхода к этому:

  1. записать данные конфигурации в папку AppData / local учетной записи службы
  2. попробуйте имитировать поведение /etc/Myservice в другой папке. (имеется в виду локальный общесистемный каталог, в котором хранятся данные конфигурации для службы)

Если вы предлагаете №1, ответьте на следующие дополнительные вопросы:

  1. Как переместить файлы конфигурации приложения в каталог файлов конфигурации пользователя
  2. как администратор с обычной учетной записью может изменить файл конфигурации в папке AppData учетной записи службы с помощью упомянутого вспомогательного приложения с графическим интерфейсом пользователя? (нужно ли им разрешить настольный доступ к учетной записи службы, войти в систему и запустить графический интерфейс)?

Если вы предлагаете №2:

  1. Где, по вашему мнению, существует этот каталог (в частности, где это разрешено в MSIX)?
  2. Как мне сказать приложению .Net, что файлы находятся не рядом с ним? Могу я просто использовать AppData.CurrentDomain.SetData?

person Liam Kelly    schedule 14.12.2020    source источник
comment
Дело не в MSIX. Файлы приложения не должны быть доступны для редактирования, независимо от того, хранятся ли они в Program Files или где-либо еще, где хранятся приложения UWP. Windows обеспечивает это с 1990-х годов, делая Program Files доступным только для чтения. В более поздних версиях попытки некорректно работающих приложений писать туда перенаправляются в другие папки.   -  person Panagiotis Kanavos    schedule 15.12.2020
comment
Редактируемые файлы конфигурации никогда не хранятся в папке приложения, будь то Program Files или где-либо еще хранятся приложения UWP. В всех случаях приложения должны сохранять свои редактируемые данные в %APPDATA% или %LOCALAPPDATA% для общих настроек или %USERAPPDATA% для пользовательских данных. Фактический путь к специальной папке можно получить с помощью Environment.GetFolderPath   -  person Panagiotis Kanavos    schedule 15.12.2020
comment
Это означает, что ничего не изменилось. Ни одно приложение не может быть настроено путем перезаписи его exe.config для начала. Даже приложения, которые так думали, перенаправлялись самой ОС. Поскольку вы используете ASP.NET Core, вы можете легко хранить файлы настроек, где захотите, и заставлять их переопределять настройки, хранящиеся вместе с приложением.   -  person Panagiotis Kanavos    schedule 15.12.2020


Ответы (1)


Что ж, служба, запущенная в системной учетной записи, одинакова для всех пользователей, поэтому я бы сказал, что CommonApplicationData - лучшая папка для хранения ее настроек, а не appdata. Эта папка легко доступна как для вашей службы, так и для любого администратора, которому необходимо развернуть настраиваемый файл конфигурации.

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

Теперь во второй части вам нужно настроить код для загрузки файла конфигурации с настраиваемого пути вместо того, чтобы искать его рядом с EXE. Я не эксперт по .NET, но после быстрого поиска я нашел следующее:

Современный подход к развертыванию настроек приложений

Мне непонятно, как ваши клиенты используют вспомогательный инструмент GUI для настройки файла конфигурации. Это просто инструмент, который используется кем-то из ИТ-отдела для создания файла конфигурации, а затем они будут копировать этот файл и развертывать его на машинах конечных пользователей с помощью файла MSI / MST (или с помощью какого-либо другого пользовательского метода развертывания )?

Если ваше приложение развертывается только ИТ-специалистами, вы можете попробовать другое более простое (и очень элегантное) решение для предоставления ему настраиваемого файла конфигурации, который на самом деле не требует каких-либо изменений кода.

Вы по-прежнему можете оставить файл конфигурации рядом с EXE в ProgramFiles и проинструктировать ИТ-группы, развертывающие приложение, использовать Пакет модификации MSIX для развертывания настраиваемого файла конфигурации, созданного вашим помощником графического интерфейса. (проверьте ссылку, приведенную выше, в качестве примера - с видеоверсией в конце статьи).

Примечание. ИТ-группы могут использовать несколько бесплатных или платных инструментов для создания пакетов модификаций MSIX.

Конечно, вашему вспомогательному инструменту GUI по-прежнему необходимо сгенерировать этот настроенный файл конфигурации в папке, где это разрешено, поскольку он больше не может писать в ProgramFiles. Так что на самом деле вам нужно немного изменить свой код и в этом сценарии.

person Bogdan Mitrache    schedule 15.12.2020
comment
.NET Core не имеет .config файла, он может загружать настройки от нескольких поставщиков (включая базы данных, переменные среды и т. Д.), Хранящиеся по любому пути, доступному для исполняющей учетной записи. Хранить данные в CommonApplicationData теперь так же просто, как указать правильный путь. Провайдеры могут переопределять предыдущие настройки, поэтому никаких преобразований или настроек не требуется. - person Panagiotis Kanavos; 15.12.2020
comment
@PanagiotisKanavos - все ли в этой конфигурации обрабатываются AppDomain API для каждой версии .Net? - person Liam Kelly; 16.12.2020
comment
@LiamKelly, это не имеет значения, потому что вам вообще не следует пытаться писать exe.config. Кроме того, ASP.NET Core не имеет файлов .config. Вам не нужно ничего изменять, просто сохраните дополнительные настройки в доступном для записи месте и убедитесь, что вы загружаете их после поставщиков, которых хотите переопределить. Учитывая значения по умолчанию (appsettings.json, appsettings. {Env} .json, переменные evn, командная строка), простое использование AddJsonFile, указывающего на файл JSON в CommonApplicationData, может переопределить предыдущие настройки. Так же, как appsettings.Production.json отменяет appsettings.json - person Panagiotis Kanavos; 16.12.2020