如何将应用程序范围设置变为只读?

如果它们无法从默认值改变,它们有什么用? 修辞问题。

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

IIRC,如果应用程序试图写入其Program Files文件夹,Windows Vista和7会做一些魔术来防止这种情况发生。 我想我需要调用UAC进行升级,我必须在我的应用程序的“选项”窗口的“确定”按钮上添加该花式盾牌图标,依此类推。 链接到快速操作方法?

或者,您可以告诉我,我正在尝试做的是愚蠢的,我应该将我可变的应用程序范围设置存储在其他地方。

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

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

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

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

查看此处: 在Windows窗体应用程序中保存应用程序设置的最佳实践

ApplicationSettings类不支持将设置保存到app.config文件。 这非常依赖于设计,使用适当安全的用户帐户(想想Vista UAC)运行的应用程序没有对程序安装文件夹的写入权限。

您可以使用ConfigurationManager类对抗系统。 但是,简单的解决方法是进入“设置”设计器并将设置的范围更改为“用户”。 如果这会导致困难(例如,设置与每个用户相关),则应将“选项”function放在单独的程序中,以便可以请求权限提升提示。 或放弃使用设置。

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

最初的一个实现是我的C#项目中的2个设置文件(因为属性中的典型文件很难,但很空)被组合成单个.config并在不同的ConfigurationSections之间拆分。 我认为这就是为什么ConfigurationManager.AppSettings和ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None)都保持返回0键的原因。

经过大量尝试和错误才意识到大多数ConfigurationManager引用都处理默认的appSettings,这与设置使用的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(); 

这是从:
从安装程序访问配置文件中的“applicationSettings”部分(不是“appSettings”)

在运行时保存并重新加载app.config(applicationSettings)