14

我正在使用带有 .net 2.0 的 C#

我将程序数据保存在以下文件中:C:\ProgramData\MyProgramName\fileName.xml

安装并运行我的应用程序一次后,我将其卸载(在卸载期间,我从“程序数据”中删除所有文件)然后我重新安装应用程序并运行它。

奇怪的是,我的应用程序启动时就好像程序数据中的文件存在一样——这意味着,即使数据文件被删除,我的应用程序中也有旧数据。

运行时:

File.Exists("C:\ProgramData\MyProgramName\fileName.xml")

即使我确定该文件不存在,我也得到了“真实”。

当我以管理员身份运行应用程序然后文件不存在时,事情变得奇怪了。

经过研究,我发现在没有管理员权限的情况下运行我的应用程序而不是获得:

C:\ProgramData\MyProgramName\fileName.xml

我明白了

C:\Users\userName\AppData\Local\VirtualStore\ProgramData\MyProgramName\fileName.xml

确实有一个文件存在于以前的安装中(我显然没有删除它,因为我不知道它存在)。


因此,请指导我在没有管理员权限的情况下运行应用程序时如何阻止这种情况。

我不想在 VirtualStore 文件夹中自动创建任何文件。请讨论所有可能的方法来阻止这种情况。

4

3 回答 3

6

首先,问问自己,这需要为所有用户全局保存吗?

如果不需要,请将文件保存在 Application Data 中,您可以使用 获取路径Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),它应该始终可靠地扩展为C:\Users\Username\AppData\Roaming\. 请注意,此路径对于每个用户都是唯一的。

如果你必须这样做,那你就不走运了。没有任何可靠的方法可以在任何 Windows post-XP 上为所有没有管理员权限(或 UAC)的用户存储应用程序数据,这不是非常hacky,比如将您的数据存储在公共用户中(这可能也可能不可能,我可以'现在检查)。

于 2013-08-05T13:24:13.290 回答
0

解决此问题的一种方法是使用该Environment.SpecialFolder.CommonApplicationData位置,但有一些非常重要的警告和设置。

CommonApplicationData

用作所有用户使用的特定于应用程序的数据的公共存储库的目录。

此处此处进一步描述了此位置。

另一个 SO 答案中给出了重要的要求和限制:https ://stackoverflow.com/a/22107884/3195477

其中部分说:

推荐的解决方案是让您的安装程序为您的共享存储创建 C:\ProgramData 的子目录。并且该子目录必须由安装程序授予许可 ACL。这就是授予所有标准用户所需的访问权限的原因。

否则,以标准用户权限运行的程序仍然无法平等地为所有用户读取/写入该位置的文件。

于 2019-11-27T19:50:45.760 回答
-1

在将一个非常旧的 win32 应用程序传输到 Windows 7 和 10 时,我找到了解决此问题的方法。程序写入 C:\Program Files 上的数据库...但操作系统自动更改了虚拟存储的路径。但是,该数据库是全球需要的。通过将兼容模式更改为 Windows 95 或 XP SP2 并始终以管理员身份运行,数据库直接在 C:\Program Files\etc 中运行。

这存在安全隐患,并且该框已从所有网络中删除,并且适配器已禁用等。

于 2016-08-04T16:31:56.637 回答