2016-05-06 11 views
1

Я написал пользовательский раздел конфигурации, коллекцию и элемент для добавления/изменения в свой app.config. Кажется, все идет хорошо, и он отлично работает в Visual Studio. Однако, при установке приложения и приходит время, чтобы сохранить новые данные в разделе пользовательских конфигурации, следующее исключение:Пользовательский раздел конфигурации может быть сохранен/изменен только при запуске как администратор?

System.Configuration.ConfigurationErrorsException: Unable to save config to file '{path to config file}' 

Самое интересное в том, что если я запустить приложение в режиме администратора, все работает отлично. Есть ли причина, по которой он будет работать только как администратор?

EDIT:

я должен отметить, что я не думаю, что его вопрос а permissons потому что а) у нас есть другие приложения, которые модифицируют <applicationSettings> их app.configs просто отлично там, и б) log4net способен чтобы написать свой файл журнала просто отлично.

Пользовательские Config Element:

public class AuditorColorElement : ConfigurationElement 
{ 
    public AuditorColorElement() 
    { 
    } 

    public AuditorColorElement(Color color, string auditor) 
    { 
     Color = color; 
     Auditor = auditor; 
    } 

    [ConfigurationProperty(nameof(Color), IsRequired = true, IsKey = true)] 
    public Color Color 
    { 
     get { return (Color)base[nameof(Color)]; } 
     set { this[nameof(Color)] = value; } 
    } 

    [ConfigurationProperty(nameof(Auditor), IsRequired = true)] 
    public string Auditor 
    { 
     get { return (string)base[nameof(Auditor)]; } 
     set { this[nameof(Auditor)] = value; } 
    } 
} 

Пользовательские конфигурации Раздел:

[ConfigurationCollection(typeof(AuditorColorElement))] 
public class AuditorColorElementCollection : ConfigurationElementCollection, IEnumerable<AuditorColorElement> 
{ 
    internal const string PropertyName = "AuditorColors"; 

    public AuditorColorElementCollection() : base() 
    { 
    } 

    public AuditorColorElementCollection(AuditorColorElementCollection collection) 
    { 
     foreach (AuditorColorElement element in collection) 
     { 
      Add(element); 
     } 
    } 

    public override ConfigurationElementCollectionType CollectionType 
    { 
     get 
     { 
      return ConfigurationElementCollectionType.AddRemoveClearMapAlternate; 
     } 
    } 

    protected override string ElementName 
    { 
     get 
     { 
      return PropertyName; 
     } 
    } 

    public AuditorColorElement this[int idx] 
    { 
     get { return (AuditorColorElement)BaseGet(idx); } 
    } 

    protected override bool IsElementName(string elementName) 
    { 
     return elementName.Equals(PropertyName, 
     StringComparison.InvariantCultureIgnoreCase); 
    } 

    public override bool IsReadOnly() 
    { 
     return false; 
    } 

    protected override ConfigurationElement CreateNewElement() 
    { 
     return new AuditorColorElement(); 
    } 

    protected override object GetElementKey(ConfigurationElement element) 
    { 
     return ((AuditorColorElement)(element)).Color; 
    } 

    public void Add(AuditorColorElement element) 
    { 
     BaseAdd(element); 
    } 

    public void Clear() 
    { 
     BaseClear(); 
    } 

    public void Remove(AuditorColorElement element) 
    { 
     BaseRemove(element.Color); 
    } 

    public void RemoveAt(int index) 
    { 
     BaseRemoveAt(index); 
    } 

    public void Remove(Color color) 
    { 
     BaseRemove(color); 
    } 

    public object GetKey(object key) 
    { 
     return BaseGet(key); 
    } 

    public bool ContainsKey(object key) 
    { 
     return GetKey(key) != null ? true : false; 
    } 

    public new IEnumerator<AuditorColorElement> GetEnumerator() 
    { 
     foreach (var key in this.BaseGetAllKeys()) 
     { 
      yield return (AuditorColorElement)BaseGet(key); 
     } 
    } 
} 

Пользовательские конфигурации Раздел

public class AuditorColorSection : ConfigurationSection 
{ 
    [ConfigurationProperty(nameof(AuditorColors), IsRequired = true, IsDefaultCollection = true)] 
    [ConfigurationCollection(typeof(AuditorColorElementCollection), 
     AddItemName = "add", 
     ClearItemsName = "clear", 
     RemoveItemName = "remove")] 
    public AuditorColorElementCollection AuditorColors 
    { 
     get { return ((AuditorColorElementCollection)(base[nameof(AuditorColors)])); } 
     set { base[nameof(AuditorColors)] = value; } 
    } 

    public AuditorColorSection() 
    { 
     AuditorColors = new AuditorColorElementCollection(); 
    } 
} 
+0

Куда вы пишете? Где физически? Имеет ли пользователь, выполняющий ваше приложение, разрешение на запись там? – mariocatch

+0

Я думаю, это может помочь вам [Как получить права администратора для редактирования app.config в C#?] (Http://stackoverflow.com/questions/3147171/how-to-get-admin-privileges-for-editing-app -config-in-c) –

+0

@mariocatch Запись в ProgramData, но другие приложения в нашем пакете изменят файлы конфигурации, которые просто хранятся там. Есть ли разница между измененным разделом (который работает для других наших приложений) и специальным разделом с разрешениями? Кроме того, мое приложение использует log4net, который, похоже, не имеет проблемы с записью журнала в это место. – Hershizer33

ответ

2

Я не поклонник с использованием методов в System.Configuration namespace до напишите в конфигурационные файлы. Чтение значений с использованием методов в пространстве имен System.Configuration никогда не является проблемой.

Просто используйте LinqToXML вместо этого, по крайней мере, чтобы проверить, если это проблема.

Я предполагаю, что ваше приложение устанавливаются в C:\Program Data так в то время как она может быть права, связанными с я подозреваю, что основная причина System.Configuration.ConfigurationErrorsException: Unable to save config to file является lock on the file, use this code to check, если это предположение верно.

+0

Так что я не использовал пространство имен' System.Configuration' для записи фактического файла (файл был создан Add- -> Новый элемент в самом VS и установить для копирования на вывод), но это был просто пустой файл конфигурации со стандартным тегом ''. Как указано, ошибка произошла, когда triying открыл файл и сохранил изменения. То, что я сделал, закончилось тем, что исправление проблемы - это создание XML-файла в коде с помощью XML Writer и запись с ним верхнего уровня ''. Оставшийся код не изменился, и на этот раз он работает.Означает ли это, что ваша теория о блокировке? – Hershizer33

+1

Все атрибуты, которые вы используете, находятся в пространстве имен 'System.Configuration', например [ConfigurationProperty] (https://msdn.microsoft.com/en-us/library/system.configuration.configurationproperty (v = vs.110) .aspx). У меня было множество проблем с записью в файлы конфигурации с использованием этих типов методов. Это было просто догадка/предположение/угадайте, почему причиной отказа является то, что файл заблокирован. Если его не разрешенные отношения, а не файл не найден, следующий логический выбор заключается в том, что файл заблокирован. Главным моментом было использование LinqToXML или XML Writer. Я рад, что ты заработал. –

+1

Спасибо тоже, был очень запутанным, и я до сих пор не вижу разницы между использованием 'System.Configuration' для редактирования созданного файла времени компиляции (не работает) и файла, созданного во время выполнения (работающего через XMLWriter), но подозревают, что это имеет какое-то отношение к разрешениям, но прошлое, что это просто предположение. – Hershizer33

 Смежные вопросы

  • Нет связанных вопросов^_^