如何绕过只读的应用程序范围设置?

Posted

技术标签:

【中文标题】如何绕过只读的应用程序范围设置?【英文标题】:How do I get around application scope settings being read-only? 【发布时间】:2010-12-13 19:49:05 【问题描述】:

如果它们无论如何都不能改变它们的默认值,它们有什么用?反问。

首先,绕过设置系统并直接写入应用程序范围设置文件的最佳方法是什么(下一段中的安全问题)? XmlReader/XmlWriter?

IIRC,如果应用程序尝试写入其 Program Files 文件夹,Windows Vista 和 7 会使用一些魔法来防止这种情况发生。我想我需要调用 UAC 来提升,我必须把那个花哨的盾牌图标放在我的应用程序的选项窗口的确定按钮上等等。链接到快速操作方法?

或者,您可能会告诉我,我正在尝试做的事情是愚蠢的,我应该将可更改的应用程序范围设置完全存储在其他地方。

【问题讨论】:

【参考方案1】:

如果您将它们更改为“用户”设置,它们可以在代码中进行更改,并且当您调用 Save() 时,它们将被保存到当前用户本地设置文件夹中的 user.config 文件中。

显然,这意味着它们对于每个用户来说都是不同的。通常,对于每个用户都相同的全局应用程序设置不会在代码中进行修改,因为一个用户所做的更改会影响其他所有人(因此应用程序设置是只读的)。

如果您不希望它们成为用户范围,请查看 ConfigurationManager 类。这将允许您手动读取和写入 .config 文件。请记住,尽管 c:\program files\ 文件夹是受保护的,普通用户将无法访问它(这将导致 UAC 提示或在 vista/win7 中失败)。仔细考虑您将如何处理它,并记住对 app.config 的任何更改都会影响所有用户。

Windows 中没有任何位置可以保证所有用户都具有写入权限。

【讨论】:

但这正是我想要的!用户 A 修改了某些内容,而用户 B 不必重复该修改。 奇怪的是,越来越多的人不需要这个功能。当然,很多应用程序都有全局设置,程序员希望为其构建友好的 UI。 @Ben - 如果您确实想将设置直接保存到全局 .exe.config 文件,可以使用 ConfigurationManager 类。显然,如果该文件位于 c:\programfiles\ 您的用户将需要适当的管理员权限。首先像这样打开配置: var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);然后像这样添加新设置:config.AppSettings.Settings.Add("key", "value"); (或者您可以创建自定义配置部分)不要忘记调用保存。 如何将应用程序安装到“程序文件”以外的其他地方,这样写权限就不会成为问题?这种方法有什么问题吗? 我的VS2010项目中ConfigurationMangager中的设置和.settings文件中的设置一样吗?我在 ConfigurationManager 中看不到这些设置。我使用了 Simon P Stevens 发布的代码。【参考方案2】:

一个老问题,但我提供这个答案是为了帮助任何尝试实施 Simon P Stevens 的与 ConfigurationManager 类相关的答案的人,因为我不知道如何作为设置的新手来做到这一点。

第一个实现是我的 C# 项目中的 2 个设置文件(变得困难,因为属性下的典型文件在那里,但为空)被合并到单个 .config 中,并在不同的 ConfigurationSection 之间拆分。我认为这就是为什么 ConfigurationManager.AppSettings 和 ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None) 都一直返回 0 键的原因。

经过大量试验和错误后,才意识到大多数 ConfigurationManager 引用都处理默认的 appSettings,这与 Settings 使用的 applicationSettings 不同。

我最终找到了以下内容:

选择正确的ConfigurationSectionGroup/ConfigurationSectionClient,强制转换为SettingsSection,获取设置,设置XML InnerText(如下图):

// this gets the applicationSettings section (and the inner section 'inoBIBooks.My.MySettings')
Configuration config = WebConfigurationManager.OpenWebConfiguration("/" + targetvdir);
ConfigurationSectionGroup applicationSectionGroup = config.GetSectionGroup("applicationSettings");
ConfigurationSection applicationConfigSection = 
applicationSectionGroup.Sections["inoBIBooks.My.MySettings"];
ClientSettingsSection clientSection = (ClientSettingsSection)applicationConfigSection;

// set a value to that specific property
SettingElement applicationSetting = clientSection.Settings.Get("BIDB_Username");
applicationSetting.Value.ValueXml.InnerText = "username";

// without this, saving won't work
applicationConfigSection.SectionInformation.ForceSave = true;
// save
config.Save();

这是来自:Access section 'applicationSettings' (not 'appSettings') in config file from setup 和Save and reload app.config(applicationSettings) at runtime

【讨论】:

【参考方案3】:

看这里:Best practice to save application settings in a Windows Forms Application

ApplicationSettings 类没有 支持将设置保存到 app.config 文件。这很受 设计,运行正常的应用程序 安全用户帐户(想想 Vista UAC) 没有写入权限 程序的安装文件夹。

你可以用 配置管理器类。但是 简单的解决方法是进入 设置设计器并更改 设置范围为用户。如果说 造成困难(例如,设置是 与每个用户相关),您应该 将您的选项功能放在一个单独的 程序,所以你可以要求 权限提升提示。或者放弃 使用设置。

【讨论】:

以上是关于如何绕过只读的应用程序范围设置?的主要内容,如果未能解决你的问题,请参考以下文章

QNetworkProxy - 绕过某些地址

WPF:在只读文本框上使用拼写检查

python多线程读取只读内存缓冲区绕过GIL

在C# winform 程序里设置 DataGrid 为只读属性。

为啥 app.config 中的应用程序设置是只读的?

如何绕过 React 的 useEffect() “缺少依赖项”警告?