仅当应用程序以管理员身份运行时,才能在Windows 7中正确读取对应用程序配置所做的更新

时间:2011-09-01 08:45:21

标签: c# .net windows-7 uac

我们有一个使用Visual Studio 2005为Windows Mobile和Windows平台构建的应用程序。我们使用单个代码库开发了此应用程序的两个版本,以尝试减少代码重复。我们遇到的一个问题是ConfigurationManager不适用于Windows Mobile平台。我们通过构建我们自己的ConfigurationManager来解决这个问题,该管理器将设置读取和写入" Application.exe.config" Program Files文件夹中的文件。因此,我们的Windows版本和Windows Mobile版本都使用相同的自定义ConfigurationManager。

这在Windows XP和Windows Server 2003上运行良好,但在Windows 7上我们遇到了问题,我不知道如何解决它。当我们对配置文件进行更改时(我们只能通过将其复制到另一个文件夹,更改它然后将其复制回来...否则当我们尝试时,我们会收到"访问被拒绝"消息将我们的更改直接保存在Program Files文件夹中),只有在我们以管理员身份运行应用程序时才会反映我们所做的更改。如果我们以普通用户身份运行应用程序,则始终会显示安装的默认设置。我们怀疑这是一个与Windows 7安全相关的问题,但有人可以解释为什么会发生这种情况吗?我们如何更改设置,以便在以普通用户身份运行应用程序时应用它们?

2 个答案:

答案 0 :(得分:3)

Windows 7需要提升多个文件夹的权限,包括程序文件。尝试解决这个问题并不是一个好习惯。

由于您使用的是自定义解决方案,因此可以选择将配置文件放在%APPDATA%\ yourproduct下,可以通过

进行访问
var appDataFolder = Path.Combine(Environment.SpecialFolder.ApplicationData, product);

但是,更好的解决方案可能是针对不同的平台使用不同的配置管理器。无法应用某种abstract factory吗?

答案 1 :(得分:1)

我怀疑你的应用程序尝试写入配置文件至少一次运行非提升且没有清单。这为您的配置文件创建了“兼容性文件”文件夹。当你运行非提升时,它现在看起来。 (有关如何确认此信息的截图,请参阅http://www.gregcons.com/KateBlog/FindingFilesYoureSureYouWrote.aspx。)

如果你想要的只是一个人,或你编写的一些可以运行提升的实用程序,为了能够编辑配置文件,你可以将它保留在原来的位置,并在你的应用程序上放置一个清单以防止虚拟化。有关示例清单,请参阅http://www.gregcons.com/KateBlog/AddingAManifestToAVistaApplication.aspx。该博客文章继续告诉您如何嵌入清单,但您不需要,外部清单将起作用。如果您的应用程序是foo.exe,请将清单命名为foo.exe.manifest并将其放在同一文件夹中。这将阻止虚拟化并使应用程序读取“真实”配置文件。

如果更改配置文件将是正常的日常事件,请不要在Program Files下编写该文件。 AppData是一个不错的选择。