你的问题的答案是你不能。
文件和注册表虚拟化是一种临时的兼容性破解,存在于当前版本的 Windows 中,以便有缺陷的应用程序将暂时继续工作。 Microsoft 不提供处理重定向文件的功能。执行此操作的应用程序处于错误状态,需要修复。
来自Windows 开发博客 http://blogs.windows.com/windows/archive/b/developers/archive/2009/08/04/user-account-control-data-redirection.aspx:
用户帐户控制数据重定向
如今,许多应用程序仍然被设计为将文件写入 Program Files、Windows 目录或系统根(通常是 C 盘)文件夹。
虚拟化的目的只是assist与现有程序的应用程序兼容性。专为 Microsoft Windows 7 设计的新应用程序不应该对敏感系统区域执行写入操作,也不应依赖虚拟化来纠正不正确的应用程序行为。Always开发用于以下用途的应用程序标准用户特权和don’t依靠在管理员权限下运行的应用程序。使用标准用户权限而不是管理员权限测试您的应用程序。
如果您正在使用 Windows 7 之前开发的应用程序体验 UAC 虚拟化,请重新设计您的应用程序以将文件写入适当的位置。
理想的方式解决你的问题是禁用文件和注册表虚拟化您的申请。这样您的应用程序将不再能够将文件保存到敏感位置 - 并且将得到一个Access denied
error.
为此,您可以向应用程序的程序集清单中添加一个条目,告诉 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
. From Windows 7 客户端软件徽标计划的技术要求 http://www.microsoft.com/en-us/download/details.aspx?id=3859,第 8-9 页:
默认安装到正确的文件夹
用户应该使用默认设置获得一致且安全的体验
文件的安装位置,同时保留选项
将应用程序安装到他们选择的位置。也是
有必要将应用程序数据存储在正确的位置以允许
多人使用同一台计算机而不会损坏或
覆盖彼此的数据和设置。
Windows 提供了文件系统中的特定位置来存储
程序和软件组件、共享应用程序数据,以及
特定于用户的应用程序数据:
- 默认情况下,应用程序应安装到 Program Files 文件夹中。用户数据或应用程序数据绝不能存储在此
位置,因为为此配置了安全权限
文件夹 (添加了强调)
- 必须在计算机上的用户之间共享的所有应用程序数据都应存储在 ProgramData 中
- 所有特定用户专有且不得与计算机的其他用户共享的应用程序数据必须存储在
用户\\AppData
- 切勿直接写入“Windows”目录和/或子目录。使用正确的方法安装文件,例如
字体或驱动程序
- 在“每台计算机”安装中,用户数据必须在首次运行时写入,而不是在安装过程中写入。这是因为没有
安装时存储数据的正确用户位置。尝试
由应用程序修改机器上的默认关联行为
安装后会失败。相反,默认值必须
在每个用户级别上声明,这可以防止多个用户
覆盖彼此的默认值。
在您的情况下,日志文件应该存储:
- 在每个用户中
LocalAppData
文件夹(通常解析为C:\Users\Sugrue\AppData\Local
)
- in the
CommonAppData
文件夹(通常解析为C:\ProgramData
)
这是你的选择。大概您需要一个可供多个用户添加的日志文件。在这种情况下,您想要通用应用程序数据文件夹。您可以使用检索此路径SHGetFolderPath http://msdn.microsoft.com/en-us/library/windows/desktop/bb762181%28v=vs.85%29.aspx与CSIDL_COMMON_APPDATA http://msdn.microsoft.com/en-us/library/windows/desktop/bb762494(v=vs.85).aspx,或者较新的SHGetKnownFolderPath http://msdn.microsoft.com/en-us/library/windows/desktop/bb762188%28v=vs.85%29.aspx:
SHGetFolderPath(0, CSIDL_COMMON_APPDATA, SHGFP_TYPE_CURRENT, out path);
用户可以写入此文件夹,因为创建文件和文件夹的权限已授予Users默认情况下:
总之
你不能。
但同时:你不应该这样做。
考虑如果没有发生重定向会发生什么。当您在 Windows XP 上以标准用户身份运行时会发生什么?