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

时间:2009-11-06 12:39:18

标签: c# wpf settings uac

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

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

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

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

3 个答案:

答案 0 :(得分:12)

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

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

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

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

答案 1 :(得分:1)

一个古老的问题,但是我提供此答案是为了帮助任何尝试实现与ConfigurationManager类有关的Simon P Stevens答案的人,因为我不确定如何通过设置来做菜鸟。

第一个认识到的是,我的C#项目中的2个设置文件(由于在Properties下的典型文件位于其中,但是为空,因此很困难)被组合为单个.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();

此来源来自: Access section 'applicationSettings' (not 'appSettings') in config file from setup

Save and reload app.config(applicationSettings) at runtime

答案 2 :(得分:0)

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

  

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

     

你可以用这个来对抗系统   ConfigurationManager类。但是   琐碎的解决方法是进入   设置设计师并更改   将范围设置为用户。如果说   造成困难(比如,设置是   与每个用户相关),你应该   将您的选项功能单独放在一起   程序,所以你可以要求   特权提升提示。或者放弃   使用设置。