windows-installer - log4net 日志文件在应用程序安装子文件夹的 Windows 资源管理器中不可见
问题描述
我将 log4net 用于我用 c# 编写的桌面应用程序,并使用 Visual Studio 扩展“Microsoft Visual Studio Installer Projects”(MSI-Installer)进行部署。安装后,我没有看到为 log4net 定义的日志子文件夹。
“ Microsoft Visual Studio 安装程序项目”中的 TARGETDIR 定义为[ProgramFiles64Folder][Manufacturer]\[ProductName]
.
log4net 日志文件定义为
<appender name="rollingFile" type="log4net.Appender.RollingFileAppender,log4net">
<param name="File" value=".\log\MyApp.log" />
<!-- ... -->
通过“Microsoft Visual Studio 安装程序项目”-创建的 setup.exe 和 msi-installer 安装应用程序后,尽管显示隐藏文件、文件夹、.. . 已设置。
出于测试目的,我将以下代码添加到我的应用程序中:
// does log file exist and grow ?
string currdir = Directory.GetCurrentDirectory();
MessageBox.Show(currdir, "Error", MessageBoxButton.OK, MessageBoxImage.Error);
string[] sa = File.ReadAllLines(currdir + "\\log\\MyApp.log");
MessageBox.Show(sa.Length.ToString(), "Error", MessageBoxButton.OK, MessageBoxImage.Error);
// show lines created this year (2019)
string s = "";
for (int i = 0; i < sa.Length; i++)
{
if(sa[i].Contains("2019"))
s = s + sa[i] + "\n";
}
MessageBox.Show(s, "Error", MessageBoxButton.OK, MessageBoxImage.Error);
Program Files\MyManufacturer\MyProductName\log\MyApp.log
因此,可以通过应用程序访问下面的日志文件,我看到它在增长!
所以问题是:日志子目录在哪里?如何使它在 Wndows 资源管理器中可见?这是权限问题吗?
解决方案
简短版:请查看您是否在以下位置有任何虚拟化文件夹:
%LocalAppData%\VirtualStore
。如果您看到此处写入的重定向文件,那么您会看到由于缺少写入原始位置的权限而导致的重定向文件写入结果。这是一个策略控制的功能,需要注意许多问题。详情如下。
比特度?: 你确定你在找正确的文件夹吗?你检查Program Files (x86)
确定吗?
虚拟化/数据重定向:我想知道您是否启用了自动将安全文件夹中失败的写入重定向到另一个可写位置的策略?用户帐户控制:将文件和注册表写入失败虚拟化到每个用户的位置。
数据重定向/虚拟化策略条目:
注意:本地安全策略小程序仅在 Windows 的专业版、企业版和企业版中可用。“家庭版”将缺少它。
要查找和更改此政策,请执行以下操作(或通过其他方式等效):
Windows Key
+ 点击R
。- 复制和粘贴:
%windir%\system32\secpol.msc /s
。 - 单击
OK
或点击Enter
。 - 导航到:
Local Policies\Security Options
。寻找条目:User Account Control: Virtualize file and registry write failures to per-user locations
. - 此设置是否设置为“
Activated
”?
先决条件:即使此设置设置为已激活,重定向也仅在非常特定的情况下有效。对于符合虚拟化条件的程序,它必须遵守以下规定:
- 位数:程序必须是 32 位的。
- 访问权限:不得以管理员权限运行。
- Manifest : 必须没有与清单文件一起编译(表明它适用于 Vista 或更高版本)。或者你注释掉安全部分。
(有关如何创建测试应用程序的技术细节,请参见下文)。 所有这一切都来自这个来源。这是另一个答案。
任务管理器和虚拟化:您可以virtualization status
通过将 添加Virtualization column
到任务管理器的“进程”页面来查看程序(在 Windows 10 中使用“详细信息”视图 - 它应该在那里显示类似 UAC-Virtualization 的内容):
它在哪里写?:如果此数据重定向/虚拟化设置处于活动状态,则日志将自动重定向到可写位置,同时仍显示应用程序中的原始路径。请检查下: %LocalAppData%\VirtualStore
。程序:
Windows Key
+ 点击R
。- 复制和粘贴:
%LocalAppData%\VirtualStore
。 - 单击
OK
或点击Enter
。 - 检查子文件夹(如果有)。
解决方案:可以通过多种方式处理此问题。
写入位置:完全写入可写位置 - 设计使然。在我看来,这是未来唯一明智的做法。
ACL 权限:您可以打开相关位置的写入权限,并允许用户或所有人写入权限。我不喜欢这种安全方式。
提升:我想您可以使用提升清单以管理员权限运行应用程序。我真的不喜欢这种方法。提升的应用程序被赋予“城市的钥匙”,并代表着重大的安全风险。
这些“解决方案”有一些味道,但我想我现在会建议这三种。也许检查以下链接。
技术说明:仅供记录。关于我用来调试的测试应用程序:
- 标准 Windows 窗体 C# 应用程序。
- 在按钮单击事件上或直接在主功能中:(
File.WriteAllText(@"C:\Program Files\My folder\TestFile.txt", "Test");
首先创建路径并将“程序文件”部分调整为您的语言) Project
=>Add New Item...
=>Application Manifest File
。- 注释掉整个
"Security"
部分。 - 编译一个 32 位的可执行文件。
现在尝试构建并运行。您应该会在任务管理器的UAC-Virtualization 列中看到为虚拟化激活的应用程序(上面的屏幕截图)。如果数据重定向/虚拟化策略处于活动状态,则单击该按钮应写入。%LocalAppData%\VirtualStore
一些链接: