Метод 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. Используйте учетные данные пользователя для прохождения авторизации и подключения к сетевому пути.

Обходные пути

  1. Проверьте атрибут конкретного пользователя в общей папке. у него может отсутствовать атрибут WriteExtended.

  2. Отметьте создателя общей папки, которая наследует все права от создателя.

  3. Проверьте, можете ли вы изменить конфигурацию вашей общей папки на папку, отличную от c: drive.

Другие вопросы по тегам