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

2024-05-06

我的应用程序将日志文件存储在一个位置,根据管理设置,该位置可以重定向到 VirtualStore 中的文件夹。例如,它们有时最终会出现:

日志文件位于:

C:\Users\-my username-\AppData\Local\VirtualStore\Program Files (x86)\ *my-application* \logs

C# 认为它在这里:

C:\程序文件(x86)\我的应用程序 \logs

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

如果我使用 File.Exists(应用程序认为日志文件所在的路径);我明白了 - 因为 c# 知道查看 VirtualStore 位置。但是当我尝试启动该文件时,它失败了。

所以我的问题是,从 Process.Start() 命令的角度来看,有没有办法将路径转换到正确的位置?


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

文件和注册表虚拟化是一种临时的兼容性破解,存在于当前版本的 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.aspxCSIDL_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 上以标准用户身份运行时会发生什么?

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

获取VirtualStore中存储的日志文件的真实路径 的相关文章

  • 如何在MVVM中管理多个窗口

    我知道有几个与此类似的问题 但我还没有找到明确的答案 我正在尝试深入研究 MVVM 并尽可能保持纯粹 但不确定如何在坚持模式的同时启动 关闭窗口 我最初的想法是向 ViewModel 发送数据绑定命令 触发代码来启动一个新视图 然后通过 X
  • 是否可以强制 XMLWriter 将元素写入单引号中?

    这是我的代码 var ptFirstName tboxFirstName Text writer WriteAttributeString first ptFirstName 请注意 即使我使用 ptFirstName 也会以双引号结束 p
  • C# 和 Javascript SHA256 哈希的代码示例

    我有一个在服务器端运行的 C 算法 它对 Base64 编码的字符串进行哈希处理 byte salt Convert FromBase64String serverSalt Step 1 SHA256Managed sha256 new S
  • ASP.NET Core Serilog 未将属性推送到其自定义列

    我有这个设置appsettings json对于我的 Serilog 安装 Serilog MinimumLevel Information Enrich LogUserName Override Microsoft Critical Wr
  • 未解决的包含:“cocos2d.h” - Cocos2dx

    当我在 Eclipse 中导入 cocos2dx android 项目时 我的头文件上收到此警告 Unresolved inclusion cocos2d h 为什么是这样 它实际上困扰着我 该项目可以正确编译并运行 但我希望这种情况消失
  • 如何在列表框项目之间画一条线

    我希望能够用水平线分隔列表框中的每个项目 这只是我用于绘制项目的一些代码 private void symptomsList DrawItem object sender System Windows Forms DrawItemEvent
  • 当 contains() 工作正常时,xpath 函数ends-with() 工作时出现问题

    我正在尝试获取具有以特定 id 结尾的属性的标签 like span 我想获取 id 以 国家 地区 结尾的跨度我尝试以下xpath span ends with id Country 但我得到以下异常 需要命名空间管理器或 XsltCon
  • WPF 中的调度程序和异步等待

    我正在尝试学习 WPF C 中的异步编程 但我陷入了异步编程和使用调度程序的困境 它们是不同的还是在相同的场景中使用 我愿意简短地回答这个问题 以免含糊不清 因为我知道我混淆了 WPF 中的概念和函数 但还不足以在功能上正确使用它 我在这里
  • C - 找到极限之间的所有友好数字

    首先是定义 一对友好的数字由两个不同的整数组成 其中 第一个整数的除数之和等于第二个整数 并且 第二个整数的除数之和等于第一个整数 完美数是等于其自身约数之和的数 我想做的是制作一个程序 询问用户一个下限和一个上限 然后向他 她提供这两个限
  • 将目录压缩为单个文件的方法有哪些

    不知道怎么问 所以我会解释一下情况 我需要存储一些压缩文件 最初的想法是创建一个文件夹并存储所需数量的压缩文件 并创建一个文件来保存有关每个压缩文件的数据 但是 我不被允许创建许多文件 只能有一个 我决定创建一个压缩文件 其中包含有关进一步
  • Web API - 访问 DbContext 类中的 HttpContext

    在我的 C Web API 应用程序中 我添加了CreatedDate and CreatedBy所有表中的列 现在 每当在任何表中添加新记录时 我想填充这些列 为此目的我已经覆盖SaveChanges and SaveChangesAsy
  • for循环中计数器变量的范围是多少?

    我在 Visual Studio 2008 中收到以下错误 Error 1 A local variable named i cannot be declared in this scope because it would give a
  • 如何将单个 char 转换为 int [重复]

    这个问题在这里已经有答案了 我有一串数字 例如 123456789 我需要提取它们中的每一个以在计算中使用它们 我当然可以通过索引访问每个字符 但是如何将其转换为 int 我研究过 atoi 但它需要一个字符串作为参数 因此 我必须将每个字
  • Qt表格小部件,删除行的按钮

    我有一个 QTableWidget 对于所有行 我将一列的 setCellWidget 设置为按钮 我想将此按钮连接到删除该行的函数 我尝试了这段代码 它不起作用 因为如果我只是单击按钮 我不会将当前行设置为按钮的行 ui gt table
  • C++ 复制初始化和直接初始化,奇怪的情况

    在继续阅读本文之前 请阅读在 C 中 复制初始化和直接初始化之间有区别吗 https stackoverflow com questions 1051379 is there a difference in c between copy i
  • x86 上未对齐的指针

    有人可以提供一个示例 将指针从一种类型转换为另一种类型由于未对齐而失败吗 在评论中这个答案 https stackoverflow com questions 544928 reading integer size bytes from a
  • ASP.NET MVC 6 (ASP.NET 5) 中的 Application_PreSendRequestHeaders 和 Application_BeginRequest

    如何在 ASP NET 5 MVC6 中使用这些方法 在 MVC5 中 我在 Global asax 中使用了它 现在呢 也许是入门班 protected void Application PreSendRequestHeaders obj
  • C 中的异或运算符

    在进行按位操作时 我在确定何时使用 XOR 运算符时遇到一些困难 按位与和或非常简单 当您想要屏蔽位时 请使用按位 AND 常见用例是 IP 寻址和子网掩码 当您想要打开位时 请使用包含或 然而 XOR 总是让我明白 我觉得如果在面试中被问
  • 限制C#中的并行线程数

    我正在编写一个 C 程序来生成并通过 FTP 上传 50 万个文件 我想并行处理4个文件 因为机器有4个核心 文件生成需要更长的时间 是否可以将以下 Powershell 示例转换为 C 或者是否有更好的框架 例如 C 中的 Actor 框
  • 防止索引超出范围错误

    我想编写对某些条件的检查 而不必使用 try catch 并且我想避免出现 Index Out of Range 错误的可能性 if array Element 0 Object Length gt 0 array Element 1 Ob

随机推荐