【问题标题】:Why does my application not write to the user's APPDATA on some machines?为什么我的应用程序在某些机器上不写入用户的 APPDATA?
【发布时间】:2020-02-10 15:58:43
【问题描述】:

我制作了一个在 Windows 10 1809 上运行的应用程序。它需要以管理员身份运行,有时还需要使用命令行参数。一种方法是运行cmd以管理员身份,导航到文件夹并使用正确的参数运行应用程序。启动时,它会使用日志库的内置功能在%APPDATA%\AppName 下创建一个日志文件夹。

该应用程序是用 C#、.Net 4.6 开发的,并使用 log4net 作为日志库,配置文件指出:

<file type="log4net.Util.PatternString" value="${AppData}\\AppName\\FileName.log" />

现在我有一个用户,声称这对他不起作用。该应用程序既不创建子目录 (AppName),也不创建任何日志文件。由于我无法直接查看他们的机器,因此我想收集一些可能的原因(也是为了在未来减轻此类行为)。

在较旧的 Windows 操作系统上,我知道运行应用程序以管理员身份有时实际上会使用另一个用户帐户(管理员帐户)运行应用程序。然后将使用其他用户的 APPDATA 文件夹。不过,我不知道这是否也会在 Windows 10 上发生。

他们那边会不会有某种错误配置?

我也不能只添加像FallbackAppender 这样的解决方法,因为它必须与客户讨论。

应用程序能够在一台 Windows 10 计算机上写入调用用户的 APPDATA 文件夹但在另一台计算机上却不能写入的原因可能是什么?

【问题讨论】:

  • “我不知道 Windows 10 上是否也会发生这种情况”:据我所知,Win10 上也会发生这种情况。
  • 您为什么不尝试将 %AppData% 的值写入 app 文件夹内的文件中呢?因此,您和您的客户可以查看并了解日志文件的写入位置。另一个说明:为什么不在app文件夹中(可能在子文件夹中)写入日志文件?
  • 所以您建议查看其他用户的 APPDATA 文件夹?或者甚至可能在 `C:\Windows\system32\config\systemprofile\AppData` 中,以防它作为系统帐户运行。不幸的是,我不能只更改应用程序并将新版本发送给用户。但也许我可以提供一个小型测试应用程序。我会将其添加到解决方法列表中。
  • 我建议使用var str = Environment.ExpandEnvironmentVariables("%AppData%");,然后将str写入应用程序运行所在文件夹内的文件中。因此,当应用以管理员身份运行时,您可以确定哪个是 %AppFolder%。
  • Tim,最可能的原因是用于日志记录的 AppFolder 位于管理员文件夹中...如果您不重构应用程序,您将无能为力...

标签: c# .net log4net appdata


【解决方案1】:

恕我直言,原因是用于日志记录的AppData 位于管理员文件夹中(您告诉我们它是以管理员身份运行的)。
除了重构应用程序以将日志写入共享文件夹(例如应用程序文件夹本身或 "%systemdrive%\ProgramData\your-app-name" 文件夹)之外,您无能为力。

【讨论】:

  • 谢谢。我实际上已经在下一个版本中实现了你的想法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-01-27
  • 2023-02-18
  • 2012-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多