如何跳过 VirtualStore 并读取 Program Files 文件夹中的文件?

How to skip the VirtualStore and read files in Program Files folder?

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

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

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

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

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

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

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

这些文件夹的路径在不同的 Windows 版本上是不同的。 Windows 安装程序已将属性设置为路径。应用程序有许多可以使用的接口。一个界面参见 Working with Known Folders in Applications and SHGetKnownFolderPath

除此之外,对 Program Files 的访问落后于 UAC。您应该仔细阅读以了解所有详细信息。