C# 在Windows 8上拒绝访问App.Config的路径。如何更新App.Config?

C# 在Windows 8上拒绝访问App.Config的路径。如何更新App.Config?,c#,configuration,windows-8,app-config,permission-denied,C#,Configuration,Windows 8,App Config,Permission Denied,以下代码适用于Windows XP和Windows 7: var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); config.AppSettings.Settings.Remove(key); config.AppSettings.Settings.Add(key, value); config.Save(ConfigurationSaveMode.Modified); // fa

以下代码适用于Windows XP和Windows 7:

var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
config.AppSettings.Settings.Remove(key);
config.AppSettings.Settings.Add(key, value);
config.Save(ConfigurationSaveMode.Modified); // fails here
但这会在Windows8上导致访问路径被拒绝错误。我已尝试将
ConfigurationUserLevel
更改为
PerUserRoamingAndLocal
,但没有任何效果

要更新App.Config(或者特别是Windows 8中的[application\u name].exe.Config),我需要做什么

我应该补充一点,尝试运行该应用程序的用户具有默认的Windows 8权限。我不知道这是什么,但它的权限非常低。是否需要提升该权限才能正常工作

编辑: 记录的错误:

<Message>Access to the path 'C:\ProgramData\Path\AppName.exe.config' is denied.</Message>
<StackTrace>   at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
   at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy, Boolean useLongPath, Boolean checkHost)
   at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share)
   at System.Configuration.Internal.WriteFileContext.ValidateWriteAccess(String filename)
   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 System.Configuration.Configuration.Save(ConfigurationSaveMode saveMode)
   at MyNamespace.Infrastructure.ConfigurationManager.WriteToAppSettings(String key, String value) in C:\Path\To\App\AppName\Infrastructure\ConfigurationManager.cs:line 76
</StackTrace>
对路径“C:\ProgramData\path\AppName.exe.config”的访问被拒绝。 在System.IO.\uuu Error.WinIOError(Int32 errorCode,字符串maybeFullPath) 在System.IO.FileStream.Init(字符串路径、文件模式、文件访问权限、Int32权限、布尔用户权限、文件共享、Int32缓冲大小、文件选项选项、安全属性secAttrs、字符串msgPath、布尔bFromProxy、布尔useLongPath、布尔checkHost) 位于System.IO.FileStream..ctor(字符串路径、文件模式、文件访问访问、文件共享) 位于System.Configuration.Internal.WriteFileContext.ValidateWriteAccess(字符串文件名) 位于System.Configuration.Internal.WriteFileContext.Complete(字符串文件名,布尔值成功) 位于System.Configuration.Internal.InternalConfigHost.StaticWriteCompleted(字符串streamName、布尔值成功、对象writeContext、布尔值assertPermissions) 位于System.Configuration.Internal.InternalConfigHost.System.Configuration.Internal.IIInternalConfigHost.WriteCompleted(字符串streamName、布尔值成功、对象writeContext、布尔值assertPermissions) 在System.Configuration.Internal.InternalConfigHost.System.Configuration.Internal.IIInternalConfigHost.WriteCompleted处(字符串streamName,布尔值成功,对象writeContext) 位于System.Configuration.Internal.DelegatingConfigHost.WriteCompleted(字符串streamName,布尔值成功,对象writeContext) 在System.Configuration.UpdateConfigHost.WriteCompleted(字符串streamName、布尔值成功、对象writeContext) 位于System.Configuration.MgmtConfigurationRecord.SaveAs(字符串文件名、ConfigurationSaveMode saveMode、布尔值forceUpdateAll) 在System.Configuration.Configuration.SaveAsImpl(字符串文件名、ConfigurationSaveMode保存模式、布尔值forceSaveAll) 在System.Configuration.Configuration.Save(ConfigurationSaveMode-saveMode) 在C:\Path\To\App\AppName\Infrastructure\ConfigurationManager.cs中的MyNamespace.Infrastructure.ConfigurationManager.WriteToAppSettings(字符串键,字符串值)处:第76行
您能发布异常消息吗

我刚刚在Win 8 Pro VS 2012上测试了你的代码,效果很好

var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
config.AppSettings.Settings.Remove("my_new_key");
config.AppSettings.Settings.Add("my_new_key", "my new value");
config.Save(ConfigurationSaveMode.Modified); 
生成的配置文件

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <appSettings>
        <add key="my_new_key" value="my new value" />
    </appSettings>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>
</configuration>


尝试以下操作以拔出钥匙:

Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);

AppSettingsSection appSettings = (AppSettingsSection)config.GetSection("appSettings");
appSettings.Settings.Remove("ConnectionString");
appSettings.Settings.Add("ConnectionString", "");

config.Save(ConfigurationSaveMode.Modified);
ConfigurationManager.RefreshSection(config.AppSettings.SectionInformation.Name);
或更改键值:

Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
KeyValueConfigurationCollection settings = config.AppSettings.Settings;

settings["KeyName"].Value = "newkeyvalue";

config.Save(ConfigurationSaveMode.Modified);
ConfigurationManager.RefreshSection(config.AppSettings.SectionInformation.Name);

我已使用异常消息&stacktrace更新了问题。仅从路径上看,C:/ProgramData默认为只读,但内置系统帐户和管理员组除外。在提升权限下运行将修复您的问题,或者您可以显式授予您的用户帐户编辑文件的权限。我可能y走显式授予自己特权的路线。应用程序是否可以自动向用户帐户授予显式权限,或者这是必须手动设置的吗?部署此应用程序时,它将面向不懂技术的用户,因此我需要尽可能简化此操作。如果无法自动执行此操作,我将我必须将配置数据放在其他地方。这篇文章展示了如何在程序运行时提升应用程序请求权限。如果你不想这样做,最简单的解决方案是将应用程序安装到某个地方,在那里用户将有权编辑文件(在他们的主目录中的某个地方,尽管这不是一个标准位置)。否则,您需要在应用程序中包含类似SubInACL()的内容,并运行安装后脚本。