在Windows资源管理器中,应用程序安装子文件夹中的log4net日志文件不可见

时间:2019-01-04 14:27:44

标签: windows-installer log4net visual-studio-extensions windows-explorer vdproj

我将log4net用于用c#编写的桌面应用程序,并使用Visual Studio扩展“ Microsoft Visual Studio安装程序项目”(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安装应用程序后,我看不到 Windows资源管理器中Program Files \ MyManufacturer \ MyProductName下的日志文件夹 尽管已设置“显示隐藏的文件,文件夹...”。

出于测试目的,我在应用程序中添加了以下代码:

// 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 下的日志文件 可以通过该应用程序访问,我发现它还在不断增长!

所以问题是:log子目录在哪里?如何在Wndows资源管理器中使其可见? 这是权限问题吗?

1 个答案:

答案 0 :(得分:1)

  

简短版本 :请查看以下位置是否有任何虚拟文件夹:    %LocalAppData%\VirtualStore

     

如果您看到此处写入了重定向文件,则由于缺少写入文件的权限,您看到的是重定向文件写入的结果。   原始位置。这是一个受政策控制的功能,其中有很多需要注意的地方。详细信息如下。


位数? :您确定要在正确的文件夹中查找吗?您是否已确定签入 Program Files (x86)


虚拟化/数据重定向 :我想知道您是否启用了将安全文件夹中的失败写入自动魔术地重定向到另一个可写位置的策略? User Account Control: Virtualize file and registry write failures to per-user locations

数据重定向/虚拟化策略条目

  

注意:本地安全策略小程序仅在Windows的专业版,企业版和企业版中可用。在“家庭版”中将缺少该语言。

要查找和更改此政策,请执行以下操作(或通过其他方式进行等效操作):

  1. Windows Key +点击 R
  2. 复制和粘贴: %windir%\system32\secpol.msc /s
  3. 点击 OK 或点击 Enter
  4. 导航至: Local Policies\Security Options 。查找条目: User Account Control: Virtualize file and registry write failures to per-user locations
  5. 此设置是否设置为“ Activated ”?
  

前提条件 :即使将此设置设置为激活,重定向也仅在非常特定的情况下有效。   要使程序符合虚拟化的条件,必须遵循以下条件:

     
      
  1. 位数 :程序必须为32位。
  2.   
  3. 访问权限 :不能以管理员权限运行。
  4.   
  5. 清单 :不得与清单文件一起编译   (表明它适用于Vista或更高版本)。或者您将安全性注释掉   部分。
  6.   
     

(有关如何创建测试应用程序的技术详细信息,请参见下文)。   All of this from this source。还有here is another SO answer

任务管理器和虚拟化 :您可以通过添加 {{1来查看程序的 virtualization status }} 到任务管理器中的“进程”页面(在Windows 10中使用“详细信息”视图-那里应该显示类似UAC-Virtualization的字样):

Task Manager UAC-Virtualization

写在哪里? :如果此数据重定向/虚拟化设置处于活动状态,则日志将自动重定向到可写位置,同时仍在您的计算机中显示原始路径。应用。请检查以下内容: Virtualization column 。程序:

  1. %LocalAppData%\VirtualStore +点击 Windows Key
  2. 复制和粘贴: R
  3. 点击 %LocalAppData%\VirtualStore 或点击 OK
  4. 检查子文件夹(如果有)。

  

解决方案 :可以通过多种方式解决此问题。

     
      
  1. 写入位置 :完全按照设计写入可写位置。我认为这是未来唯一的理智之举。

  2.   
  3. ACL权限 :您可以打开对相关位置的写入权限,并允许用户或所有人进行写访问。我做   不喜欢这种从安全角度考虑的方法。

  4.   
  5. Elevate :我想您可以使用海拔清单以管理员权限运行该应用程序。我真的不喜欢这样   方法。高架的应用程序被赋予了“城市的钥匙”和   代表主要的安全风险。

  6.   
     

这些“解决方案”有一些风味,但是我想我会   现在建议这三个。也许检查以下链接。


技术说明 :仅供记录。关于我用来调试的测试应用程序:

  1. 标准Windows Forms C#应用程序。
  2. 在按钮单击事件中或直接在主要功能中:Enter(首先创建路径,并将“程序文件”部分调整为您的语言)
  3. File.WriteAllText(@"C:\Program Files\My folder\TestFile.txt", "Test"); => Project => Add New Item...
  4. 注释整个Application Manifest File部分。
  5. 编译32位可执行文件。

现在尝试构建并运行。您应该在任务管理器 UAC-Virtualization列中看到为虚拟化激活的应用程序(上面的屏幕截图)。如果数据重定向/虚拟化策略处于活动状态,则单击按钮应写入"Security"


某些链接