首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获取存储在VirtualStore中的日志文件的真实路径

获取存储在VirtualStore中的日志文件的真实路径
EN

Stack Overflow用户
提问于 2013-12-13 16:02:28
回答 3查看 2.8K关注 0票数 4

我的应用程序将日志文件存储在一个位置,这取决于管理设置,可以重定向到VirtualStore中的一个文件夹。例如,它们有时会以以下方式结束:

日志文件位于:

代码语言:javascript
复制
C:\Users\-my username-\AppData\Local\VirtualStore\Program Files (x86)\ *my-application* \logs

C#认为它就在这里:

C:\程序文件(x86)\ my-application \log

这只是代码的一部分中的一个问题--一个试图在记事本中打开日志文件的按钮。它运行Process.Start(路径在哪里-应用程序-认为-日志-文件-是);

如果我使用File.Exists( path-where-application-thinks files are)对此进行测试,我就会发现--因为c#知道要查看VirtualStore位置。但是当我试图启动文件时,它失败了。

因此,我的问题是,从Process.Start()命令的角度来看,是否有一种方法将路径转换为正确的位置?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-12-31 21:14:15

你的问题的答案是你不能。

文件和注册表虚拟化是一种暂时的兼容性攻击,出现在当前版本的Windows中,以便错误频繁的应用程序暂时继续工作。Microsoft不提供处理重定向文件的功能。这样做的应用程序处于be状态,需要修复。

来自Windows博客的开发

用户帐户控制数据重定向 今天,许多应用程序仍然被设计为将文件写入Program、Windows目录或系统根(通常是C驱动器)文件夹。 虚拟化只是为了帮助帮助实现与现有程序的应用程序兼容性。为Microsoft 7设计的新应用程序不应该对敏感系统区域执行写操作,也不应该依赖虚拟化来纠正不正确的应用程序行为。总是开发与标准用户权限一起使用的应用程序,不依赖于在管理员权限下运行的应用程序。使用标准用户权限(而不是管理员权限)测试应用程序。 如果您正在体验在Windows 7之前开发的应用程序的UAC虚拟化,请重新设计您的应用程序,以便将文件写入适当的位置。

解决问题的理想方法是禁用应用程序的文件和注册表虚拟化。这样,您的应用程序将不再能够将文件保存到敏感位置-并将得到一个Access denied错误。

为此,您可以向应用程序的程序集清单中添加一个条目,告诉Windows您的应用程序已正确编写:

AssemblyManifest.xml

代码语言:javascript
复制
<?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提供文件系统中用于存储程序和软件组件、共享应用程序数据和特定于用户的应用程序数据的特定位置:

  • 默认情况下,应用程序应该安装到Program文件夹中。用户数据或应用程序数据绝不能存储在此位置,因为为该文件夹配置了安全权限(重点是添加的)
  • 必须在计算机上的用户之间共享的所有应用程序数据都应存储在ProgramData中。
  • 所有专用于特定用户且不与计算机的其他用户共享的应用程序数据必须存储在用户\\AppData中
  • 不要直接写入"Windows“目录和或子目录。使用正确的方法安装文件,如字体或驱动程序。
  • 在“每台机器”安装中,必须在第一次运行时而不是在安装期间写入用户数据。这是因为在安装时没有正确的用户位置来存储数据。安装后,应用程序在计算机级别修改默认关联行为的尝试将失败。相反,必须在每个用户级别上声明默认值,这样可以防止多个用户覆盖对方的默认设置。

在这种情况下,应该存储日志文件:

  • 在每个用户的LocalAppData文件夹中(通常解析为C:\Users\Sugrue\AppData\Local)
  • CommonAppData文件夹中(通常解析为C:\ProgramData)

是你的选择。您可能需要一个多用户可以添加到的单个日志文件。在这种情况下,您需要公共AppData文件夹。可以使用SHGetFolderPathCSIDL_COMMON_APPDATA或较新的SHGetKnownFolderPath检索此路径。

代码语言:javascript
复制
SHGetFolderPath(0, CSIDL_COMMON_APPDATA, SHGFP_TYPE_CURRENT, out path);

用户可以写入此文件夹,因为在默认情况下,创建文件和文件夹的权限被授予用户:

摘要

你不能这么做。

但同时:你不应该。

考虑一下如果没有重定向发生会发生什么。当您作为标准用户在Windows上运行时会发生什么?

票数 7
EN

Stack Overflow用户

发布于 2017-04-06 05:08:42

我也遇到过类似的情况;我能够通过将安装路径限制在与程序文件(x86)不同的位置来解决这个问题。你可以说C:\Program \Program

如果您尝试这样做,那么您将注意到应用程序没有创建扩展名为:\AppData\Local\VirtualStore的虚拟存储文件夹。

票数 1
EN

Stack Overflow用户

发布于 2013-12-17 11:56:47

我尝试过的解决方案不是很优雅,就是测试VirtualStore路径位置是否存在。如果是的话,就用那个。

但必须有更有力的方法来做到这一点。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20570754

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档