【问题标题】:Best practice when creating files/folders from a windows service从 Windows 服务创建文件/文件夹时的最佳实践
【发布时间】:2012-10-16 12:57:42
【问题描述】:

我有一个以普通用户身份运行的用户界面。

用户界面通过 tcp/ip 与作为 Windows 服务运行的服务器组件进行通信。

服务作为本地系统运行。

我的问题是该服务在“ProgramData\MyApp”下创建了新文件夹。这些新创建的文件和文件夹无法由普通用户打开,因为它们是由“系统”创建的。

在设置过程中,目录“ProgramData\MyApp”的权限已经更改,因此每个人都拥有完全访问权限。但它不会被服务创建的子文件夹继承。

服务是否应该更改创建的文件和文件夹的权限?或者我可以准备“ProgramData\MyApp”文件夹让每个人都可以访问新创建的文件和文件夹吗?

已修复:我的问题是从临时目录复制了权限错误的文件。临时目录的权限已被继承...

【问题讨论】:

  • Windows 服务和用户界面应用程序是否在同一台计算机上运行?
  • @Benjamin Window 服务正在更新文件夹的权限。它可能会一次又一次地创建该文件夹。所以检查你的代码。 sourcedaddy.com/windows-xp/…
  • @StefanP.:是的,他们在同一台计算机上。因此我可以直接打开文件。无需通过 tcp 发送文件。尽管如此,这也是一种解决方法。 RPC是通过tcp完成的,文件传输是直接的。
  • @NipunAmbastha:该文件夹只创建一次。检查目录是否存在。但如果它不存在,服务会创建它。

标签: c# windows permissions windows-services


【解决方案1】:

如果您的 Windows 服务作为本地系统运行,您应该使用 impersonation 作为创建文件夹的代码的事件。这样调用该服务的用户将拥有文件夹和文件的完全权限。

如果您希望任何本地用户都可以访问该文件夹,您可以使用AddAccessRule,看看这里C# - Set Directory Permissions for All Users in Windows 7

【讨论】:

  • 好的,这至少与手动设置权限相同。我可以冒充一个等于“所有人”的帐户吗?我希望每个人都能阅读该文件。
  • “每个人”是指用户组?
  • 是的,我的软件确实将所有用户的所有必要内容保存在同一目录中。我根本不关心窗口用户权限:)(我知道这不是最佳实践)
【解决方案2】:

不要使用假冒。只需设置文件访问权限即可。

以下是目录示例:https://stackoverflow.com/a/5398398/70386(对文件同样适用)

MSDN:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-18
    • 2012-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多