【问题标题】:How to skip the VirtualStore and read files in Program Files folder?如何跳过 VirtualStore 并读取 Program Files 文件夹中的文件?
【发布时间】:2016-10-21 08:59:01
【问题描述】:

我在 Windows 10 PC 上有一个 c# 应用程序。安装文件夹 (C:\Program Files (x86)\xxx) 中有我想阅读的设置文件,但除非用户具有管理员访问权限,否则不能编辑。问题是 Windows 正在将这些设置文件复制到 VirtualStore 并将所有读取重定向到那里 - 而以管理员身份运行的同一应用程序会看到 Program Files 文件夹中的原始设置文件。

我的问题:有没有办法让应用程序看到程序文件中的原始文件,即使不是以管理员身份运行?我只想阅读它们,而不是编辑它们。

【问题讨论】:

  • 如果您只是阅读它们,阅读该文件的复制版本有什么问题?
  • 因为以管理员身份运行时,您可以编辑它们 - 但在这种情况下,它会编辑程序文件夹中的版本,而不是虚拟存储版本。所以从非管理员实例的角度来看,文件没有改变。
  • 什么时候复制文件?
  • Windows 似乎在非管理员实例访问文件时复制到虚拟存储。
  • 您的程序与 UAC 不兼容。这些天很难做到,你需要记录你的 VS 版本。当程序显然也在写入文件时,您需要解释您的“只想阅读它们”声明。

标签: c# windows-10 virtualstore


【解决方案1】:

您无需提升权限即可从Program Files (x86) 文件夹中读取文件。检查您如何打开文件进行阅读。您应该在普通用户模式和提升模式下指定不同的FileAccess 标志。对于普通用户模式,应使用“FileAccess.Read”打开它:

using (FileStream settingsFile = new FileStream(@"C:\Program Files (x86)\xxx", FileMode.Open, FileAccess.Read))
{
  // Do the job
}

要检测应用程序是否以提升的权限运行,请使用IsProcessElevated 方法。根据结果​​,您可以选择正确的FileAccess 模式。

【讨论】:

  • 谢谢 - 我会仔细检查我打开文件是否正确。
  • @Sugrue 要更好地了解应用程序的文件流量,您可以使用来自 Sysinternals 套件的Process Monitor。它将显示应用程序请求的每个文件的所需访问权限。
  • 嗨 Nikita - 我们仔细检查了 - 我们在另一段代码中很愚蠢,它错误地打开了文件。现在都修好了。谢谢,
【解决方案2】:

在 Program Files 中查看原始文件的方法是不要在那里写入(为此,Nikita 指出以只读方式打开文件)。 VirtualStore 不是用来使用的,而是用来修复应用程序问题的。例如,当当前 Windows(自 NT 起)可以同时拥有来自不同用户的多个会话时,为旧的单用户 Windows 编写的应用程序损坏会导致此类问题。

如果应用程序想要修改所有用户之间共享的数据文件,它应该将文件保存到所有用户配置文件。如果是用户数据,它可以将数据存储在用户配置文件中的Application Data文件夹中。在应用程序数据中,您仍然可以选择漫游或本地数据。

这些文件夹的路径在不同的 Windows 版本上是不同的。 Windows Installer 将属性设置为路径。应用程序有许多可以使用的接口。一个接口见Working with Known Folders in ApplicationsSHGetKnownFolderPath

除此之外,对 Program Files 的访问权限在 UAC 后面。您应该阅读它以了解所有详细信息。

【讨论】:

    猜你喜欢
    • 2012-07-12
    • 2014-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-03
    • 1970-01-01
    • 2015-04-28
    相关资源
    最近更新 更多