【问题标题】:WPF - Modify Configuration settings during runtimeWPF - 在运行时修改配置设置
【发布时间】:2020-06-12 09:45:39
【问题描述】:

我正在创建一个 WPF 应用程序。它在 Visual Studio 中运行良好。但是,每当我在安装后通过应用程序修改配置设置时,它都会抛出错误“加载配置文件时出错:访问路径 c:\Program Files (x86)\... denied”。我不能根据要求每次都以管理员身份运行程序。有没有办法解决这个问题?

var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
var connectionStringsSection = (ConnectionStringsSection)config.GetSection("connectionStrings");connectionStringsSection.ConnectionStrings["cn"].ConnectionString = "data source=" + txtServer.Text + ";database=" + txtDatabase.Text + ";User ID=" + txtUserID.Text + ";Password=" + pwdPassword.Password;
config.Save(ConfigurationSaveMode.Modified);
ConfigurationManager.RefreshSection("connectionStrings");

config.Save(ConfigurationSaveMode.Modified);

// Force a reload of the changed section.
ConfigurationManager.RefreshSection("appSettings");

【问题讨论】:

  • 您需要保留更改吗?如果是,为什么不在安装过程中设置文件ACL?或者当需要这样的更改时,正确的方法会提示以管理员模式重新启动应用程序。
  • @DipenShah 我想永久进行更改。您能帮我在安装过程中如何设置文件访问权限吗?
  • 您是否使用 installshield 来生成安装文件?
  • @DipenShah 否,正常安装项目。
  • @DipenShah 我尝试将 app.config 重新分配到其他位置。我希望它有效。此外,如果上述修复不起作用,将尝试 File.SetAccessControl。谢谢

标签: c# wpf windows-installer connection-string administrator


【解决方案1】:

经验法则Treat your installation folder under program files as read-only

这就是它的全部内容。 I have this list of approaches to deal with access denied。那里的大多数选项都不好并列出,因此人们可以记住它们为什么不好(我刚刚用颜色更新了链接的答案以指示更多推荐的方法 - 它有点混乱,但至少它可以激发想法)。

选择将文件移动到可写位置,或使用仅内部默认值,或者更好的是从云端(数据库)读取并写入如果需要,可以添加到用户配置文件。

传统方式显然是带有 HKCU 条目的注册表

(我喜欢“设置的版本控制和备份”,而不仅仅是设置文件,而是通过数据库存储设置来实现 - 不过需要做更多的工作。

【讨论】:

    【解决方案2】:

    UAC 将阻止用户更改程序文件中的任何内容。这就是引发您的错误的原因。

    https://social.technet.microsoft.com/wiki/contents/articles/30915.c-local-files.aspx

    您的替代方案包括:

    显式更改配置部署到的文件夹的授权。这被广泛认为是非常糟糕的做法。忘记这是你分发给外部客户的。

    不要为这些变量使用配置文件,而是将它们写入 appdata 中的文件。如果这是多用户安装,您可以使用公共应用数据,或者您可以使用用户的应用数据。

    后者是我推荐的方法。

    构建一个适合保存数据的类。

    将此序列化为字符串并以 xml 或 json 文件形式保存到 appdata 中。

    【讨论】:

      猜你喜欢
      • 2011-01-28
      • 2012-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-30
      • 2018-12-19
      • 2010-10-14
      • 1970-01-01
      相关资源
      最近更新 更多