我有一个名为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读取和操作内容,但是当我尝试将文件保存回来时,会抛出“No Permissions”错误。我无法重新定位文件。我坚持使用这种遗留模式,所以我无法使用ConfigurationManager.OpenExeConfiguration将其视为普通的.config文件。我无法在此架构上定义部分或组(我无论如何都无法)。我的所有用户都是本地计算机上的管理员。
如果此文件位于受保护目录中,我如何覆盖或删除并替换此文件(我对权限错误的假设)?如果失败了,有没有办法通过ConfigurationManager.OpenExeConfiguration以某种方式访问此模式。
{edit starts here}
此方案中有三个应用程序, A , B ,以及我的 C 。应用程序 A 不了解任何其他应用程序。它可以连接到许多数据库,并将包含指针信息的单个文件“middle.config”删除到上一个Application A 会话使用的最后一个数据库位置。应用程序 B ,我们将其称为导入/导出应用程序,仅在最后一个应用程序 A 数据库位置上运行。应用程序 B 读取'middle.config'文件以获取数据库指针信息,然后对该数据库执行控制台命令。它为数据库的选定部分执行批量转储或批量导入。
当我开始构建应用程序 C 时,使用导入/导出应用程序 B 来获取数据块并将其返回到数据库。因此,为了使应用程序 C 使用应用程序 B 对于任何数据库,应用程序 C 必须修改'middle.config'文件,以便应用程序 B 找到正确的数据库。应用程序 C 是新的,其他两个是遗留的。我找到了一种方法来完成这项工作,或者我强迫用户启动应用程序 A 并指向感兴趣的数据库,然后关闭应用程序 A 。这非常不方便。
{edit ends here}
答案 0 :(得分:3)
不建议将数据文件写入程序文件目录,因为这需要提升权限。授予程序提升权限只是为了更新配置文件与Principal of Least Privilege发生冲突,这表明
计算环境的特定抽象层,每个 模块(例如进程,用户或程序,取决于 subject)必须只能访问信息和资源 这是其合法目的所必需的
为了更新配置文件,为进程提升权限(可以允许它执行许多有害的事情)并不是“合法目的”。 MS建议的做法是在其他地方写入这种类型的数据。
相反,请考虑将配置文件存储在ApplicationData folder。
的子文件夹中答案 1 :(得分:0)
您对受保护目录的假设是正确的。 Program Files有一个访问控制列表,可以防止作为标准用户运行的进程进行修改,并且在Vista以上,甚至可以通过未运行提升的管理员进程进行修改。使用标准配置类访问文件不会解决这个问题。
如果你绝对无法移动文件(Eric J.在安装后写入Program Files时说得对,那么你可以embed a manifest in your config file-editing program which will try to force elevation with a UAC prompt at launch。当然,最好的解决方案包括:a)使用标准配置模式和b)将用户数据保存在用户可写的位置,但有时由于传统原因这是不可能的。
遗憾的是,我不知道有任何方法可以说服ConfigurationManager读取非标准模式。
答案 2 :(得分:0)
建议您的应用在AppData位置文件夹下为当前用户创建自己的位置,而不是写入安装该应用的位置下的文件(特别是在Program Files非常严格的情况下)。不建议强制使用用户也可以作为应用程序的管理员运行。
答案 3 :(得分:0)
将逻辑移至单独的进程,并使用当前应用程序的管理员权限启动它。
答案 4 :(得分:0)
从不同的角度来看,请看:Writing custom sections into app.config
我发现链接的文章非常有用。不确定它会回答你所有的问题。