Ich habe einen benutzerdefinierten Konfigurationsabschnitt, eine Sammlung und ein Element zum Hinzufügen/Ändern zu meiner app.config geschrieben. Alles scheint gut zu laufen und läuft perfekt in Visual Studio. Allerdings, wenn ich die Anwendung zu installieren und es kommt Zeit, um die neuen Daten an den benutzerdefinierten Konfigurationsabschnitt wird folgende Ausnahme speichern geworfen:Benutzerdefinierter Konfigurationsabschnitt kann nur während der Ausführung als Administrator gespeichert/geändert werden?
System.Configuration.ConfigurationErrorsException: Unable to save config to file '{path to config file}'
Der interessante Teil ist, dass, wenn ich die Anwendung im Administrator-Modus laufen, alles funktioniert gut. Gibt es einen Grund, warum es nur als Administrator funktionieren würde?
EDIT:
Ich sollte anmerken, dass ich nicht glaube, es ist ein Problem, weil Zugriffsrechte a) wir andere Anwendungen haben, die die <applicationSettings>
ihrer app.configs ganz gut da und b) log4net ist in der Lage ändern um seine Protokolldatei dort gut zu schreiben.
Benutzerdefinierte 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; }
}
}
Benutzerdefinierte Config Abschnitt:
[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);
}
}
}
Benutzerdefinierte Config Abschnitt
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();
}
}
Wo schreiben Sie? Wo physisch? Hat der Benutzer, der Ihre App ausführt, die Erlaubnis, dort zu schreiben? – mariocatch
Ich denke, das könnte Ihnen helfen [Wie Admin-Rechte für die Bearbeitung von app.config in C# bekommen?] (Http://stackoverflow.com/questions/3147171/how-to-get-admin-privileges-for-editing-app -config-in-c) –
@mariocatch zu Program Schreiben, aber auch andere Anwendungen in unserer Suite Konfigurationsdateien ändern ganz gut, dass auch dort gespeichert sind. Gibt es einen Unterschied zwischen dem Abschnitt, der geändert wird (der für unsere anderen Apps funktioniert) und einem benutzerdefinierten Abschnitt in Bezug auf Berechtigungen? Außerdem verwendet meine App log4net, das offenbar kein Problem hat, das Protokoll an diesen Ort zu schreiben. –
Hershizer33