0

我有一个名为 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是新的,另外两个是旧的。我要么找到一种方法来完成这项工作,要么强制用户启动 Application A并指向感兴趣的数据库,然后关闭 Application A。这是非常不方便的。

{编辑到此结束}

4

5 回答 5

3

不建议将数据文件写入程序文件目录,因为这需要提升权限。授予程序提升的权限只是为了更新配置文件与 Principal of Least Privilege 冲突,该Principal of Least Privilege指出

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

仅仅为了更新配置文件而赋予进程提升的权限(可以允许它做许多有害的事情)不是“合法目的”。MS 推荐的做法是在别处写那种类型的数据。

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

于 2012-06-08T15:58:51.743 回答
0

您对受保护目录的假设是正确的。Program Files 有一个访问控制列表,可以防止以标准用户身份运行的进程进行修改,在 Vista 上,甚至可以防止未运行提升的管理员进程进行修改。使用标准配置类访问文件不会解决这个问题。

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

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

于 2012-06-08T16:05:48.453 回答
0

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

于 2012-06-08T16:11:57.350 回答
0

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

于 2012-06-08T16:54:41.697 回答
0

从另一个角度来看:Writing custom section into app.config

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

于 2012-06-08T17:04:49.753 回答