繁体   English   中英

C#Windows程序将文件写入“ sysWOW64”和“程序文件(x86)”。 使用VS安装项目。 64位系统上的32位应用程序

[英]C# Windows Program writes files to “sysWOW64” and to “Program Files(x86)”. Using VS Setup Projects. 32bit App on 64bit System

有人可以告诉我,为什么在我使用VS安装项目安装程序后,我的程序向这两个文件夹写入文件/从中读取文件? 首次启动时,当我启动程序并将程序中的某些内容保存到文件中时,它将写入以下内容:

C:\\ Users \\ UserName \\ AppData \\ Local \\ VirtualStore \\ Program Files(x86)\\ Company Name \\ Program Name \\“

安装程序“在系统启动时运行”之后,我重新启动计算机,程序启动,但是这次它在此文件夹中进行读写操作:

C:\\ Users \\ UserName \\ AppData \\ Local \\ VirtualStore \\ Windows \\ SysWOW64

这样它在第二次启动时就加载错误的值或什么也不加载。 看来这取决于我如何通过Desktop Symbol或Systemstart上的Autorun启动程序。

如何防止这种情况发生?如何让程序始终从同一文件夹读取/写入数据? 我希望将文件始终保存在exe所在的根文件夹中(C:\\ Program Files(x86)\\ CompanyName \\ ProgramName)。

我认为问题出在VS安装项目中,或者是因为它是在64位系统上运行的32位应用程序。 我已经在其他问题中寻找解决方案,但这没有帮助,相反,它什么也没读。 希望有人能帮助我,谢谢!

我就是这样写文件的: File.WriteAllText(@"mailstate2", "true"); 我没有给出路径...我只是想将其保存在根文件夹中...

实际上,您在这里发生了一些不同的事情。 所有这些都与Windows如何运行程序以及如何保护文件系统的关键部分免受恶意篡改有关。

首先,可以从任何目录启动程序。 如果未指定要写入文件的特定位置,则将相对于程序从哪个目录开始写入文件。 您可以通过设置程序的快捷方式并更改快捷方式的“开始于”属性来对此进行测试。 因此,桌面快捷方式中的“开始于”文件夹与自动运行所使用的文件夹不同。

其次,只有高级用户和进程才能实际修改某些Windows目录。 这些Program Files包括Program FilesProgram Files (x86)Windows文件夹等。 如果未提升的进程尝试将文件写入这些目录之一,则Windows会自动将它们重定向到Windows VirtualStore目录下的同一文件夹。 这使用于从这些受保护位置进行读写的旧版程序可以继续工作,同时仍然可以防止可执行文件被恶意软件覆盖。 无论如何,这种无提示的重定向是您的程序最终写到非常奇怪的位置的原因。

根据您要写入的数据类型,有几个位置适合写入不涉及虚拟存储的数据。

  • 如果是您的用户可能要复制到另一台计算机或备份的数据,那么在他的Documents文件夹中创建一个文件夹可能是合适的,尽管我个人不喜欢有多少程序对我这样做。 如果您发现自己正在执行此操作,请问自己是否可以通过某种方式为用户提供存储此数据位置的选项。 可能通过首选项页面或首次运行配置。
  • 如果是个人计算机用户可能希望彼此独立自定义的首选项类型数据,但他们不需要查看或了解,则使用用户的AppData文件夹( C:\\Users\\username\\AppData\\ )适当。 请注意,AppData文件夹包含三个不同的子文件夹:Roaming,Local和LocalLow。 这是有关它们之间差异的一个出色的SuperUser主题
  • 如果需要保留应用程序数据而不考虑用户,则应使用ApplicationData文件夹( C:\\ProgramData ),但是您可能需要在其中创建的任何文件\\目录上设置权限,以允许所有用户访问他们。 还请注意,这样做也会带来安全隐患。

这是几个有用的链接,谷歌快速搜索拉起它们,它们可能使您开始思考正确的方向。

Damien在这里有一个要点:必须提升权限(管理员)才能在共享的公用文件夹(如AppData和程序文件,以及许多其他文件)中写入/更新文件。 另一个问题是已完成的虚拟化,因此您的程序不会在这样做违反安全性时简单崩溃-它会写入虚拟存储。 搜索将显示以下内容:

https://www.curlybrace.com/words/2010/09/09/windows-vista7-file-system-virtualization/

一种简单的解决方案是,如果程序需要提升运行权限以在AppData文件夹中写入/更新文件,则可以给它一个海拔清单。 这种事情:

https://blogs.msdn.microsoft.com/nikhiln/2007/04/19/using-manifests-to-elevate-an-application-in-vista/

尽管Visual Studio应该为您的清单提供IDE支持,以便您的代码已请求requestExecutionLevel level =“ requireAdministrator”。 它将在启动时要求提升,就像UAC系统上需要它的所有程序一样。

清单的存在也会关闭虚拟化,因此您的应用将崩溃,而不是重定向到虚拟存储(如果您违反了将文件写入受限位置的操作)。

如果您要求受限的用户能够运行您的应用,请为ashbygeek所指​​的文件选择其他位置。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM