如何写入非标准配置文件

本文关键字:配置文件 非标准 何写入 | 更新日期: 2023-09-27 18:36:46

我有一个名为middle.config的文件,它部署在与exe相同的目录中,但是我需要更新此文件中的值。这意味着我必须转到 C:''Program Files (x86)'' 目录才能访问该文件。尽管它被命名为 .config 文件,但它不遵循 .config 文件的通常架构。它看起来像这样:

<configuationSettings>     
  <middleSettings      
   groupName="XYZ"     
   forkName="SomeDbName"     
   dbServerName="123.123.123.123"     
   cnnTimeoutSeconds="30"     
   cmdDefaultTimeoutSeconds="30"     
   cmdMediumTimeoutSeconds="60"     
   cmdLongTimeoutSeconds="480"     
   />     
 <userKeys>     
   <Assemblies value="C:'assemblies'" />     
 </userKeys>     
 <friendlyDbName value="NiceData"/>     
</configuationSettings>     

我能够使用 XML 读取和操作内容,但是当我尝试保存文件时,抛出"无权限"错误。我无法重新定位文件。我坚持使用这个旧模式,所以我无法使用ConfigurationManager.OpenExeConfiguration将其视为普通的.config文件。我无法在此架构上定义部分或组(无论如何我都无法定义)。我的所有用户都是其本地计算机上的管理员。

当此文件位于受保护目录中时,如何覆盖或删除和替换此文件(我对权限错误的假设)?如果做不到这一点,有没有办法使用ConfigurationManager.OpenExeConfiguration以某种方式访问此架构。

{编辑从这里开始}

此方案中有三个应用程序:AB 和我的 C。应用程序 A 不知道任何其他应用程序。它可以连接到许多数据库,并删除单个文件"middle.config",其中包含指向上一个应用程序 A 会话使用的最后一个数据库位置的指针信息。应用程序 B,我们称之为导入/导出应用程序,仅在最后一个应用程序 A 数据库位置上运行。应用程序 B 读取数据库指针信息的"middle.config"文件,然后针对该数据库执行控制台命令。它对数据库的选定部分执行大容量转储或大容量导入。

当我构建应用程序 C 时,就是这种情况,该应用程序使用导入/导出应用程序 B 来获取数据块并将其返回到数据库。因此,为了使应用程序C使用应用程序B对于任何数据库,应用程序 C 必须修改"middle.config"文件,以便应用程序 B 找到正确的数据库。应用程序 C 是新的,另外两个是旧版。我要么找到一种方法来实现这项工作,要么强制用户启动应用程序 A 并指向感兴趣的数据库,然后关闭应用程序 A。这是非常不方便的。

{编辑到此结束}

如何写入非标准配置文件

不建议将数据文件写入程序文件目录,因为这需要提升的权限。 仅为了更新配置文件而向程序授予提升的权限会与最小特权主体冲突,后者指出

计算环境的特定抽象层,每个 模块(例如进程、用户或程序,具体取决于 主题)必须只能访问信息和资源 为其合法目的所必需的

仅仅为了更新配置文件而为进程提供提升的权限(可以允许它做许多有害的事情)并不是"合法目的"。 MS 建议的做法是将这种类型的数据写入其他位置。

相反,请考虑将配置文件存储在 ApplicationData 文件夹的子文件夹中。

建议你的应用在当前用户的 AppData 位置文件夹下创建自己的位置,而不是写入应用安装位置下的文件(尤其是在非常严格的程序文件下)。也不建议强制用户以应用程序的管理员身份运行。

你对受保护目录的假设是正确的。程序文件具有访问控制列表,可防止以标准用户身份运行的进程进行修改,在 Vista 以上版本上,甚至可以防止未提升运行的管理员进程进行修改。使用标准配置类访问文件无法解决此问题。

如果您绝对无法移动文件(Eric J. 说安装后写入程序文件是一个坏主意是对的),那么您可以在配置文件编辑程序中嵌入一个清单,该程序将尝试在启动时使用 UAC 提示强制提升。当然,最好的解决方案涉及 a) 使用标准配置架构和 b) 将用户数据保存在用户可写的位置,但有时由于遗留原因这是不可能的。

不幸的是,我不知道有什么方法可以说服 ConfigurationManager 读取非标准架构。

将逻辑移动到单独的进程,并使用当前应用程序的管理员权限启动它。

从另一个角度看: 将自定义节写入 app.config

我发现链接的文章非常有用。 不确定它会回答您的所有问题。