我的应用程序将日志文件存储在一个位置,这取决于管理设置,可以重定向到VirtualStore中的一个文件夹。例如,它们有时会以以下方式结束:
日志文件位于:
C:\Users\-my username-\AppData\Local\VirtualStore\Program Files (x86)\ *my-application* \logsC#认为它就在这里:
C:\程序文件(x86)\ my-application \log
这只是代码的一部分中的一个问题--一个试图在记事本中打开日志文件的按钮。它运行Process.Start(路径在哪里-应用程序-认为-日志-文件-是);
如果我使用File.Exists( path-where-application-thinks files are)对此进行测试,我就会发现--因为c#知道要查看VirtualStore位置。但是当我试图启动文件时,它失败了。
因此,我的问题是,从Process.Start()命令的角度来看,是否有一种方法将路径转换为正确的位置?
发布于 2013-12-31 21:14:15
你的问题的答案是你不能。
文件和注册表虚拟化是一种暂时的兼容性攻击,出现在当前版本的Windows中,以便错误频繁的应用程序暂时继续工作。Microsoft不提供处理重定向文件的功能。这样做的应用程序处于be状态,需要修复。
来自Windows博客的开发
用户帐户控制数据重定向 今天,许多应用程序仍然被设计为将文件写入Program、Windows目录或系统根(通常是C驱动器)文件夹。 虚拟化只是为了帮助帮助实现与现有程序的应用程序兼容性。为Microsoft 7设计的新应用程序不应该对敏感系统区域执行写操作,也不应该依赖虚拟化来纠正不正确的应用程序行为。总是开发与标准用户权限一起使用的应用程序,不依赖于在管理员权限下运行的应用程序。使用标准用户权限(而不是管理员权限)测试应用程序。 如果您正在体验在Windows 7之前开发的应用程序的UAC虚拟化,请重新设计您的应用程序,以便将文件写入适当的位置。
解决问题的理想方法是禁用应用程序的文件和注册表虚拟化。这样,您的应用程序将不再能够将文件保存到敏感位置-并将得到一个Access denied错误。
为此,您可以向应用程序的程序集清单中添加一个条目,告诉Windows您的应用程序已正确编写:
AssemblyManifest.xml
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity
version="1.0.0.0"
processorArchitecture="X86"
name="client"
type="win32"
/>
<description>Sugrue Contoso</description>
<!-- Disable file and registry virtualization -->
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
<security>
<requestedPrivileges>
<requestedExecutionLevel level="asInvoker" uiAccess="false"/>
</requestedPrivileges>
</security>
</trustInfo>
</assembly>这样,向%ProgramFiles%子树写入日志文件的任何尝试都将正确失败。
正确编写的Windows应用程序不会在Program Files中存储数据。来自Windows 7客户端软件标志程序的技术要求,第8-9页:
默认情况下,安装到正确的文件夹 用户应该对文件的默认安装位置有一致和安全的体验,同时维护将应用程序安装到他们选择的位置的选项。还必须将应用程序数据存储在正确的位置,以便允许多个人使用同一台计算机,而不破坏或覆盖对方的数据和设置。
Windows提供文件系统中用于存储程序和软件组件、共享应用程序数据和特定于用户的应用程序数据的特定位置:
在这种情况下,应该存储日志文件:
LocalAppData文件夹中(通常解析为C:\Users\Sugrue\AppData\Local)CommonAppData文件夹中(通常解析为C:\ProgramData)是你的选择。您可能需要一个多用户可以添加到的单个日志文件。在这种情况下,您需要公共AppData文件夹。可以使用SHGetFolderPath与CSIDL_COMMON_APPDATA或较新的SHGetKnownFolderPath检索此路径。
SHGetFolderPath(0, CSIDL_COMMON_APPDATA, SHGFP_TYPE_CURRENT, out path);用户可以写入此文件夹,因为在默认情况下,创建文件和文件夹的权限被授予用户:

摘要
你不能这么做。
但同时:你不应该。
考虑一下如果没有重定向发生会发生什么。当您作为标准用户在Windows上运行时会发生什么?
发布于 2017-04-06 05:08:42
我也遇到过类似的情况;我能够通过将安装路径限制在与程序文件(x86)不同的位置来解决这个问题。你可以说C:\Program \Program
如果您尝试这样做,那么您将注意到应用程序没有创建扩展名为:\AppData\Local\VirtualStore的虚拟存储文件夹。
发布于 2013-12-17 11:56:47
我尝试过的解决方案不是很优雅,就是测试VirtualStore路径位置是否存在。如果是的话,就用那个。
但必须有更有力的方法来做到这一点。
https://stackoverflow.com/questions/20570754
复制相似问题