Обновления, внесенные в конфигурацию приложения, корректно читаются только в Windows 7, когда приложение запускается от имени администратора. - PullRequest
1 голос
/ 01 сентября 2011

У нас есть приложение, созданное для платформ Windows Mobile и Windows, с использованием Visual Studio 2005. У нас есть обе версии этого приложения, разработанные с использованием единой базы кода, чтобы попытаться уменьшить дублирование кода.Одна из проблем, с которой мы столкнулись, заключалась в том, что ConfigurationManager был недоступен для платформы Windows Mobile.Мы решили эту проблему, создав собственный ConfigurationManager, который считывает и записывает параметры в файл «Application.exe.config» в папке «Program Files».Таким образом, и наша версия для Windows, и наша версия для Windows Mobile используют один и тот же пользовательский ConfigurationManager.

Это хорошо работало в Windows XP и Windows Server 2003, но в Windows 7 мы столкнулись с проблемой, и я не знаю, как ее обойти.Когда мы вносим изменения в файл конфигурации (что мы можем сделать, только скопировав его в другую папку, изменив его и затем скопировав обратно ... в противном случае мы получаем сообщение «Отказано в доступе», когда мы пытаемся сохранить наши изменения непосредственно впапка Program Files), изменения, которые мы вносим, ​​отражаются, только если мы запускаем приложение от имени администратора.Если мы запускаем приложение как обычный пользователь, настройки по умолчанию всегда отображаются.Мы подозреваем, что это проблема безопасности Windows 7, но кто-то может объяснить, почему это происходит?Как мы можем изменить настройки, чтобы они также применялись, когда приложение запускается как обычный пользователь?

Ответы [ 2 ]

3 голосов
/ 01 сентября 2011

Windows 7 требует повышенных привилегий для нескольких папок, включая программные файлы.Не стоит пытаться обойти это.

Поскольку вы используете нестандартное решение, одним из вариантов является размещение вашего файла конфигурации в% APPDATA% \ yourproduct, что может быть достигнуто с помощью

var appDataFolder = Path.Combine(Environment.SpecialFolder.ApplicationData, product);

Лучшим решением, вероятно, является использование другогоМенеджеры конфигурации для разных платформ.Не может ли быть применена какая-то абстрактная фабрика ?

1 голос
/ 01 сентября 2011

Я подозреваю, что ваше приложение пыталось записать в файл конфигурации хотя бы один раз, работая без повышенных прав и без манифеста.Это сделало папку «файлы совместимости» для вашего файла конфигурации.Когда вы бежите без поднятия, это выглядит там сейчас.(См. http://www.gregcons.com/KateBlog/FindingFilesYoureSureYouWrote.aspx для скриншотов того, как вы можете это подтвердить.)

Если все, что вам нужно, это для человека или какой-то служебной программы, которую вы написали, которая может работать с повышенными правами, чтобы иметь возможность редактироватьКонфигурационный файл, вы можете оставить его там, где он есть, и поместить манифест в ваше приложение для предотвращения виртуализации.См. http://www.gregcons.com/KateBlog/AddingAManifestToAVistaApplication.aspx для образца манифеста.Этот пост в блоге расскажет вам, как встроить манифест, но вам не нужно, внешний манифест будет работать.Если ваше приложение - foo.exe, назовите манифест foo.exe.manifest и поместите его в ту же папку.Это предотвратит виртуализацию и заставит приложение читать «настоящий» файл конфигурации.

Если изменение файла конфигурации будет обычным повседневным явлением, не пишите файл в разделе Program Files.AppData - хороший выбор.

...