【问题标题】:Where to store local service appdata?在哪里存储本地服务应用程序数据?
【发布时间】:2012-10-05 14:20:00
【问题描述】:

我正在编写一个具有“LocalService”帐户类型的 Windows 服务。我有一个文件来存储它必须做的事情。

我还有一个 Windows 窗体 GUI,还可以访问该文件以添加/删除要执行的服务的操作实例。 (不知道它是否相关,但该服务从网络服务下载表格并将它们导出到用户有权访问的任何数据库。这些下载计划定期发生)

该服务将仅安装在用户帐户上。

我计划将文件存储在用户 appdata 文件夹中,但是在调试服务时出现错误“访问路径 [路径] 被拒绝”

您建议将此文件存储在哪里,以便两个程序都可以访问它? 谢谢

编辑:再看一点,我意识到

Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)

为服务和 Windows 窗体应用程序找到不同的路径。 并且该应用程序无法访问服务应用程序数据,就像服务似乎无法访问用户应用程序数据一样。所以同样的问题存在!

另一个编辑: 原来如此

Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData)

可从本地服务和用户程序访问 - doh

...但有些地方似乎是只读的...

【问题讨论】:

  • 只是为了明确......访问此数据的服务运行在与 gui 应用程序不同的 id 下,对吗? “本地系统”与 ? “该服务将仅安装在用户帐户上”这句话令人困惑。
  • 也许文件系统不是存储这个的正确位置(如果多个用户需要保持他们的设置分开)。如果 GUI 应用直接与服务对话,并让服务维护一个单一的原始文件(保持用户隔离等),那可能是一个更好的模型?
  • @Pete 确实是本地系统。抱歉,我以前从未编写过 Windows 服务。服务和 GUI 包装在同一个安装程序中……我猜那句话是不正确的。
  • @Damien_The_Unbeliever 每台机器不会被超过一个用户使用该程序。多个用户超出了设计规范。您可能正在使用 gui 与服务交谈,但我不知道从哪里开始。我会调查的。谢谢

标签: c# windows-services appdata


【解决方案1】:

我看到的三个选项:

  • 在用户登录ID下运行服务

优势 - 两个进程对文件系统的各个部分都具有相同的访问权限,因此应该可以解决您的直接问题

缺点 - 如果用户更改密码,两者将不同步。

  • 写入文件系统(或注册表)的某些“中立”部分,共享访问不会成为问题。 AppData 的问题在于,正如您所发现的,Windows 围绕它设置了各种保护措施,以便将不同的用户相互隔离。

好处——写作没问题

缺点 - 您实际上是在发明自己的标准。 15 年前,这将是一个显而易见的注册表,但这些天我得到的印象是注册表是不受欢迎的(尽管 ms 仍然依赖它!)。如果您确实走注册表路线,请确保您针对的是 hklm 而不是 hkcu 否则您将遇到同样的问题!

  • 在设置过程中,请使用一些技巧来设置对相关文件夹的访问权限。但这基本上是在破坏 Windows 设置的保护。对我来说听起来不太明智。

【讨论】:

    猜你喜欢
    • 2017-04-02
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 2014-12-05
    • 1970-01-01
    • 2011-12-20
    • 2016-04-18
    • 2013-02-12
    相关资源
    最近更新 更多