c # - Konfiguration Gem uautoriseret adgang

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg skriver en C # -applikation i Visual Studio, som skal gemme nogle indstillinger for udholdenhed, så brugeren ikke behøver at indtaste dem hver gang de starter programmet.


Til dette formål har jeg oprettet en klasse ConfigurationController, der bruger standard System.Configuration biblioteket og App.config til at gemme indstillinger.


Jeg har følgende metode til faktisk at gemme indstillingerne i <appSettings> med taster


internal void Save(string name, string value)
{
    if (AppSettings.AllKeys.Contains(name))
    {
        AppSettings.Remove(name);
    }
    AppSettings.Add(name, value);

    Config.Save(ConfigurationSaveMode.Modified);
}


Jeg har et problem, hvor når Config.Save() hedder det kaster en UnauthorizedAccessException med meddelelsen 'Forsøg på at udføre en uautoriseret operation.'


Jeg troede, at det måske var fordi projektet var på en netværksandel, men jeg kopierede en udgivelsesbygning til min lokale maskine og havde stadig dette problem. Jeg forsøgte at køre som administrator og sørgede for, at min bruger tog ejerskab af den mappe, applikationen var i. Jeg kan ikke synes at finde problemet. Alt tilhører min bruger, og jeg har fuld kontrol, men applikationen gør det stadig af en eller anden grund ikke 'har ikke adgang til at ændre config filen?


Er der noget jeg kan se på, der kan give mere detaljer eller angivelse af, hvad der sker præcist?


Her er et minimalt levedygtigt produkt. Hvis jeg læser dette i et visuelt studieprojekt på min lokale disk, så er der ikke noget problem. Men hvis jeg afregner netværket, får jeg undtagelsen kastet.


using System;
using System.Configuration;
using System.Linq;

namespace UnauthorizedErrorExample
{
    public class Program
    {
        public static void Main(string[] args)
        {
            ConfigurationController.Instance.Save("Setting", "Value");
        }
    }

    internal class ConfigurationController
    {
        System.Configuration.Configuration Config;
        KeyValueConfigurationCollection AppSettings;

        private static ConfigurationController instance;

        private ConfigurationController()
        {
            Config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
            AppSettings = Config.AppSettings.Settings;
        }

        public static ConfigurationController Instance
        {
            get
            {
                if(instance == null)
                {
                    instance = new ConfigurationController();
                }
                return instance;
            }
        }

        internal string GetValue(string name)
        {
            return AppSettings.AllKeys.Contains(name) ? AppSettings[name].Value : "";
        }

        internal T GetValue<T>(string name)
        {
            return AppSettings.AllKeys.Contains(name) ? (T)Convert.ChangeType(AppSettings[name].Value, typeof(T)) : default(T);
        }

        internal void Save(string name, string value)
        {
            if (AppSettings.AllKeys.Contains(name))
            {
                AppSettings.Remove(name);
            }
            AppSettings.Add(name, value);

            Config.Save(ConfigurationSaveMode.Modified);
        }
    }
}

Bedste reference