Метод Configuration.Save выдает ошибку несанкционированного доступа, когда файл конфигурации помещается в перенаправленную папку
Я реализовал приложение winform. Я сохраняю пользовательские настройки приложения в файле конфигурации с помощью класса конфигурации. Я сохраняю exe вместе с файлом конфигурации в папке
C:\Users\\AppData\Local
Это нормально работает в обычном случае, но я сталкиваюсь с проблемой в тех случаях, когда пользователь перенаправил папку Appdata на какой-либо адрес сервера. В этом случае я получаю исключение:
Попытка выполнить несанкционированную операцию.
Я нашел несколько похожих вопросов здесь, но ни на один из них нет удовлетворительных ответов. Я попытался удалить файл конфигурации перед запуском команды Configuration.Save, но это дает исключение:
Файл конфигурации был изменен другой программой.
Итак, как мне решить эту проблему. Вот мой код для обновления файла конфигурации:
string exePath = Path.Combine(Path.GetDirectoryName(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)), @"Local\<folder name>\<exe file name>");
Configuration configFile = ConfigurationManager.OpenExeConfiguration(exePath);
if (configFile.AppSettings.Settings[key] != null)
{
configFile.AppSettings.Settings.Remove(key);
}
if (param)
{
configFile.AppSettings.Settings.Add(key, value);
}
configFile.Save(ConfigurationSaveMode.Modified);
Вот трассировка стека для исключения:
at System.Security.AccessControl.Win32.SetSecurityInfo(ResourceType
type, String name, SafeHandle handle, SecurityInfos securityInformation, SecurityIdentifier owner, SecurityIdentifier group, GenericAcl sacl, GenericAcl dacl)
at System.Security.AccessControl.NativeObjectSecurity.Persist(String
name, SafeHandle handle, AccessControlSections includeSections, Object
exceptionContext)
at System.Security.AccessControl.NativeObjectSecurity.Persist(String
name, AccessControlSections includeSections, Object exceptionContext)
at System.Security.AccessControl.NativeObjectSecurity.Persist(String
name, AccessControlSections includeSections)
at System.Security.AccessControl.FileSystemSecurity.Persist(String
fullPath)
at System.IO.File.SetAccessControl(String path, FileSecurity fileSecurity)
at System.Configuration.Internal.WriteFileContext.DuplicateTemplateAttributes(String source, String destination)
at System.Configuration.Internal.WriteFileContext.DuplicateFileAttributes(String source, String destination)
at System.Configuration.Internal.WriteFileContext.Complete(String
filename, Boolean success)
at System.Configuration.Internal.InternalConfigHost.StaticWriteCompleted(String
streamName, Boolean success, Object writeContext, Boolean assertPermissions) at System.Configuration.Internal.InternalConfigHost.System.Configuration.Internal.IInternalConfigHost.WriteCompleted(String streamName, Boolean success, Object writeContext, Boolean assertPermissions)
at System.Configuration.Internal.InternalConfigHost.System.Configuration.Internal.IInternalConfigHost.WriteCompleted(String streamName, Boolean success, Object writeContext)
at
System.Configuration.Internal.DelegatingConfigHost.WriteCompleted(String streamName, Boolean success, Object writeContext)
at System.Configuration.UpdateConfigHost.WriteCompleted(String
streamName, Boolean success, Object writeContext)
at System.Configuration.MgmtConfigurationRecord.SaveAs(String filename,
ConfigurationSaveMode saveMode, Boolean forceUpdateAll)
at System.Configuration.Configuration.SaveAsImpl(String filename, ConfigurationSaveMode saveMode, Boolean forceSaveAll)
at UtilityClasses.ConfigurationHandler.UpdateConfigFile(String key, String value, Boolean param)
2 ответа
У меня был очень похожий опыт с изменением файла конфигурации, хранящегося на сетевом ресурсе, используя ConfigurationManager
,
Это отсекает, что Configuration.Save
Первоначально создает временный файл в том же месте с желаемым доступом, установленным на Write DAC (Write Access Access Control).
Это даже говорит так в документации:
Когда в списке ACL (Access Control List) каталога, содержащего файл конфигурации, указан "Владелец-создатель", текущий пользователь "Сохранить" становится новым владельцем файла и наследует разрешения, предоставленные "Владельцу-создателю". Это приводит к повышению привилегий для текущего пользователя и удалению привилегий для предыдущего владельца.
Единственный обходной путь, который я смог найти в своей среде, - это скопировать конфигурацию в локальный каталог, локально изменить файл и затем скопировать его обратно.
У вас есть два способа решить эту проблему:
1. Предоставьте общий доступ к сетевой папке, чтобы она не авторизовалась для пользователей той же сети.
2. Используйте учетные данные пользователя для прохождения авторизации и подключения к сетевому пути.
Обходные пути
Проверьте атрибут конкретного пользователя в общей папке. у него может отсутствовать атрибут WriteExtended.
Отметьте создателя общей папки, которая наследует все права от создателя.
Проверьте, можете ли вы изменить конфигурацию вашей общей папки на папку, отличную от c: drive.