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

时间:2016-10-21 08:59:01

标签: c# windows-10 virtualstore

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

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

2 个答案:

答案 0 :(得分:7)

您不需要提升权限即可从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模式。

答案 1 :(得分:1)

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

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

这些文件夹的路径在不同的Windows版本上有所不同。 Windows Installer具有设置为路径的属性。应用程序有许多可以使用的接口。有关一个界面,请参阅Working with Known Folders in ApplicationsSHGetKnownFolderPath

除此之外,对程序文件的访问位于UAC之后。你应该阅读它以获得所有细节。